<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title><![CDATA[SysGears - Custom Development]]></title><link href="http://www.sysgears.com/rss.xml" rel="self"/><link href="http://www.sysgears.com/"/><updated>2013-06-18T13:06:00+02:00</updated><id>http://www.sysgears.com</id><author><name><![CDATA[SysGears LLC]]></name><email><![CDATA[info@sysgears.com]]></email></author><generator uri="http://sysgears.com/">Grozy</generator><entry><title type="html"><![CDATA[Customizing scripts execution in Groovy Shell]]></title><link href="http://www.sysgears.com/articles/customizing-scripts-execution-in-groovyshell/"/><updated>2013-06-18T13:06:00+02:00</updated><id>http://www.sysgears.com/articles/customizing-scripts-execution-in-groovyshell/</id><content type="html"><![CDATA[<p>When Groovy has grown up to version 2, it has gained a lot of brand new features and improvements in areas of
productivity and security. Groovy now provides the ability to statically type check and statically
compile your Groovy code for robustness and performance. This is very useful when
you don't need Groovy's dynamic features, or simply want to speed up performance of your scripts.</p>
<!--more-->
<p>Let's say, you're invoking Groovy scripts via <em>GroovyShell</em> within your application.
You may want your scripts to be statically compiled in order to prevent any missing properties or methods passing
to runtime, or may just want to speed up your system. For such purpose, you can make your own extension for groovy
script files, and tell <em>GroovyShell</em> that you want it to statically compile all scripts with that extension.</p>
<p>Take a look at these lines of code:</p>
<p><figure class='code'><figcaption><span>StaticScript.sgroovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">Greeter</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// no methods</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">Greeter</span><span class="o">.</span><span class="na">metaClass</span><span class="o">.</span><span class="na">greet</span> <span class="o">=</span> <span class="o">{</span> <span class="n">String</span> <span class="n">name</span> <span class="o">-&gt;</span> <span class="n">println</span> <span class="s2">&quot;Hello $name!&quot;</span> <span class="o">}</span> <span class="c1">// will result in MultipleCompilationException</span>
</span><span class='line'><span class="kt">def</span> <span class="n">greeter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Greeter</span><span class="o">()</span>
</span><span class='line'><span class="n">greeter</span><span class="o">.</span><span class="na">greet</span><span class="o">(</span><span class="s1">&#39;John&#39;</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><figcaption><span>Main.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">...</span>
</span><span class='line'><span class="kt">def</span> <span class="n">compilerConfiguration</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CompilerConfiguration</span><span class="o">()</span>
</span><span class='line'><span class="n">CompilerCustomizationBuilder</span><span class="o">.</span><span class="na">withConfig</span><span class="o">(</span><span class="n">compilerConfiguration</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">source</span><span class="o">(</span><span class="nl">extensions:</span> <span class="o">[</span><span class="s1">&#39;sgroovy&#39;</span><span class="o">])</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">ast</span><span class="o">(</span><span class="n">CompileStatic</span><span class="o">)</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">compilerConfiguration</span><span class="o">.</span><span class="na">setScriptExtensions</span><span class="o">([</span><span class="s1">&#39;groovy&#39;</span><span class="o">,</span> <span class="s1">&#39;sgroovy&#39;</span><span class="o">]</span> <span class="k">as</span> <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;)</span>
</span><span class='line'><span class="kt">def</span> <span class="n">groovyShell</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GroovyShell</span><span class="o">(</span><span class="n">compilerConfiguration</span><span class="o">)</span>
</span><span class='line'><span class="o">...</span>
</span><span class='line'><span class="kt">def</span> <span class="n">script</span> <span class="o">=</span> <span class="n">groovyShell</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">scriptFile</span><span class="o">)</span> <span class="c1">// parsing script file StaticScript.sgroovy extension</span>
</span><span class='line'><span class="n">script</span><span class="o">.</span><span class="na">run</span><span class="o">()</span>  <span class="c1">// running script</span>
</span><span class='line'><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The following lines of code configure <em>GroovyShell's</em> behavior for files with *<em>.sgroovy</em> extension,
so that these scripts will be compiled statically. This means that when you run your scripts with
*<em>.sgroovy</em> extension using this modified GroovyShell – any undeclared variable, method or
<em>metaClass</em> extending, etc. will result in <em>MultipleCompilationException</em> at compilation time!</p>
<p>Sometimes you may want your executed scripts to have some predefined methods, properties,
classes or annotations. This can be done by creating an abstract class inherited from Script class.
Assume, you want your script to return <em>null</em> instead of throwing MissingProperty/MissingMethod
exception in situations when property or method doesn't exist. All you need is to set your custom
Script class as a script base superclass in <em>CompilerConfiguration</em> and then apply it to <em>GroovyShell</em>.</p>
<p>Here's an example of how you can achieve this:</p>
<p><figure class='code'><figcaption><span>CustomScript.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">script</span>
</span><span class='line'>
</span><span class='line'><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">CustomScript</span> <span class="kd">extends</span> <span class="n">Script</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// here can go any other stuff (properties, methods, classes, etc.)</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="nf">propertyMissing</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kc">null</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><figcaption><span>Main.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">...</span>
</span><span class='line'><span class="kt">def</span> <span class="n">compilerConfiguration</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CompilerConfiguration</span><span class="o">()</span>
</span><span class='line'><span class="n">compilerConfiguration</span><span class="o">.</span><span class="na">setScriptBaseClass</span><span class="o">(</span><span class="s1">&#39;org.sysgears.script.CustomScript&#39;</span><span class="o">)</span>
</span><span class='line'><span class="kt">def</span> <span class="n">groovyShell</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GroovyShell</span><span class="o">(</span><span class="n">compilerConfiguration</span><span class="o">)</span>
</span><span class='line'><span class="o">...</span>
</span><span class='line'><span class="n">Script</span> <span class="n">script</span> <span class="o">=</span> <span class="n">groovyShell</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">scriptFile</span><span class="o">)</span> <span class="c1">// scriptFile is a Script.groovy script</span>
</span><span class='line'><span class="n">script</span><span class="o">.</span><span class="na">run</span><span class="o">()</span>  <span class="c1">// running script</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><figcaption><span>Script.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">println</span> <span class="n">person</span> <span class="o">==</span> <span class="kc">null</span> <span class="c1">// prints true instead of throwing MissingPropertyException</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Besides these features, you can do even more: customize imports, secure AST
(allow/disallow closures creations, imports, package definition, definition of methods, etc.), and more.</p>
<p>Check out <a href="http://groovy.codehaus.org/Advanced+compiler+configuration">Groovy Official Documentation</a>
to stay in touch!</p>
<p>Cheers!<br  />
Aleksey Lisikh,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Association types in GORM]]></title><link href="http://www.sysgears.com/articles/association-types-in-gorm/"/><updated>2013-06-18T13:07:00+02:00</updated><id>http://www.sysgears.com/articles/association-types-in-gorm/</id><content type="html"><![CDATA[<p>GORM (Grails Object Relational Mapping) is a plugin integrated with Grails and based on Java ORM - Hibernate.
In this article, I'm going to describe how to make different kinds of associations in GORM.</p>
<!--more-->
<p><strong>One-to-many relationships</strong></p>
<p>Let's assume that there are two domain classes and you need to create one-to-many relationship from one domain to
another. For this purpose, you can use static <em>hasMany</em> property at the "one" side:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">articles:</span> <span class="n">Article</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Two things happens here:</p>
<ul>
<li>GORM creates a join table in the database: <img src="/images/posts/unidirectional-one-to-many-a72f03b483b42172d0aad88e62c40683.png"></li>
<li>Grails automatically injects <em>Set</em> of <em>Article</em>s into the <em>User</em> domain (you can refer to them by the <em>articles</em>
property)</li>
</ul>
<p>Relationship I've described defines cascade relationships between two classes, i.e. cascading behavior for saving and
updating. For example:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="n">User</span><span class="o">()</span>
</span><span class='line'><span class="kt">def</span> <span class="n">article</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Article</span><span class="o">()</span>
</span><span class='line'><span class="n">user</span><span class="o">.</span><span class="na">addToArticles</span><span class="o">(</span><span class="n">article</span><span class="o">)</span>
</span><span class='line'><span class="n">user</span><span class="o">.</span><span class="na">save</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>We've used dynamic <em>addToArticles</em> method to add created article to user. We did not save the article manually, but it
was saved by cascade. In spite of cascading behavior for saving and updating, this won't work for deleting. When you
delete a user, only relationships between the user and the articles will be removed, but not the articles themselves
(the records will be removed from the join table only). There are two ways to delete articles by cascade:</p>
<ol>
<li><p>Use <em>belongsTo</em> in the <em>Article</em> class:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">articles:</span> <span class="n">Article</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="n">User</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>	
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Configure cascading behavior of the association using the following <em>mapping</em>:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">articles:</span> <span class="n">Article</span><span class="o">]</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">articles</span> <span class="nl">cascade:</span> <span class="s1">&#39;all-delete-orphan&#39;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>	
</span></code></pre></td></tr></table></div></figure></p>
</li>
</ol>
<p>In both of these cases, GORM creates a join table as well, but now you may not worry about the user articles deleting,
because they will be deleted by cascade when you delete a user.</p>
<p><strong>Relationships direction</strong></p>
<p>Domains relationships can be either unidirectional or bidirectional. Have a look at the next example:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">articles:</span> <span class="n">Article</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="n">User</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This is a unidirectional relationship: you can get user's articles via the <em>articles</em> set, but you cannot refer to the
user from one of the articles. All the relationships in examples above are unidirectional. You can add back references
(i.e. properties linking back to the owner) in one of the following ways:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="o">[</span><span class="nl">user:</span> <span class="n">User</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'> <span class="nl">or:</span> 
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">User</span> <span class="n">user</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="n">User</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Both of these examples describes bidirectional relationships, so you can refer from one of the articles to its owner
through the <em>user</em> link. In this case, GORM will not create join table. The bidirectional relationship will be mapped
through a straight foreign key on the '<em>articles</em>' table: <img src="/images/posts/bidirectional-one-to-many-88aa33ea17fbc4a1c6a0979263b0c243.png"></p>
<p>Few examples of the referring to the <em>User</em>:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="n">User</span><span class="o">()</span>
</span><span class='line'><span class="kt">def</span> <span class="n">articles</span> <span class="o">=</span> <span class="o">[</span><span class="k">new</span> <span class="n">Article</span><span class="o">(),</span> <span class="k">new</span> <span class="n">Article</span><span class="o">()]</span>
</span><span class='line'><span class="n">articles</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span> <span class="n">article</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="na">addToArticles</span><span class="o">(</span><span class="n">article</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">user</span><span class="o">.</span><span class="na">save</span><span class="o">()</span>
</span><span class='line'><span class="k">assert</span> <span class="n">Article</span><span class="o">.</span><span class="na">countByUser</span><span class="o">(</span><span class="n">user</span><span class="o">),</span> <span class="mi">2</span> <span class="c1">// countByUser method can&#39;t be executed without the _user_ property in the _Article_</span>
</span><span class='line'><span class="kd">class</span>
</span><span class='line'><span class="nc">articles</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span><span class="n">article</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="k">assert</span> <span class="n">article</span><span class="o">.</span><span class="na">user</span><span class="o">.</span><span class="na">id</span><span class="o">,</span> <span class="n">user</span><span class="o">.</span><span class="na">id</span> <span class="c1">// true for both of articles</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><strong>One-to-one</strong></p>
<p>There are two ways of specifying one-to-one relationship:</p>
<ol>
<li><p>Add an <em>article</em> property and <em>unique</em> constraint to the <em>User</em> class:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Article</span> <span class="n">article</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">constraints</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">article</span><span class="o">(</span><span class="nl">unique:</span> <span class="kc">true</span><span class="o">)</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="o">[</span><span class="nl">user:</span> <span class="n">User</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>	
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Use <em>hasOne</em> property on the owning (<em>User</em>) side:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasOne</span> <span class="o">=</span> <span class="o">[</span><span class="nl">article:</span> <span class="n">Article</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Article</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="o">[</span><span class="nl">user:</span> <span class="n">User</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>	
</span></code></pre></td></tr></table></div></figure></p>
</li>
</ol>
<p><em>hasOne</em> works with bidirectional relationships only (you should have <em>belongsTo</em> with back reference to the <em>User</em>
class in the <em>Article</em> class). If it's missing, you'll get the following exception during project compilation:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">org</span><span class="o">.</span><span class="na">hibernate</span><span class="o">.</span><span class="na">MappingException</span><span class="o">:</span> <span class="n">hasOne</span> <span class="n">property</span> <span class="o">[</span><span class="n">User</span><span class="o">.</span><span class="na">article</span><span class="o">]</span> <span class="n">is</span> <span class="n">not</span> <span class="n">bidirectional</span><span class="o">.</span> <span class="n">Specify</span> <span class="n">the</span> <span class="n">other</span> <span class="n">side</span> <span class="n">of</span> <span class="n">the</span>
</span><span class='line'><span class="n">relationship</span><span class="o">!</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Note that the difference between those two cases is that GORM will put foreign key to the different tables:</p>
<ul>
<li><p>to the '<em>user</em>' table in the first case:
<img src="/images/posts/one-to-one-case-1-99afb545726b52bec87599c12c53d468.png"></p>
</li>
<li><p>to the '<em>article</em>' table in the second case:
<img src="/images/posts/one-to-one-case-2-03e9aaac138d476a776c99e70a4ed092.png"></p>
</li>
</ul>
<p><strong>Many-to-many</strong></p>
<p>Many-to-many relationships in Grails are specified by defining a <em>hasMany</em> on both sides of the relationship and having
a <em>belongsTo</em> on the owned side:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">Tag</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">belongsTo</span> <span class="o">=</span> <span class="n">Post</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">posts:</span> <span class="n">Post</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Post</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">tags:</span> <span class="n">Tag</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In this case, GORM will create the <em>post_tags</em> join table with the following columns: <em>post_id</em> and <em>tag_id</em>. These
fields are foreign keys. GORM will perform cascade saving and removing of relationships if you save / remove an object
of the <em>Post</em> domain class only, because it's the relationship owner. The following example may clarify:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">post</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Post</span><span class="o">()</span>
</span><span class='line'><span class="n">post</span><span class="o">.</span><span class="na">addToTags</span><span class="o">(</span><span class="k">new</span> <span class="n">Tag</span><span class="o">())</span>
</span><span class='line'><span class="n">post</span><span class="o">.</span><span class="na">addToTags</span><span class="o">(</span><span class="k">new</span> <span class="n">Tag</span><span class="o">())</span>
</span><span class='line'><span class="k">new</span> <span class="nf">Tag</span><span class="o">().</span><span class="na">addToPosts</span><span class="o">(</span><span class="n">post</span><span class="o">)</span>
</span><span class='line'><span class="n">post</span><span class="o">.</span><span class="na">save</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Here, three new tags were saved in the database by cascade. If you want to remove a <strong>tag</strong>, you need to remove its
relationships with posts first. But if you delete certain <strong>post</strong>, its relationships with tags will be removed from
the database automatically:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">tag</span> <span class="o">=</span> <span class="n">Tag</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span>
</span><span class='line'><span class="kt">def</span> <span class="n">posts</span> <span class="o">=</span> <span class="o">[]</span> <span class="o">+</span> <span class="n">tag</span><span class="o">.</span><span class="na">posts</span> <span class="o">?:</span> <span class="o">[]</span>
</span><span class='line'><span class="n">posts</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span> <span class="n">Post</span> <span class="n">post</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="n">post</span><span class="o">.</span><span class="na">removeFromTags</span><span class="o">(</span><span class="n">tag</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">tag</span><span class="o">.</span><span class="na">delete</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'><span class="n">Post</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1</span><span class="o">).</span><span class="na">delete</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>note: I have copied tag's posts to the new collection to avoid the <em>ConcurrentModificationException</em> exception.</p>
<p>Another way to create many-to-many relationship is manual join table mapping. All you need is:</p>
<ul>
<li>create the <em>PostTag</em> domain class with fields of <em>Post</em> and <em>Tag</em> classes and composite primary key</li>
<li>make the <em>PostTag</em> class serializable as it is a Hibernate composite primary key class</li>
<li>remove <em>hasMany</em> and <em>belongsTo</em> from the <em>Tag</em> and <em>Post</em> domains</li>
<li>map the <em>PostTag</em> class to existing '<em>post_tags</em>' table in case of you don't want to make current database changes</li>
</ul>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">PostTag</span> <span class="kd">implements</span> <span class="n">Serializable</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Post</span> <span class="n">post</span>
</span><span class='line'>    <span class="n">Tag</span> <span class="n">tag</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">id</span> <span class="nl">composite:</span> <span class="o">[</span><span class="s1">&#39;tag&#39;</span><span class="o">,</span> <span class="s1">&#39;post&#39;</span><span class="o">]</span>
</span><span class='line'>        <span class="n">table</span> <span class="s1">&#39;post_tags&#39;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In this case, you'll need to save and delete <em>PostTag</em> objects explicitly. Note that if you'll try to delete some post
or tag without deleting its relationships before, you'll get the <em>MySQLIntegrityConstraintViolationException</em>
exception and no object will be removed from the database:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">com</span><span class="o">.</span><span class="na">mysql</span><span class="o">.</span><span class="na">jdbc</span><span class="o">.</span><span class="na">exceptions</span><span class="o">.</span><span class="na">jdbc4</span><span class="o">.</span><span class="na">MySQLIntegrityConstraintViolationException</span><span class="o">:</span> <span class="n">Cannot</span> <span class="n">delete</span> <span class="n">or</span> <span class="n">update</span> <span class="n">a</span> <span class="n">parent</span> <span class="nl">row:</span>
</span><span class='line'><span class="n">a</span> <span class="n">foreign</span> <span class="n">key</span> <span class="n">constraint</span> <span class="nf">fails</span> <span class="o">(</span><span class="err">`</span><span class="n">gorm_db</span><span class="err">`</span><span class="o">.</span><span class="err">`</span><span class="n">post_tags</span><span class="err">`</span><span class="o">,</span> <span class="n">CONSTRAINT</span> <span class="err">`</span><span class="n">FK74F452DAF7BD8628</span><span class="err">`</span> <span class="n">FOREIGN</span> <span class="n">KEY</span> <span class="o">(</span><span class="err">`</span><span class="n">post_id</span><span class="err">`</span><span class="o">)</span> <span class="n">REFERENCES</span> <span class="err">`</span><span class="n">post</span><span class="err">`</span> <span class="o">(</span><span class="err">`</span><span class="n">id</span><span class="err">`</span><span class="o">))</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In order to get saved relationships, you can use standard Grails dynamic methods of the <em>PostTag</em> class (<em>find, findAll,
list</em>).</p>
<p>Dmitriy Drenkalyuk,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Groovy AST. Put method code into a closure.]]></title><link href="http://www.sysgears.com/notes/groovy-ast-put-method-code-into-a-closure/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/notes/groovy-ast-put-method-code-into-a-closure/</id><content type="html"><![CDATA[<p>The following code snippet shows how to use Groovy local AST transformation
to put method code into a closure and then pass it to your custom method.</p>
<!--more-->
<p>For instance:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="nf">foo</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// do something...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>will be transformed to:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="nf">foo</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">bar</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// do something...</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>where: <em>bar</em> -- the name of your custom method.</p>
<p>Here is the very simple implementation of this transformation:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">void</span> <span class="nf">visit</span><span class="o">(</span><span class="n">ASTNode</span><span class="o">[]</span> <span class="n">nodes</span><span class="o">,</span> <span class="n">SourceUnit</span> <span class="n">sourceUnit</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// put validation code here...</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">statement</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">code</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">shareVariables</span> <span class="o">=</span> <span class="o">{</span> <span class="n">variableScope</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="kt">def</span> <span class="n">scope</span> <span class="o">=</span> <span class="n">variableScope</span><span class="o">.</span><span class="na">copy</span><span class="o">()</span>
</span><span class='line'>        <span class="k">for</span> <span class="o">(</span><span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Variable</span><span class="o">&gt;</span> <span class="n">vars</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="na">referencedLocalVariablesIterator</span><span class="o">;</span> <span class="n">vars</span><span class="o">.</span><span class="na">hasNext</span><span class="o">();)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">Variable</span> <span class="n">var</span> <span class="o">=</span> <span class="n">vars</span><span class="o">.</span><span class="na">next</span><span class="o">()</span>
</span><span class='line'>            <span class="n">var</span><span class="o">.</span><span class="na">setClosureSharedVariable</span><span class="o">(</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="n">scope</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// create new block statement</span>
</span><span class='line'>    <span class="n">BlockStatement</span> <span class="n">block</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BlockStatement</span><span class="o">()</span>
</span><span class='line'>    <span class="n">block</span><span class="o">.</span><span class="na">variableScope</span> <span class="o">=</span> <span class="n">shareVariables</span><span class="o">(</span><span class="n">statement</span><span class="o">.</span><span class="na">variableScope</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// create closure expression, use code as an argument</span>
</span><span class='line'>    <span class="n">ClosureExpression</span> <span class="n">closure</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ClosureExpression</span><span class="o">(</span><span class="n">Parameter</span><span class="o">.</span><span class="na">EMPTY_ARRAY</span><span class="o">,</span> <span class="n">statement</span><span class="o">)</span>
</span><span class='line'>    <span class="n">closure</span><span class="o">.</span><span class="na">variableScope</span> <span class="o">=</span> <span class="n">statement</span><span class="o">.</span><span class="na">variableScope</span><span class="o">.</span><span class="na">copy</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// create method call expression, use the closure as an argument</span>
</span><span class='line'>    <span class="n">MethodCallExpression</span> <span class="n">methodCall</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MethodCallExpression</span><span class="o">(</span><span class="k">new</span> <span class="n">VariableExpression</span><span class="o">(</span><span class="s1">&#39;this&#39;</span><span class="o">),</span>
</span><span class='line'>               <span class="s1">&#39;your method name&#39;</span><span class="o">,</span> <span class="k">new</span> <span class="n">ArgumentListExpression</span><span class="o">(</span><span class="n">closure</span><span class="o">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// add method call to the block statement</span>
</span><span class='line'>    <span class="n">block</span><span class="o">.</span><span class="na">addStatement</span><span class="o">(</span><span class="k">new</span> <span class="n">ExpressionStatement</span><span class="o">(</span><span class="n">methodCall</span><span class="o">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">nodes</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">code</span> <span class="o">=</span> <span class="n">block</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Embedding recent Jetty in Groovy using Grape]]></title><link href="http://www.sysgears.com/articles/embedding-recent-jetty-in-groovy-using-grape/"/><updated>2013-06-14T10:02:00+02:00</updated><id>http://www.sysgears.com/articles/embedding-recent-jetty-in-groovy-using-grape/</id><content type="html"><![CDATA[<p>Several days ago I have a need to launch Groovlets on a web server.
I have decided to go with recent Jetty for this task, developed
by Eclipse Foundation at these days. It turned out to be non trivial
task, but at the end it all worked so I decided to share my experience
with you.</p>
<!--more-->
<p>The straightforward way to start recent stable Jetty version would be:</p>
<p><figure class='code'><figcaption><span>jetty_example_1.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">import</span> <span class="nn">org.eclipse.jetty.server.Server</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@Grab</span><span class="o">(</span><span class="s1">&#39;org.eclipse.jetty:jetty-server:8.1.8.v20121106&#39;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'><span class="kt">def</span> <span class="nf">startJetty</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">jetty</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Server</span><span class="o">(</span><span class="mi">9090</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">jetty</span><span class="o">.</span><span class="na">start</span><span class="o">()</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">println</span> <span class="s2">&quot;Starting Jetty, press Ctrl+C to stop.&quot;</span>
</span><span class='line'><span class="n">startJetty</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>After running this we will get the following result:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">RuntimeException</span><span class="o">:</span>
</span><span class='line'><span class="n">Error</span> <span class="n">grabbing</span> <span class="n">Grapes</span> <span class="o">--</span> <span class="o">[</span><span class="n">download</span> <span class="nl">failed:</span> <span class="n">org</span><span class="o">.</span><span class="na">eclipse</span><span class="o">.</span><span class="na">jetty</span><span class="o">.</span><span class="na">orbit</span><span class="err">#</span><span class="n">javax</span><span class="o">.</span><span class="na">servlet</span><span class="o">;</span><span class="mf">3.0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="na">v201112011016</span><span class="o">!</span><span class="n">javax</span><span class="o">.</span><span class="na">servlet</span><span class="o">.</span><span class="na">orbit</span><span class="o">]</span>
</span><span class='line'>    <span class="n">at</span> <span class="n">sun</span><span class="o">.</span><span class="na">reflect</span><span class="o">.</span><span class="na">NativeConstructorAccessorImpl</span><span class="o">.</span><span class="na">newInstance0</span><span class="o">(</span><span class="n">Native</span> <span class="n">Method</span><span class="o">)</span>
</span><span class='line'>    <span class="n">at</span> <span class="n">sun</span><span class="o">.</span><span class="na">reflect</span><span class="o">.</span><span class="na">NativeConstructorAccessorImpl</span><span class="o">.</span><span class="na">newInstance</span><span class="o">(</span><span class="n">NativeConstructorAccessorImpl</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">39</span><span class="o">)</span>
</span><span class='line'>    <span class="n">at</span> <span class="n">sun</span><span class="o">.</span><span class="na">reflect</span><span class="o">.</span><span class="na">DelegatingConstructorAccessorImpl</span><span class="o">.</span><span class="na">newInstance</span><span class="o">(</span><span class="n">DelegatingConstructorAccessorImpl</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">27</span><span class="o">)</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>    <span class="n">at</span> <span class="n">groovy</span><span class="o">.</span><span class="na">grape</span><span class="o">.</span><span class="na">GrapeIvy</span><span class="o">.</span><span class="na">getDependencies</span><span class="o">(</span><span class="n">GrapeIvy</span><span class="o">.</span><span class="na">groovy</span><span class="o">:</span><span class="mi">411</span><span class="o">)</span>
</span><span class='line'>    <span class="o">...</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>There is a well known problem with this Servlet 3.0 implementation by Eclipse.
To overcome it, we might try to use well known solution, e.g. specify that
packaging type of this artefact is jar and not orbit as specified in pom file.
To do this we need to disable transitive dependecy loading of jetty-server
and to download all of its dependencies manually:</p>
<p><figure class='code'><figcaption><span>jetty_example_2.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">import</span> <span class="nn">org.eclipse.jetty.server.Server</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.eclipse.jetty.servlet.*</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">groovy.servlet.*</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@Grapes</span><span class="o">([</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty.orbit&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;javax.servlet&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;3.0.0.v201112011016&#39;</span><span class="o">,</span> <span class="n">ext</span><span class="o">=</span><span class="s1">&#39;jar&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;jetty-server&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;8.1.8.v20121106&#39;</span><span class="o">,</span> <span class="n">transitive</span><span class="o">=</span><span class="kc">false</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;jetty-continuation&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;8.1.8.v20121106&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;jetty-http&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;8.1.8.v20121106&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;jetty-servlet&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;8.1.8.v20121106&#39;</span><span class="o">,</span> <span class="n">transitive</span><span class="o">=</span><span class="kc">false</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;jetty-security&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;8.1.8.v20121106&#39;</span><span class="o">,</span> <span class="n">transitive</span><span class="o">=</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'><span class="o">])</span>
</span><span class='line'>
</span><span class='line'><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This solution will work if you run it from command line, but if you will
run it from IntelliJ IDEA you might face the following issue:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">SecurityException</span><span class="o">:</span>
</span><span class='line'><span class="kd">class</span> <span class="err">&quot;</span><span class="nc">javax</span><span class="o">.</span><span class="na">servlet</span><span class="o">.</span><span class="na">ServletRegistration</span><span class="n">$Dynamic</span><span class="err">&quot;&#39;</span><span class="n">s</span> <span class="n">signer</span> <span class="n">information</span> <span class="n">does</span> <span class="n">not</span> <span class="n">match</span> <span class="n">signer</span> <span class="n">information</span> <span class="n">of</span> <span class="n">other</span> <span class="n">classes</span> <span class="k">in</span> <span class="n">the</span> <span class="n">same</span> <span class="kn">package</span>
</span><span class='line'>    <span class="n">at</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">ClassLoader</span><span class="o">.</span><span class="na">checkCerts</span><span class="o">(</span><span class="n">ClassLoader</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">806</span><span class="o">)</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>    <span class="n">at</span> <span class="n">com</span><span class="o">.</span><span class="na">intellij</span><span class="o">.</span><span class="na">rt</span><span class="o">.</span><span class="na">execution</span><span class="o">.</span><span class="na">CommandLineWrapper</span><span class="o">.</span><span class="na">main</span><span class="o">(</span><span class="n">CommandLineWrapper</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">108</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>One solution to defeat this problem is to use stock Servlet 3.0 implementation
provided by Oracle (in this case the Grab list can be simplified, because
we can use GrabExclude and transitive dependency resolution):
<figure class='code'><figcaption><span>jetty_example_3.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">import</span> <span class="nn">org.eclipse.jetty.server.Server</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.eclipse.jetty.servlet.*</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">groovy.servlet.*</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@Grapes</span><span class="o">([</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="s1">&#39;org.eclipse.jetty:jetty-server:8.1.8.v20121106&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="s1">&#39;org.eclipse.jetty:jetty-servlet:8.1.8.v20121106&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="s1">&#39;javax.servlet:javax.servlet-api:3.0.1&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@GrabExclude</span><span class="o">(</span><span class="s1">&#39;org.eclipse.jetty.orbit:javax.servlet&#39;</span><span class="o">)</span>
</span><span class='line'><span class="o">])</span>
</span><span class='line'>
</span><span class='line'><span class="kt">def</span> <span class="nf">startJetty</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">jetty</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Server</span><span class="o">(</span><span class="mi">9090</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">context</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ServletContextHandler</span><span class="o">(</span><span class="n">jetty</span><span class="o">,</span> <span class="s1">&#39;/&#39;</span><span class="o">,</span> <span class="n">ServletContextHandler</span><span class="o">.</span><span class="na">SESSIONS</span><span class="o">)</span>  <span class="c1">// Allow sessions.</span>
</span><span class='line'>    <span class="n">context</span><span class="o">.</span><span class="na">resourceBase</span> <span class="o">=</span> <span class="s1">&#39;.&#39;</span>  <span class="c1">// Look in current dir for Groovy scripts.</span>
</span><span class='line'>    <span class="n">context</span><span class="o">.</span><span class="na">addServlet</span><span class="o">(</span><span class="n">GroovyServlet</span><span class="o">,</span> <span class="s1">&#39;*.groovy&#39;</span><span class="o">)</span>  <span class="c1">// All files ending with .groovy will be served.</span>
</span><span class='line'>    <span class="n">context</span><span class="o">.</span><span class="na">setAttribute</span><span class="o">(</span><span class="s1">&#39;version&#39;</span><span class="o">,</span> <span class="s1">&#39;1.0&#39;</span><span class="o">)</span>  <span class="c1">// Set an context attribute.</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">jetty</span><span class="o">.</span><span class="na">start</span><span class="o">()</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">println</span> <span class="s2">&quot;Starting Jetty, press Ctrl+C to stop.&quot;</span>
</span><span class='line'><span class="n">startJetty</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This solution works fine in IntelliJ IDEA. You can create sample Groovlet
and place it to the same folder as the script above to test this server:
<figure class='code'><figcaption><span>example.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">println</span> <span class="s2">&quot;&quot;&quot;</span>
</span><span class='line'><span class="s2">&lt;html&gt;</span>
</span><span class='line'><span class="s2">    &lt;head&gt;</span>
</span><span class='line'><span class="s2">        &lt;title&gt;Example Groovy Servlet&lt;/title&gt;</span>
</span><span class='line'><span class="s2">    &lt;/head&gt;</span>
</span><span class='line'><span class="s2">    &lt;body&gt;</span>
</span><span class='line'><span class="s2">Hello from Groovy, ${request.remoteHost}: ${new Date()}</span>
</span><span class='line'><span class="s2">    &lt;/body&gt;</span>
</span><span class='line'><span class="s2">&lt;/html&gt;</span>
</span><span class='line'><span class="s2">&quot;&quot;&quot;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now if you open
<a href="http://localhost:9090/example.groovy">http://localhost:9090/example.groovy</a>
you should see the output of this Groovlet.
You don't need to relauch the script when you edit the code of Groovlet,
which is very nice.</p>
<p>To cut down the number of manual dependencies one can also use aggregate Jetty
jars:
<figure class='code'><figcaption><span>jetty_example_3.groovy</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@Grapes</span><span class="o">([</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;javax.servlet&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;javax.servlet-api&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;3.0.1&#39;</span><span class="o">),</span>
</span><span class='line'>    <span class="nd">@Grab</span><span class="o">(</span><span class="n">group</span><span class="o">=</span><span class="s1">&#39;org.eclipse.jetty.aggregate&#39;</span><span class="o">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">&#39;jetty-all-server&#39;</span><span class="o">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;8.1.8.v20121106&#39;</span><span class="o">,</span> <span class="n">transitive</span><span class="o">=</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'><span class="o">])</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Hope this helps,<br  />
Victor Vlasenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[How to deploy Grails (Tomcat 7) application to Cloud Foundry]]></title><link href="http://www.sysgears.com/notes/how-to-deploy-grails-tomcat-7-application-to-cloud-foundry/"/><updated>2013-06-03T09:09:00+02:00</updated><id>http://www.sysgears.com/notes/how-to-deploy-grails-tomcat-7-application-to-cloud-foundry/</id><content type="html"><![CDATA[<p>I had an issue with deploying my Grails project to Cloud Foundry with using cloudfoundry-grails-plugin.
My application was using Tomcat 7 unlike Cloud Foundry, which use Tomcat 6. In other words, to have a Grails application with Tomcat 7 run,
I had to deploy the entire Tomcat 7 directory, but before it should be slightly reconfigured.</p>
<!--more-->
<p>Here's a <a href="http://blog.cloudfoundry.org/2012/06/18/deploying-tomcat-7-using-the-standalone-framework/">link</a> with a great tutorial on how to get Tomcat 7 up and running on Cloud Foundry.</p>
<p>After doing those tricky steps, I had to configure mysql.</p>
<p>Cloud Foundry doesn't give you information about your available database services. Instead it has an environment variable named VCAP_SERVICES, which
contains all needed information on how to connect to them from your application. I.e. you have to teach your application how to connect to Cloud Foundry services.</p>
<p>I decided to create util class which would gather database configuration for me, and append it to DataSource.groovy, here it goes:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">CloudFoundryUtils</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">def</span> <span class="n">log</span> <span class="o">=</span> <span class="n">LogFactory</span><span class="o">.</span><span class="na">getLog</span><span class="o">(</span><span class="n">CloudFoundryUtils</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">ConfigObject</span> <span class="nf">getDataSource</span><span class="o">(</span><span class="n">Map</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">String</span> <span class="n">VCAP_SERVICES</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">getenv</span><span class="o">(</span><span class="s1">&#39;VCAP_SERVICES&#39;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="o">(!</span><span class="n">VCAP_SERVICES</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">log</span><span class="o">.</span><span class="na">error</span><span class="o">(</span><span class="s2">&quot;No environment variable VCAP_SERVICES present!&quot;</span><span class="o">)</span>
</span><span class='line'>      	    <span class="k">return</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kt">def</span> <span class="n">servicesConfig</span> <span class="o">=</span> <span class="n">JSON</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">VCAP_SERVICES</span><span class="o">)</span>
</span><span class='line'>        <span class="kt">def</span> <span class="n">mysqlConfig</span> <span class="o">=</span> <span class="n">servicesConfig</span><span class="o">.</span><span class="s2">&quot;${args.type}&quot;</span>
</span><span class='line'>        <span class="n">ConfigObject</span> <span class="n">dataSource</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConfigObject</span><span class="o">()</span>
</span><span class='line'>        <span class="kt">def</span> <span class="n">mysqlInstance</span> <span class="o">=</span> <span class="n">mysqlConfig</span><span class="o">.</span><span class="na">find</span> <span class="o">{</span> <span class="n">it</span><span class="o">.</span><span class="na">name</span> <span class="o">==</span> <span class="n">args</span><span class="o">.</span><span class="na">service</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kt">def</span> <span class="n">credentials</span> <span class="o">=</span> <span class="n">mysqlInstance</span><span class="o">.</span><span class="na">credentials</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">username</span> <span class="o">=</span> <span class="n">credentials</span><span class="o">.</span><span class="na">username</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">password</span> <span class="o">=</span> <span class="n">credentials</span><span class="o">.</span><span class="na">password</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="s2">&quot;jdbc:mysql://${credentials.host}:${credentials.port}&quot;</span> <span class="o">+</span>
</span><span class='line'>            <span class="s2">&quot;/${credentials.name}?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&quot;</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">driverClassName</span> <span class="o">=</span> <span class="s2">&quot;com.mysql.jdbc.Driver&quot;</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">removeAbandoned</span> <span class="o">=</span> <span class="kc">true</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">removeAbandonedTimeout</span> <span class="o">=</span> <span class="mi">300</span> <span class="c1">// 5 minutes</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">testOnBorrow</span> <span class="o">=</span> <span class="kc">true</span>
</span><span class='line'>        <span class="n">dataSource</span><span class="o">.</span><span class="na">validationQuery</span> <span class="o">=</span> <span class="s1">&#39;/* ping */ SELECT 1&#39;</span>
</span><span class='line'>        <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s2">&quot;Applied dataSource configuration to DataSource.groovy&quot;</span><span class="o">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">dataSource</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Call to util class from DataSource.groovy:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">cf</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">dataSource</span> <span class="o">=</span> <span class="n">CloudFoundryUtils</span><span class="o">.</span><span class="na">getDataSource</span><span class="o">(</span><span class="nl">service:</span> <span class="s1">&#39;mysql-opht&#39;</span><span class="o">,</span> <span class="nl">type:</span> <span class="s1">&#39;mysql-5.1&#39;</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>After doing the previous steps, you're done with configuring, but I've also written a script, which packages war file and copies it's content to tomcat/webapps/ROOT directory.
(this is optional, as you can 'war' your project and extract all packaged files to tomcat/webapps/ROOT manually):</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="cm">/** ExtractArtefact.groovy (script)</span>
</span><span class='line'><span class="cm">*	run: -Dgrails.env=cf extract-artefact</span>
</span><span class='line'><span class="cm">**/</span>
</span><span class='line'>
</span><span class='line'><span class="n">includeTargets</span> <span class="o">&lt;&lt;</span> <span class="n">grailsScript</span><span class="o">(</span><span class="s2">&quot;_GrailsWar&quot;</span><span class="o">)</span>
</span><span class='line'><span class="n">includeTargets</span> <span class="o">&lt;&lt;</span> <span class="n">grailsScript</span><span class="o">(</span><span class="s2">&quot;_GrailsEvents&quot;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">target</span><span class="o">(</span><span class="nl">extract:</span> <span class="s2">&quot;Copy war to tomcat directory and deploy to cloudfoundry&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">depends</span><span class="o">(</span><span class="n">war</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">metadata</span> <span class="o">=</span> <span class="n">grails</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Metadata</span><span class="o">.</span><span class="na">getCurrent</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">event</span><span class="o">(</span><span class="s2">&quot;StatusUpdate&quot;</span><span class="o">,</span> <span class="o">[</span><span class="s2">&quot;Cleaning deployment directory&quot;</span><span class="o">])</span>
</span><span class='line'>    <span class="n">ant</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="nl">dir:</span> <span class="s2">&quot;${basedir}/tomcat/webapps/ROOT&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="n">event</span><span class="o">(</span><span class="s2">&quot;StatusUpdate&quot;</span><span class="o">,</span> <span class="o">[</span><span class="s2">&quot;Extracting artefact to deploy directory&quot;</span><span class="o">])</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">src</span> <span class="o">=</span> <span class="s2">&quot;${basedir}/target/${metadata.&quot;</span><span class="n">app</span><span class="o">.</span><span class="na">name</span><span class="s2">&quot;}-${metadata.&quot;</span><span class="n">app</span><span class="o">.</span><span class="na">version</span><span class="s2">&quot;}.war&quot;</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">dest</span> <span class="o">=</span> <span class="s2">&quot;${basedir}/tomcat/webapps/ROOT&quot;</span>
</span><span class='line'>    <span class="n">ant</span><span class="o">.</span><span class="na">unwar</span><span class="o">(</span><span class="nl">src:</span> <span class="n">src</span><span class="o">,</span> <span class="nl">dest:</span> <span class="n">dest</span><span class="o">)</span>
</span><span class='line'>    <span class="n">event</span><span class="o">(</span><span class="s2">&quot;StatusFinal&quot;</span><span class="o">,</span> <span class="o">[</span><span class="s2">&quot;Successfully deployed to target directory&quot;</span><span class="o">])</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">setDefaultTarget</span><span class="o">(</span><span class="n">extract</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>My Tomcat settles in base directory of the project, but you can change the destination url to be an absolute path anywhere in your system.</p>
<p>When script is executed (or you had extracted content of war file to ROOT directory), the last and final step is to execute "vmc push" command from tomcat directory.</p>
<p>Hope this would be helpful!</p>
<p>Aleksey Lisikh,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Difference Between Testing, QA and QC]]></title><link href="http://www.sysgears.com/notes/difference-between-testing/"/><updated>2013-06-12T16:43:00+02:00</updated><id>http://www.sysgears.com/notes/difference-between-testing/</id><content type="html"><![CDATA[<ul>
<li><p>Do you think <em>'testing'</em> and <em>'quality assurance'</em> are the same things?</p>
</li>
<li><p>Do you know what's the difference between <em>Quality Assurance</em>, <em>Quality Control</em>, and <em>Testing</em>?</p>
</li>
</ul>
<!--more-->
<p>Sometimes these questions are not said, but terms <em>'testing'</em> and <em>'QA'</em> take places of each other and jumble begins.</p>
<p>Testers often name themselves (or are named) <em>QA engineers</em> - engineers that are specialized in quality. <em>QA engineers</em> perform many tasks that go into definition of 'testing activities'.</p>
<p>How can we thus confuse concepts which differ entirely in roles and responsibilities of <em>QA folk</em>?</p>
<p>So, let's dot one's i's and cross one's t's:</p>
<ul>
<li><p><em>Testing</em> is 'quality control'. <em>Testing</em> does not assure the quality, it's controlling it.</p>
</li>
<li><p><em>Quality Control (QC)</em> is measuring the quality of product. <em>QC</em> makes certain that the results of what you've done are what you expected.</p>
</li>
<li><p><em>Quality Assurance (QA)</em> is measuring and managing the quality of product creation process. <em>QA</em> inspects the process and makes certain you are doing the right things, the right way.</p>
</li>
</ul>
]]></content></entry><entry><title type="html"><![CDATA[Proper rendering of posts by tag and by author in Octopress]]></title><link href="http://www.sysgears.com/articles/how-to-make-proper-rendering-of-posts-by-tag-and-by-author-in-octopress/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/articles/how-to-make-proper-rendering-of-posts-by-tag-and-by-author-in-octopress/</id><content type="html"><![CDATA[<p>Octopress has generation of per tag index. By default it shows only
post title. This works okay, until the moment when you will want to
customize category_index.html and try to output some excerpt of post
content too. You will face the issue that post content renders incorrectly.
This is a problem in plugins/category_generator.rb plugin.</p>
<!--more-->
<p>The same problem exists in author_generator.rb plugin.</p>
<p>In both of these plugins one can find the code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">index</span> <span class="o">=</span> <span class="no">CategoryIndex</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span> <span class="nb">self</span><span class="o">.</span><span class="n">source</span><span class="p">,</span> <span class="n">category_dir</span><span class="p">,</span> <span class="n">category</span><span class="p">)</span>
</span><span class='line'><span class="n">index</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">layouts</span><span class="p">,</span> <span class="n">site_payload</span><span class="p">)</span>
</span><span class='line'><span class="n">index</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">dest</span><span class="p">)</span>
</span><span class='line'><span class="c1"># Record the fact that this page has been added, otherwise Site::cleanup will remove it.</span>
</span><span class='line'><span class="nb">self</span><span class="o">.</span><span class="n">pages</span> <span class="o">&lt;&lt;</span> <span class="n">index</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This code is wrong. The Jekyll engine suppose have different phases for page
generation, e.g.: reset, read, generate, render, cleanup and write. Each of
this phase is run across all the pages. But plugins for Jekyll are supposed
to only override generate phase. The rest of the phases should be done by the
Jekyll engine itself.</p>
<p>In the code above we see that plugin tries to make generate, render and write,
during generation phase, this is wrong. The plugin is supposed to do only
generate phase, the rest are done by Jekyll engine.</p>
<p>The bug fix is very simple, just remove or comment out all occurencies of the
lines below in category<em>generator.rb and author</em>generator.rb plugins.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">index</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">layouts</span><span class="p">,</span> <span class="n">site_payload</span><span class="p">)</span>
</span><span class='line'><span class="n">index</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">dest</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This will fix all the rendering issues.</p>
<p>Hope this helps,<br  />
Victor Vlasenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Checkout a specific revision with Git]]></title><link href="http://www.sysgears.com/notes/checkout-a-specific-revision-with-git/"/><updated>2013-06-12T16:44:00+02:00</updated><id>http://www.sysgears.com/notes/checkout-a-specific-revision-with-git/</id><content type="html"><![CDATA[<p>If you have a project and want to checkout specific revision (commit), you can do it as described below.</p>
<!--more-->
<p>1) Clone the project:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git clone https://github.com/&lt;organization&gt;/&lt;project&gt;.git
</span><span class='line'><span class="nv">$ </span><span class="nb">cd</span> &lt;project&gt;
</span></code></pre></td></tr></table></div></figure></p>
<p>2) Use the <em>git describe</em> command to get readable name for your commit.
The <em>git describe</em> will first look for a tag which tags exactly that commit. If an exact match was not found, <em>git describe</em> will walk back through the commit history to locate an ancestor commit which has been tagged. The ancestor’s tag will be output along with an abbreviation of the input committish’s SHA1. You can read more about this command <a href="http://schacon.github.com/git/git-describe.html">here</a>.</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git describe 5f6ba67e3f8cb59cb9a2f4db22f12e55326a182d
</span><span class='line'>kors-2757-g5f6ba67
</span></code></pre></td></tr></table></div></figure></p>
<p>3) Checkout the specified revision:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git checkout kors-2757-g5f6ba67
</span></code></pre></td></tr></table></div></figure></p>
<p>4) You can go back to the top with:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git checkout master
</span></code></pre></td></tr></table></div></figure></p>
<p>Dmitriy Drenkalyuk,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Upgrade ElasticSearch on Linux]]></title><link href="http://www.sysgears.com/notes/upgrade-elasticsearch-on-linux/"/><updated>2013-06-12T16:44:00+02:00</updated><id>http://www.sysgears.com/notes/upgrade-elasticsearch-on-linux/</id><content type="html"><![CDATA[<p>This guide describes how to upgrade ElasticSearch on Linux.</p>
<p><!--more--></p>
<p>1) Get the latest ElasticSearch release and move it to the <em>/opt</em> directory:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">cd</span> ~
</span><span class='line'><span class="nv">$ </span>wget http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz -O elasticsearch-0.20.2.tar.gz
</span><span class='line'><span class="nv">$ </span>tar -xf elasticsearch-0.20.2.tar.gz
</span><span class='line'><span class="nv">$ </span>rm elasticsearch-0.20.2.tar.gz
</span><span class='line'><span class="nv">$ </span>sudo mv elasticsearch-0.20.2 /opt
</span></code></pre></td></tr></table></div></figure></p>
<p>2) Get a service wrapper execution for ElasticSearch. This enables ElasticSearch to be installed and run as Unix daemon. You need to place the <em>service</em> directory to the <em>/opt/elasticsearch-0.20.2/bin</em>:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>curl -L https://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
</span><span class='line'><span class="nv">$ </span>mv *servicewrapper*/service /opt/elasticsearch-0.20.2/bin/
</span><span class='line'><span class="nv">$ </span>rm -Rf *servicewrapper*
</span></code></pre></td></tr></table></div></figure></p>
<p>3) Remove older version of ElasticSearch and install the newest one:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>/opt/elasticsearch-0.18.7/bin/service/elasticsearch remove
</span><span class='line'><span class="nv">$ </span>sudo /opt/elasticsearch-0.20.2/bin/service/elasticsearch install
</span><span class='line'><span class="nv">$ </span>sudo /etc/init.d/elasticsearch start
</span></code></pre></td></tr></table></div></figure></p>
<p>4) Check version:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>curl <span class="s1">&#39;http://localhost:9200&#39;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>You must see something like this:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="o">{</span>
</span><span class='line'>  <span class="s2">&quot;ok&quot;</span> : <span class="nb">true</span>,
</span><span class='line'>  <span class="s2">&quot;status&quot;</span> : 200,
</span><span class='line'>  <span class="s2">&quot;name&quot;</span> : <span class="s2">&quot;Max&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;version&quot;</span> : <span class="o">{</span>
</span><span class='line'>    <span class="s2">&quot;number&quot;</span> : <span class="s2">&quot;0.20.2&quot;</span>,
</span><span class='line'>    <span class="s2">&quot;snapshot_build&quot;</span> : <span class="nb">false</span>
</span><span class='line'>  <span class="o">}</span>,
</span><span class='line'>  <span class="s2">&quot;tagline&quot;</span> : <span class="s2">&quot;You Know, for Search&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>5) Upgrade elasticsearch-head plugin:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>/opt/elasticsearch-0.18.7/bin/plugin -remove mobz/elasticsearch-head
</span><span class='line'><span class="nv">$ </span>/opt/elasticsearch-0.20.2/bin/plugin -install mobz/elasticsearch-head
</span></code></pre></td></tr></table></div></figure></p>
<p>Enjoy!</p>
<p>Dmitriy Drenkalyuk,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Get total records count with GORM criteria]]></title><link href="http://www.sysgears.com/notes/get-total-records-count-with-gorm-criteria/"/><updated>2013-06-12T16:44:00+02:00</updated><id>http://www.sysgears.com/notes/get-total-records-count-with-gorm-criteria/</id><content type="html"><![CDATA[<p>Assume you have a page with pagination that displays some objects table (selected from DB with GORM criteria) in your Grails application.
If you want to know total number of possible results (as if there are no pagination parameters), you can do it in this way:</p>
<!--more-->
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">items</span> <span class="o">=</span> <span class="n">Item</span><span class="o">.</span><span class="na">createCriteria</span><span class="o">().</span><span class="na">list</span><span class="o">(</span><span class="nl">max:</span> <span class="mi">10</span><span class="o">,</span> <span class="nl">offset:</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="cm">/* criteria query */</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kt">def</span> <span class="n">totalRecords</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="na">totalCount</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>I.e., if you pass at least one parameter (<em>max, offset, sort, order</em>) to the criteria method, it returns results as <em>grails.orm.PagedResultList</em>, which has the <em>getTotalCount()</em> method.
In other cases (without pagination parameters, even if the <em>maxResults / firstResult</em> options are set inside the criteria query), it returns just <em>ArrayList</em>.</p>
<p>Dmitriy Drenkalyuk,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Native 0mq library version for akka-zeromq-2.0.x]]></title><link href="http://www.sysgears.com/notes/native-0mq-library-version-for-akka-zeromq-2-dot-0-x-extension/"/><updated>2013-06-03T09:09:00+02:00</updated><id>http://www.sysgears.com/notes/native-0mq-library-version-for-akka-zeromq-2-dot-0-x-extension/</id><content type="html"><![CDATA[<p>I had a chance to try akka-zeromq module last month in order to implement
solution for inter-service communication using Scala, Akka 2.0 and ZeroMQ.</p>
<!--more-->
<p>The module is built as extension to Akka and based on ZeroMQ bindings for Scala
that uses native ZeroMQ library through JNA. It's a pretty good one, but there
are no mention in Akka documentation of which version of the native library
must be installed to operate properly. Unfortunately, I've faced with the fact
that it was written on top of the old scala bindings, that supports only
ZeroMQ 2.x.
So, if you have the latest available library installed (which is 3.2.2 at the
moment) it will not work. You should roll back to the 2.x version of ZeroMQ
native library to be able to run your code using zeromq extension for Akka 2.0.</p>
<p>Cheers,</p>
<p>Oleg Yermolaiev,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Customizing the field widget of the Platform UI Grails plugin]]></title><link href="http://www.sysgears.com/articles/adding-additional-html-attributes-to-the-field-widget-of-the-platform-ui-grails-plugin/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/adding-additional-html-attributes-to-the-field-widget-of-the-platform-ui-grails-plugin/</id><content type="html"><![CDATA[<p>Our team is working on a Grails plugin now, which will have UI based on
Platform UI Grails plugin. Platform UI plugin allows you to easily configure
Grails applications look using different page markups(themes). It provides a
bunch of useful UI sets and allows the developers customize application look
easily by creating own UI sets and themes.</p>
<!--more-->
<p>Below I will show you an example of how to customize your UI easily using
this plugin.</p>
<!--more-->
<p>One of the Platform UI widgets you will use in your GSPs often is definitely
the ui:field tag. Let's have a look at how to use it:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;ui:field</span> <span class="na">bean=</span><span class="s">&quot;${user}&quot;</span> <span class="na">name=</span><span class="s">&quot;enabled&quot;</span> <span class="na">type=</span><span class="s">&quot;checkbox&quot;</span> <span class="na">checked=</span><span class="s">&quot;checked&quot;</span><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The above will produce an input element and, in addition, all the
functionality in it's wrapper we may possibly want. It will produce input's
label, errors, that could be discovered after the field is validated and the
help hints. Another really useful thing about this widget is that it allows
us to put custom label/input/errors/help hints in it, using related tags:
fieldInput, fieldLabel, fieldErrors, fieldHint. So, for example, if we
write the following:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;ui:field</span> <span class="na">name=</span><span class="s">&quot;${user}&quot;</span> <span class="na">name=</span><span class="s">&quot;enabled&quot;</span> <span class="na">type=</span><span class="s">&quot;checkbox&quot;</span> <span class="na">checked=</span><span class="s">&quot;checked&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ui:fieldLabel&gt;</span>Do you want this user to be enabled?<span class="nt">&lt;/ui:fieldLabel&gt;</span>
</span><span class='line'><span class="nt">&lt;/ui:field&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>the generated label will be ignored, and the one, found in the fieldLabel tag
body, will be used instead.<br  /></p>
<p>Ok, now, as we know about a lot of this widgets' goodness, we might be curious
to have a look at the produced output. The first thing you will notice is that
the checkbox is not checked, even though we have set "checked" attribute when
we called the widget. This happens because of the disadvantage of the default
implementation of the template, rendered by ui:input tag, used in the field
widget: when the input tag renders an input HTML element, it only renders a
hardcoded set of the HTML attributes, leaving additional ones behind, which
is obviously not good.<br  /></p>
<p>So now we should customize an <em>input.gsp template implementation: in our
plugin/application /grails-app/view directory we should create the following
folder structure: /grails-app/view/</em>ui/SomeCustomTheme
and place our implementation of the _input.gsp there. Ok, so as we see from the
input tag code snippet:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">args</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>	<span class="nl">attrs:</span><span class="n">attrs</span><span class="o">,</span> 
</span><span class='line'>	<span class="c1">// Some more arguments</span>
</span><span class='line'><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="n">out</span> <span class="o">&lt;&lt;</span> <span class="n">renderUITemplate</span><span class="o">(</span><span class="s1">&#39;input&#39;</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>all attributes we passed is being passed to the template in the attrs map
parameter. So what we gonna do, we gonna create our own tag that will take
additional attributes and create proper HTML input element. The code for it
will look like this:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">customAttrInput</span> <span class="o">=</span> <span class="o">{</span> <span class="n">attrs</span> <span class="o">-&gt;</span>
</span><span class='line'>
</span><span class='line'>        <span class="kt">def</span> <span class="n">additionalAttrs</span> <span class="o">=</span> <span class="o">[:]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Removing attributes we want to set in the input template code </span>
</span><span class='line'>        <span class="c1">// from the additional attributes</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">attrs</span><span class="o">.</span><span class="na">additionalAttrs</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="o">[</span><span class="s1">&#39;type&#39;</span><span class="o">,</span> <span class="s1">&#39;class&#39;</span><span class="o">,</span> <span class="s1">&#39;value&#39;</span><span class="o">,</span> <span class="s1">&#39;id&#39;</span><span class="o">,</span> <span class="s1">&#39;name&#39;</span><span class="o">].</span><span class="na">each</span> <span class="o">{</span> <span class="n">attrs</span><span class="o">.</span><span class="na">additionalAttrs</span><span class="o">.</span><span class="na">remove</span><span class="o">(</span><span class="n">it</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>            <span class="n">additionalAttrs</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="na">additionalAttrs</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Removing additional attributes from the whole attributes list.</span>
</span><span class='line'>        <span class="c1">// We just don&#39;t want them to appear in the resulting HTML</span>
</span><span class='line'>        <span class="n">attrs</span><span class="o">.</span><span class="na">remove</span><span class="o">(</span><span class="s1">&#39;additionalAttrs&#39;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">out</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;&lt;input&quot;</span> <span class="o">+</span> <span class="n">TagLibUtils</span><span class="o">.</span><span class="na">attrsToString</span><span class="o">(</span><span class="n">attrs</span><span class="o">)</span>
</span><span class='line'>            <span class="o">+</span> <span class="n">TagLibUtils</span><span class="o">.</span><span class="na">attrsToString</span><span class="o">(</span><span class="n">additionalAttrs</span><span class="o">)</span> <span class="o">+</span> <span class="s2">&quot;/&gt;&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And now, in the overriden _input.gsp, we should replace this</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;${id.encodeAsHTML()}&quot;</span> <span class="na">name=</span><span class="s">&quot;${name.encodeAsHTML()}&quot;</span>  
</span><span class='line'> <span class="na">class=</span><span class="s">&quot;${classes.encodeAsHTML()}&quot;</span> <span class="na">type=</span><span class="s">&quot;${type}&quot;</span>
</span><span class='line'> <span class="na">value=</span><span class="s">&quot;${value?.encodeAsHTML()}&quot;</span><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>with the following:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;uix:customAttrInput</span> <span class="na">id=</span><span class="s">&quot;${id.encodeAsHTML()}&quot;</span> <span class="na">name=</span><span class="s">&quot;${name.encodeAsHTML()}&quot;</span>  
</span><span class='line'> <span class="na">class=</span><span class="s">&quot;${classes.encodeAsHTML()}&quot;</span> <span class="na">type=</span><span class="s">&quot;${type}&quot;</span>
</span><span class='line'> <span class="na">value=</span><span class="s">&quot;${value?.encodeAsHTML()} additionalAttrs=&quot;</span><span class="err">${</span><span class="na">attrs</span><span class="err">}&quot;</span><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>and here we go: now our field widget is supporting additional HTML attributes
and we still use single line of code when adding new field to the GSP pages of
our application/plugin.</p>
<p>Hope this will be kinda helpful for the developers who are starting to play
with the Platform UI, so have fun!</p>
<p>Andrey Shevchenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Chat example on Grails and Websockets]]></title><link href="http://www.sysgears.com/notes/chat-example-on-grails-using-atmosphere-framework/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/notes/chat-example-on-grails-using-atmosphere-framework/</id><content type="html"><![CDATA[<p>Here is a simple chat application with rooms. It uses
<a href="http://www.grails.org/plugin/atmosphere">atmosphere plugin</a> with latest
version of <a href="https://github.com/Atmosphere/atmosphere">Atmosphere Framework</a> (1.1.0-SNAPSHOT at the moment).</p>
<!--more-->
<p>All sources are available on <a href="https://github.com/aka-mccloud/grails-atmosphere-example">github</a>.</p>
<p>Yura Ivanov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Edit Grails project configuration from within a plugin]]></title><link href="http://www.sysgears.com/notes/edit-grails-project-configuration-from-within-a-plugin/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/notes/edit-grails-project-configuration-from-within-a-plugin/</id><content type="html"><![CDATA[<p>Here is an example of editing project configuration from plugin's executable script.
The script copies configuration from default config file (which is placed in plugin’s
src/samples/conf directory) to the application's Config.groovy.</p>
<!--more-->
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">includeTargets</span> <span class="o">&lt;&lt;</span> <span class="n">grailsScript</span><span class="o">(</span><span class="s2">&quot;_GrailsInit&quot;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">target</span><span class="o">(</span><span class="nl">quickstart:</span> <span class="s1">&#39;Configures project to use [your plugin name] Plugin&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">configFile</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s2">&quot;${basedir}/grails-app/conf/&quot;</span><span class="o">,</span> <span class="s1">&#39;Config.groovy&#39;</span><span class="o">)</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">defaultConfigFile</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s2">&quot;${[your plugin name]PluginDir}/src/samples/&quot;</span><span class="o">,</span> <span class="s1">&#39;conf/DefaultConfig.groovy&#39;</span><span class="o">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">configFile</span><span class="o">.</span><span class="na">exists</span><span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="n">defaultConfigFile</span><span class="o">.</span><span class="na">exists</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">defaultConfigFile</span><span class="o">.</span><span class="na">eachLine</span> <span class="o">{</span> <span class="n">line</span> <span class="o">-&gt;</span>
</span><span class='line'>           <span class="n">configFile</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s2">&quot;\n${line}&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>       <span class="n">println</span> <span class="s1">&#39;* Your grails-app/conf/Config.groovy has been updated.&#39;</span>
</span><span class='line'>    <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">println</span> <span class="s1">&#39;* Cannot update grails-app/conf/Config.groovy.&#39;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">setDefaultTarget</span><span class="o">(</span><span class="n">quickstart</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Unit testing web flow in Grails]]></title><link href="http://www.sysgears.com/notes/unit-testing-web-flow/"/><updated>2013-06-03T09:09:00+02:00</updated><id>http://www.sysgears.com/notes/unit-testing-web-flow/</id><content type="html"><![CDATA[<p>I've faced a problem with unit testing web flow controllers</p>
<p>There's an existings WebFlowUnitTestMixin for unit testing webflow in GDK,
but no word on how to use it in the latest Grails 2.2.0 official documentation.</p>
<!--more-->
<p>I've used spock framework for my web flow controller unit test. Here is a pretty simple example:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="cm">/* SignUpControllerSpec.groovy */</span>
</span><span class='line'><span class="nd">@TestMixin</span><span class="o">(</span><span class="n">WebFlowUnitTestMixin</span><span class="o">)</span>
</span><span class='line'><span class="nd">@TestFor</span><span class="o">(</span><span class="n">SignUpController</span><span class="o">)</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">SignUpControllerSpec</span> <span class="kd">extends</span> <span class="n">Specification</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="s2">&quot;test empty signup form submission&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nl">when:</span> <span class="s2">&quot;user loads page with registration form&quot;</span>
</span><span class='line'>            <span class="n">registerFlow</span><span class="o">.</span><span class="na">start</span><span class="o">.</span><span class="na">action</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="nl">then:</span> <span class="s2">&quot;empty userCommand object is created and lastEvent is start&quot;</span>
</span><span class='line'>            <span class="n">lastEventName</span> <span class="o">==</span> <span class="s1">&#39;start&#39;</span>
</span><span class='line'>            <span class="n">flow</span><span class="o">.</span><span class="na">userCommand</span> <span class="k">instanceof</span> <span class="n">UserCommand</span>
</span><span class='line'>
</span><span class='line'>        <span class="nl">when:</span> <span class="s2">&quot;user submits the form with empty lines&quot;</span>
</span><span class='line'>            <span class="n">registerFlow</span><span class="o">.</span><span class="na">signUp</span><span class="o">.</span><span class="na">on</span><span class="o">.</span><span class="na">submit</span><span class="o">.</span><span class="na">action</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="nl">then:</span> <span class="s2">&quot;userCommand with errors is returned&quot;</span>
</span><span class='line'>            <span class="n">flow</span><span class="o">.</span><span class="na">userCommand</span><span class="o">.</span><span class="na">hasErrors</span><span class="o">()</span>
</span><span class='line'>            <span class="n">lastEventName</span> <span class="o">==</span> <span class="s1">&#39;signUp&#39;</span>
</span><span class='line'>            <span class="n">lastTransitionName</span> <span class="o">==</span> <span class="s1">&#39;submit&#39;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/* SignUpController.groovy */</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">SignUpController</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">userService</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">registerFlow</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">start</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">action</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">flow</span><span class="o">.</span><span class="na">userCommand</span> <span class="o">=</span> <span class="k">new</span> <span class="n">UserCommand</span><span class="o">()</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">on</span><span class="o">(</span><span class="s1">&#39;success&#39;</span><span class="o">).</span><span class="na">to</span><span class="o">(</span><span class="s1">&#39;signUp&#39;</span><span class="o">)</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">signUp</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">on</span><span class="o">(</span><span class="s1">&#39;submit&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">bindData</span><span class="o">(</span><span class="n">flow</span><span class="o">.</span><span class="na">userCommand</span><span class="o">,</span> <span class="n">params</span><span class="o">)</span>
</span><span class='line'>                <span class="kt">def</span> <span class="n">cmd</span> <span class="o">=</span> <span class="n">flow</span><span class="o">.</span><span class="na">userCommand</span>
</span><span class='line'>                <span class="k">if</span> <span class="o">(!</span><span class="n">cmd</span><span class="o">.</span><span class="na">validate</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>                    <span class="k">return</span> <span class="nf">error</span><span class="o">()</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// TODO: process valid userCommand</span>
</span><span class='line'>
</span><span class='line'>            <span class="o">}.</span><span class="na">to</span><span class="o">(</span><span class="s1">&#39;end&#39;</span><span class="o">)</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">end</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">redirect</span><span class="o">(</span><span class="nl">uri:</span> <span class="s1">&#39;/&#39;</span><span class="o">)</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>All of the default unit test controller properties are available + flow, conversation, lastTransitionName,
lastEventName, currentEvent</p>
<p>Have fun!</p>
<p>Aleksey Lisikh,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[How to create remote git branch in IntelliJ IDEA]]></title><link href="http://www.sysgears.com/notes/how-to-create-remote-git-branch-in-intellij-idea/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/notes/how-to-create-remote-git-branch-in-intellij-idea/</id><content type="html"><![CDATA[<p>To create remote Git branch in IntelliJ idea one should:</p>
<!--more-->
<ol>
<li>Commit and push all your changes first</li>
<li>Create local branch by going to VCS -> Git -> Branches -> New Branch.
You can see your local and remote branches in this menu too, as well as
current active branch.</li>
<li>After you created local branch to make it remote you need to do
VCS -> Git -> Push, set bottom checkbox
"Push current branch to alternative branch", specify your new branch
(should be already there) and click "Push".</li>
</ol>
<p>Victor Vlasenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Hosting StackMob HTML5 application on Apache Web Server]]></title><link href="http://www.sysgears.com/articles/hosting-stackmob-html5-application-on-apache-web-server/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/hosting-stackmob-html5-application-on-apache-web-server/</id><content type="html"><![CDATA[<p>Our team had a task to develop complex application for StackMob. During
the development we have faced a need to host HTML5 application on our
internal server to increase productivity of our QA department. This article
explains how one can host HTML5 application on any server running Apache2,
provided you have full control on the Apache modules and configuration.</p>
<!--more-->
<p>StackMob is a backend as a service provider to help developers create mobile
applications. StackMob aims at handling a lot of boilerplate that is often
needed in web apps like user logins, facebook integration, database access
via REST, etc.</p>
<p>StackMob is rather new on the scene and we have faced an issue with HTML5
hosting being down at times for our applications during the last month.
So we had to seek good work around to continue our development.</p>
<p>One of the possible work arounds is to use provided stackmobserver.py to launch
HTML5 on our own server and let QA team access it. The problem with this solution
is that stackmobserver.py is ultimate single-threaded and hence it becomes very
sluggish to unusable degeree even on a slight load.</p>
<p>Because stackmobserver.py is unusable for multi-user usage, we decided to learn
what stackmobserver.py does and configure Apache2 web server accordingly. This
was a bit tricky. But after a while we have succeeded. Here is a pretty
self-explaining working Apache2 web site definition for StackMob HTML5
application:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;VirtualHost</span> <span class="err">*</span><span class="na">:80</span><span class="nt">&gt;</span>
</span><span class='line'>    ServerName myapp.myserver.com
</span><span class='line'>
</span><span class='line'>    DocumentRoot /var/www/myapp
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;Directory</span> <span class="err">/</span><span class="na">var</span><span class="err">/</span><span class="na">www</span><span class="err">/</span><span class="na">myapp</span><span class="nt">&gt;</span>
</span><span class='line'>        Options Indexes
</span><span class='line'>        Order allow,deny
</span><span class='line'>        Allow from all
</span><span class='line'>    <span class="nt">&lt;/Directory&gt;</span>
</span><span class='line'>
</span><span class='line'>    ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
</span><span class='line'>
</span><span class='line'>    # Possible values include: debug, info, notice, warn, error, crit,
</span><span class='line'>    # alert, emerg.
</span><span class='line'>    LogLevel warn
</span><span class='line'>
</span><span class='line'>    CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
</span><span class='line'>
</span><span class='line'>    # Don&#39;t proxy static files of HTML5 application to StackMob
</span><span class='line'>    ProxyPass        /static !
</span><span class='line'>
</span><span class='line'>    # Proxy the rest of URLs of HTML5 application to StackMob
</span><span class='line'>    ProxyPass/ http://api.stackmob.com/
</span><span class='line'>    ProxyPassReverse/ http://api.stackmob.com/
</span><span class='line'>
</span><span class='line'>    RewriteEngine on
</span><span class='line'>
</span><span class='line'>    # Set X-STACKMOB-FORWARDED-HOST to be the host from the URL
</span><span class='line'>    RewriteRule .* - [E=INFO_HTTP_HOST:%{HTTP_HOST},NE]
</span><span class='line'>    Header add X-STACKMOB-FORWARDED-HOST &quot;%{INFO_HTTP_HOST}e&quot;
</span><span class='line'>    RequestHeader set X-STACKMOB-FORWARDED-HOST &quot;%{INFO_HTTP_HOST}e&quot;
</span><span class='line'>
</span><span class='line'>    # Set X-STACKMOB-FORWARDED-PORT to be the host from the URL
</span><span class='line'>    RewriteRule .* - [E=INFO_SERVER_PORT:%{SERVER_PORT},NE]
</span><span class='line'>    Header add X-STACKMOB-FORWARDED-PORT &quot;%{INFO_SERVER_PORT}e&quot;
</span><span class='line'>    RequestHeader set X-STACKMOB-FORWARDED-PORT &quot;%{INFO_SERVER_PORT}e&quot;
</span><span class='line'>
</span><span class='line'>    # Set X-FORWARDED-PROTO the same way it is done by stackmobserver.py
</span><span class='line'>    Header add X-FORWARDED-PROTO &quot;HTTP&quot;
</span><span class='line'>    RequestHeader set X-FORWARDED-PROTO &quot;HTTP&quot;
</span><span class='line'>
</span><span class='line'>    # Set VERSION the same way it is done by stackmobserver.py
</span><span class='line'>    Header add VERSION &quot;HTTP/1.1&quot;
</span><span class='line'>    RequestHeader set VERSION &quot;HTTP/1.1&quot;
</span><span class='line'><span class="nt">&lt;/VirtualHost&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>For this config to work for your application the HTML5/JS files of the
application need to be in some subfolder, in this example the subfolder is
"static". All the requests that have the form of http://myapp.myserver.com/static
will not be proxied to StackMob. All the rest of requests will be proxied to
StackMob with correct headers set. Also, you need to enable mod<em>rewrite,
mod</em>proxy and mod_headers for your Apache2 web server.</p>
<p>Hope this helps,<br  />
Andrey Shevchenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Happy New Year 2013]]></title><link href="http://www.sysgears.com/articles/happy-new-year-2013/"/><updated>2013-06-17T10:42:00+02:00</updated><id>http://www.sysgears.com/articles/happy-new-year-2013/</id><content type="html"><![CDATA[<p><strong>Dear friends and colleagues!</strong></p>
<p>May the New Year become the year of hope, joy, desire bold and wise decisions!</p>
<!--more-->
<p>Last year was different for everyone. But the most important thing is that our cooperation has been effective. For our company, it is particularly valuable.</p>
<p>We want to wish you immense happiness, excellent health, unlimited success, loyal and good friends!</p>
<p>Let the new year bring a favorable change, successes in business and each day will be good, productive and happy!</p>
<p><img width="700" height="400" src="/images/posts/new_year_on_the_forest-96007ade02e861ed27ef28334efadca2.jpg"></p>
]]></content></entry><entry><title type="html"><![CDATA[Regression Testing]]></title><link href="http://www.sysgears.com/articles/regression-testing/"/><updated>2013-06-12T16:43:00+02:00</updated><id>http://www.sysgears.com/articles/regression-testing/</id><content type="html"><![CDATA[<p>Regression testing is one of the most frequently used objectives of
testing. It focuses on the application retesting after changes are
implemented. That changes can be local, - like new features or
bug-fixes, or global, - like new business logic implementation.<br  /></p>
<!--more-->
<p>Software must be checked for bugs every time the changes are applied,
and regression testing is intended to make sure that the new version of
the software is as stable as the previous one. The part of errors that
occur after the code was changed is more likely to be from 50% to 80% of
all errors that are discovered. Regression testing reduces two risks:</p>
<ul>
<li>a change that was intended to fix a bug failed;</li>
<li>a change had a side effect, as a result a new bug was discovered or
an old one appeared.</li>
</ul>
<h2>Types of Regression Tests</h2>
<p>Regression testing combines different testing methods that have one
common trait: tests are executed in regression manner. That is why the
term “regression testing” may contextually mean:</p>
<ul>
<li><strong>Verification test</strong> that consists from build verification test and
bug verification test:<br  />
- <em>Build verification test</em>(build acceptance test, quick
check, smoke test) -  is a small set of functionality tests that are
intended to check general product features, this test is executed on
each new build.<br  />
- <em>Bug verification test</em> - re-executes the failed test cases to
check that the bugs were fixed.</li>
<li><strong>Old fix regression test </strong>- validates the “verified” (fixed) bugs.
This test is intended to cover the possibility that the new bug-fix
affects the old ones or a developer mistakenly broke an old bug-fix.</li>
<li><strong>General functional regression testing</strong> - verifies that new
functionality or code changes do not destabilize or regress the code. QA
specialists should retest the project including the parts that worked in
previous versions.</li>
<li><strong>Port or conversion testing</strong> - checks that the program works
correctly after porting to another platform</li>
<li><strong>Configuration testing</strong> - validates that the program code runs
correctly on a new version of the operation system or with a new device
or in combination with a new application. Configuration testing and
conversion testing are very much alike, the difference is that the
program code is not changed.</li>
<li><strong>Localization testing</strong> - verifies that the software interface is
readable and understandable for the people who speak other languages
and/or have different set of cultural rules. Localization testing can
involve the modified test cases, and the test cases that  were written
just for this purpose. New localization test cases may become regression
test cases if it is required.</li>
</ul>
<h2>Regression Testing Strategy or Effective Regression Testing</h2>
<p>Testing process must be completed in a very compressed time frame. There
are some recommendations how to set the testing priorities and gain the
most effective results:</p>
<ol>
<li>Start regression testing from build verification test.</li>
<li>Verify the installation process if the application requires it.</li>
<li>Execute a short test of main and new functionality.</li>
<li>Run bug verification test to check that new bugs were fixed.</li>
<li>Run general function regression tests of the parts of the system that
were changed. This testing is implementing over test cases that had
status “passed” during previous test run.</li>
<li>Run old fix regression tests over the changed parts of the system to
check the old bug-fixes.</li>
<li>Run the tests that were passed twice (they are marked as “closed”) if
there are any changes in the code.</li>
</ol>
<p>The last regression test of an application before its acceptance testing
or release is called final regression test. Final regression test
verifies the most complicated parts of the system. The recommended order
of the final regression testing is:</p>
<ol>
<li>Run the test cases that were failed more than 2 times, including the
test cases that were sent for rework;</li>
<li>Run the test cases that were failed once and then passed;</li>
<li>Run the test cases that was passed only once and were never executed
again;</li>
<li>Run all other test cases that are included into the testing plan.</li>
</ol>
<h2>Benefits of Automated Regression Testing</h2>
<p>Usually regression tests are not changed greatly from version to version
and can be automated. It is recommended to automate the main use cases,
if the regression testing is executed more than 3-5 times.</p>
<p><em>The “pros” for tests automation are:</em></p>
<ul>
<li>automated tests increase testing speed without influence on a general
testing process;</li>
<li>automated tests save human and time resources, because the scripts
are coded once and can be executed as long as the tests remain relevant;</li>
<li>automated tests are clear and transparent, all the tests are
formalized because of written scenarios;</li>
<li>automated tests can be scheduled and executed without human control,
test results are available anytime to anyone who is interested in.</li>
</ul>
<p><em>The “cons” for automation testing are:</em></p>
<ul>
<li>automated tests must remain up to date to be effective;</li>
<li>some errors cannot be discovered by automated tests;</li>
<li>automated tests can not define exact error, just display that some
scripts are failed.</li>
</ul>
<p>There are lots of automation tools and development teams may select the
ones they like.</p>
<h2>The Advantages of Regression Testing</h2>
<p>Regression testing is important part of the development and effective
way of support, because it helps to:</p>
<ul>
<li>reduce 50-80% of defects that were caused by the code changes
intended to fix a bug or create a new feature;</li>
<li>keep documentation up to date: description of test cases, test
results, software specification;</li>
<li>support the stable functioning of the system and the clients’
confidence in the software quality;</li>
<li>reduce the costs of technical support by decreasing the number of
emergency situations during the commercial operation.</li>
</ul>
<p>Ekaterina Gladkova,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[How to create your own Grails portlet for Liferay?]]></title><link href="http://www.sysgears.com/articles/how-create-your-own-grails-portlet-liferay/"/><updated>2013-05-21T09:34:00+02:00</updated><id>http://www.sysgears.com/articles/how-create-your-own-grails-portlet-liferay/</id><content type="html"><![CDATA[<p>Portlets are pluggable user interface software components that are
managed and displayed in a web portal. They produce fragments of markup
code that are aggregated into a portal.<br  />
There are two specifications of portlets exist nowadays, they are
JSR-168 (Java Portlet Api) and JSR-286 (Java Portlet Api 2.0).</p>
<!--more-->
<p>Liferay is an opensource portal bundled with different servlet
containers, such as Tomcat, Jetty, Geronimo, JBoss, etc. As it is
opensource it has a reach variaty of opensource portlets for every life
situation. To deploy your own one, you need Liferay portal installed. I
used Liferay bundled with Tomcat of version 6.1.0 and Grails 2.0.4.</p>
<p>Documentation for Liferay Portal can be found at
<a href="http://www.liferay.com">http://www.liferay.com</a>.
However, provided docs are not very good in my opinion.</p>
<p>Let's create our own portlet for Liferay portal. You can create more
than one portlet within your Grails application, what's very good, and
actually it’s very easy to implement portlets in Groovy way, so let's
keep going!<br  /></p>
<p>We need two great plugins installed, called portlets and
portlets-liferay:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>grails install-plugin portlets
</span><span class='line'>grails install-plugin portlets-liferay
</span></code></pre></td></tr></table></div></figure></p>
<p>Documentation for these plugins also available at Grails site, to which
you can refer at any time and place.</p>
<p>To create portlet application we need to generate portlet class which
will contain specific Liferay configurations and portlet actions needed
for portlet to work. This can be done by executing a Grails command:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>grails create-portlet &lt;package&gt;.&lt;portlet_name&gt;
</span></code></pre></td></tr></table></div></figure></p>
<p>* Note that this command will automaticaly add 'Portlet' keyword to the
end of '<portlet_name>'.</p>
<p>You've just created a portlet class, great.</p>
<p>Portlet.groovy file will be generated in /grails-app/portlets directory.
<font face="Times New Roman" size="3"> </font>Here how it would look
like:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">import</span> <span class="nn">javax.portlet.*</span>
</span><span class='line'><span class="kd">class</span> <span class="err">&lt;</span><span class="nc">portlet_name</span><span class="o">&gt;</span><span class="n">Portlet</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'> <span class="kt">def</span> <span class="n">title</span> <span class="o">=</span> <span class="s1">&#39;Portlet Title&#39;</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">description</span> <span class="o">=</span> <span class="s1">&#39;&#39;&#39;</span>
</span><span class='line'><span class="s1">Description about the portlet goes here.</span>
</span><span class='line'><span class="s1">&#39;&#39;&#39;</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">displayName</span> <span class="o">=</span> <span class="s1">&#39;Display Name&#39;</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">supports</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;text/html&#39;</span><span class="o">:[</span><span class="s1">&#39;view&#39;</span><span class="o">,</span> <span class="s1">&#39;edit&#39;</span><span class="o">,</span> <span class="s1">&#39;help&#39;</span><span class="o">]]</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// DEFINITIONS FOR liferay-display.xml</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">liferay_display_category</span> <span class="o">=</span> <span class="s1">&#39;MyCategory&#39;</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// DEFINITIONS FOR liferay-portlets.xml</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">liferay_portlet_ajaxable</span> <span class="o">=</span> <span class="s1">&#39;true&#39;</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">liferay_portlet_header_portlet_css</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>         <span class="s1">&#39;/css/protoFlow.css&#39;</span>
</span><span class='line'> <span class="o">]</span>
</span><span class='line'> <span class="kt">def</span> <span class="n">liferay_portlet_header_portlet_javascript</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>         <span class="s1">&#39;/plugins/richui-0.5/js/flow/lib/prototype.js&#39;</span><span class="o">,</span>
</span><span class='line'>         <span class="s1">&#39;/plugins/richui-0.5/js/flow/lib/scriptaculous.js&#39;</span><span class="o">,</span>
</span><span class='line'>         <span class="s1">&#39;/plugins/richui-0.5/js/reflection/reflection.js&#39;</span><span class="o">,</span>
</span><span class='line'>         <span class="s1">&#39;/plugins/richui-0.5/js/flow/protoFlow.js&#39;</span>
</span><span class='line'> <span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Portlets-liferay plugin for Grails reads configuration from
Config.groovy and Portlet.groovy files and then generates all needed
Liferay xmls and property files in grails-app/web-app/WEB-INF directory.</p>
<p>In your portlet class you can define title of portlet, display name,
description of this portlet, header JavaScript and CSS files references,
etc.<br  />
In Config.groovy file you can specify role-mapper and custom user
attributes, like I did:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">liferay</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">portlet_role_mappers</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;administrator&#39;</span><span class="o">:</span><span class="s1">&#39;Administrator&#39;</span><span class="o">,</span> <span class="s1">&#39;guest&#39;</span><span class="o">:</span><span class="s1">&#39;Guest&#39;</span><span class="o">]</span>
</span><span class='line'>   <span class="c1">//portlet_custom_user_attributes = [&#39;foo&#39;:&#39;com.example.bar.Baz&#39;]</span>
</span><span class='line'>   <span class="n">plugin_package</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;${appName}&quot;</span>
</span><span class='line'>       <span class="n">module_group_id</span> <span class="o">=</span> <span class="s1">&#39;MyModule&#39;</span>
</span><span class='line'>       <span class="n">module_incremental_version</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
</span><span class='line'>       <span class="n">tags</span><span class="o">=</span><span class="s1">&#39;sample&#39;</span>
</span><span class='line'>       <span class="n">short_description</span><span class="o">=</span><span class="s1">&#39;Hey, this is a car portlet, dude!&#39;</span>
</span><span class='line'>       <span class="n">change_log</span><span class="o">=</span><span class="s1">&#39;&#39;</span>
</span><span class='line'>       <span class="n">page_uri</span><span class="o">=</span><span class="s1">&#39;&#39;</span>
</span><span class='line'>       <span class="n">author</span><span class="o">=</span><span class="s1">&#39;Aleksey Lisikh&#39;</span>
</span><span class='line'>       <span class="n">license</span><span class="o">=</span><span class="s1">&#39;Proprietary&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Available Liferay roles can be found at "Control panel → Roles".</p>
<p>Freshly generated portlet class has some demonstrating closures that
render demo views, but we don't have any views yet. Ok, let's generate
some of them:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>grails generate-portlet-views &lt;package&gt;.&lt;portlet_name&gt;
</span></code></pre></td></tr></table></div></figure></p>
<p>Aha, here they are, thank you Grails! "view.gsp, edit.gsp, help.gsp"
would be created in directory /grails-app/views/<portlet_name>.</p>
<p>After these steps your portlet can be deployed to portal. Hmm, but it's
not just what we wanted as it does nothing at the moment, so let's add
some stuff to out portlet.</p>
<p>I would like to create a domain class with the name Car:</p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>grails create-domain com.sysgears.Car
</span></code></pre></td></tr></table></div></figure></p>
<p>Now simply add two string fields to this class: 'name' and 'color':
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>class Car <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   String name
</span><span class='line'>   String color
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>BootStrap class can be used to fill database with values as usual:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>class BootStrap <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   def <span class="nv">init</span> <span class="o">=</span> <span class="o">{</span> servletContext -&gt;
</span><span class='line'>      <span class="k">if</span> <span class="o">(</span>!Car.count<span class="o">)</span> <span class="o">{</span>
</span><span class='line'>         def <span class="nv">cars</span> <span class="o">=</span> <span class="o">[[</span><span class="s1">&#39;BMW&#39;</span>, <span class="s1">&#39;Black&#39;</span><span class="o">]</span>, <span class="o">[</span><span class="s1">&#39;Mercedes&#39;</span>, <span class="s1">&#39;White&#39;</span><span class="o">]</span>, <span class="o">[</span><span class="s1">&#39;Porshe&#39;</span>, <span class="s1">&#39;Yellow&#39;</span><span class="o">]</span>, <span class="o">[</span><span class="s1">&#39;Aston Martin&#39;</span>, <span class="s1">&#39;White&#39;</span><span class="o">]</span>, <span class="o">[</span><span class="s1">&#39;Daewoo&#39;</span>, <span class="s1">&#39;Gray&#39;</span><span class="o">]]</span>
</span><span class='line'>         cars.each <span class="o">{</span> car -&gt;
</span><span class='line'>            new Car<span class="o">(</span>name: car<span class="o">[</span>0<span class="o">]</span>, color: car<span class="o">[</span>1<span class="o">])</span>.save<span class="o">(</span>flush:true<span class="o">)</span>
</span><span class='line'>         <span class="o">}</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   def <span class="nv">destroy</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Generated portlet class has renderView and actionView actions, as you
can see the second part of action's name is 'VIEW', it means that these
actions refer to 'VIEW' portlet's mode. Also there are 'EDIT' and 'HELP'
portlet modes available. More information about portlet actions available
at liferay community site, please refer to it if you got some questions
(and may also Google be with you).</p>
<p>renderView - renders view.gsp.</p>
<p>renderAction - makes some stuff for the VIEW mode. Let's change these
two actions, so that portlet would be able to delete car instances from
database:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>class CarPortlet <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   def <span class="nv">title</span> <span class="o">=</span> <span class="s1">&#39;Car Portlet&#39;</span>
</span><span class='line'>   def <span class="nv">description</span> <span class="o">=</span> <span class="s1">&#39;&#39;&#39;</span>
</span><span class='line'><span class="s1">   This is my sample grails liferay portlet.</span>
</span><span class='line'><span class="s1">   &#39;&#39;&#39;</span>
</span><span class='line'>   def <span class="nv">displayName</span> <span class="o">=</span> <span class="s1">&#39;Car Portlet&#39;</span>
</span><span class='line'>   def <span class="nv">supports</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;text/html&#39;</span>:<span class="o">[</span><span class="s1">&#39;view&#39;</span>, <span class="s1">&#39;edit&#39;</span>, <span class="s1">&#39;help&#39;</span><span class="o">]]</span>
</span><span class='line'>   def <span class="nv">liferay_display_category</span> <span class="o">=</span> <span class="s2">&quot;Cars&quot;</span>
</span><span class='line'>   def <span class="nv">liferay_portlet_header_portlet_css</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>     <span class="s1">&#39;/css/car.css&#39;</span>
</span><span class='line'>   <span class="o">]</span>
</span><span class='line'>   ...
</span><span class='line'>
</span><span class='line'>   def <span class="nv">actionView</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>      //TODO Define action phase <span class="k">for</span> <span class="s1">&#39;view&#39;</span> portlets mode
</span><span class='line'>      def <span class="nv">car</span> <span class="o">=</span> Car.get<span class="o">(</span>params.id<span class="o">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">(</span>car<span class="o">)</span> <span class="o">{</span>
</span><span class='line'>         car.delete<span class="o">()</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   def <span class="nv">renderView</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>      //Return the map of the variables bound to the view,
</span><span class='line'>      //in this <span class="k">case </span>view.gsp <span class="k">if </span>it exists or render.gsp <span class="k">if </span>not
</span><span class='line'>      def <span class="nv">cars</span> <span class="o">=</span> Car.list<span class="o">()</span>
</span><span class='line'>      <span class="o">[</span>cars: cars<span class="o">]</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   ...
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>We also need to change 'view.gsp' file, to meet our desires.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="err">&lt;</span>%@ taglib uri=&quot;http://java.sun.com/portlet&quot; prefix=&quot;portlet&quot; %&gt;
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h1</span> <span class="na">class=</span><span class="s">&quot;header&quot;</span><span class="nt">&gt;</span>What cars do we have?<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>      <span class="nt">&lt;g:each</span> <span class="na">in=</span><span class="s">&quot;${cars}&quot;</span> <span class="na">var=</span><span class="s">&quot;car&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;</span>${car.name} with ${car.color} color.<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/g:each&gt;</span> 
</span><span class='line'>    <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h1</span> <span class="na">class=</span><span class="s">&quot;header&quot;</span><span class="nt">&gt;</span>Choose car to be removed!<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>  <span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;${portletResponse.createActionURL()}&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;g:select</span> <span class="na">name=</span><span class="s">&quot;id&quot;</span> <span class="na">from=</span><span class="s">&quot;${cars}&quot;</span> <span class="na">optionKey=</span><span class="s">&quot;id&quot;</span> <span class="na">optionValue=</span><span class="s">&quot;name&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Submit&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/form&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>But what should you do if you wish to add your own action? Hmm... that
is the question! Let's define an action for creating cars. In our
portlet class it will look like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">...</span>
</span><span class='line'>
</span><span class='line'><span class="kt">def</span> <span class="n">addCar</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s1">&#39;In add action. &#39;</span> <span class="o">+</span> <span class="n">params</span><span class="o">)</span>
</span><span class='line'>   <span class="k">if</span> <span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">name</span> <span class="o">&amp;&amp;</span> <span class="n">params</span><span class="o">.</span><span class="na">color</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>     <span class="n">carService</span><span class="o">.</span><span class="na">saveCar</span><span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">name</span><span class="o">,</span> <span class="n">params</span><span class="o">.</span><span class="na">color</span><span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">portletResponse</span><span class="o">.</span><span class="na">setPortletMode</span><span class="o">(</span><span class="n">PortletMode</span><span class="o">.</span><span class="na">VIEW</span><span class="o">)</span>
</span><span class='line'> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>By the moment of writing this article GORM didn't work in portlet
actions, and this is the known bug. The simplest way to solve this
problem is creating a service class which would do GORM work. Yeah, here
it is:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">CarService</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">def</span> <span class="nf">saveCar</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">color</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>     <span class="k">new</span> <span class="nf">Car</span><span class="o">(</span><span class="nl">name:</span> <span class="n">name</span><span class="o">,</span> <span class="nl">color:</span> <span class="n">color</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span> <span class="kc">true</span><span class="o">)</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>OK, we solved our GORM trouble, now let's create view for adding cars.
We need to get link to action from view, so let's change view.gsp, it's
pretty simple:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">&lt;</span><span class="nl">portlet:</span><span class="n">actionURL</span> <span class="n">var</span><span class="o">=</span><span class="s2">&quot;addCarURL&quot;</span><span class="o">&gt;</span>
</span><span class='line'> <span class="o">&lt;</span><span class="nl">portlet:</span><span class="n">param</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;action&quot;</span> <span class="n">value</span><span class="o">=</span><span class="s2">&quot;addCar&quot;</span> <span class="s">/&gt;</span>
</span><span class='line'><span class="s">&lt;/</span><span class="nl">portlet:</span><span class="n">actionURL</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="n">h1</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;header&quot;</span><span class="o">&gt;</span><span class="n">Add</span> <span class="n">a</span> <span class="n">car</span><span class="o">&lt;</span><span class="s">/h1&gt;</span>
</span><span class='line'><span class="s">&lt;form method=&quot;post&quot; action=&quot;&lt;%= addCarURL %&gt;&quot;&gt;</span>
</span><span class='line'><span class="s">   &lt;input placeholder=&quot;Enter car name...&quot; name=&quot;name&quot; /</span><span class="o">&gt;</span>
</span><span class='line'>   <span class="o">&lt;</span><span class="n">input</span> <span class="n">placeholder</span><span class="o">=</span><span class="s2">&quot;Enter car color...&quot;</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;color&quot;</span><span class="o">&gt;</span>
</span><span class='line'>   <span class="o">&lt;</span><span class="n">input</span> <span class="n">type</span><span class="o">=</span><span class="s2">&quot;submit&quot;</span> <span class="n">value</span><span class="o">=</span><span class="s2">&quot;Add&quot;</span> <span class="s">/&gt;</span>
</span><span class='line'><span class="s">&lt;/</span><span class="n">form</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>'<portlet:actionURL>' tag creates portlet's actionURL, we need to
specify a parameter which would be the name of portlet's action. I
created action 'addCar', so I need to specify parameter for actionURL
with value of 'addCar'. After doing this, you will be able to add cars
to database.</p>
<p>We can invoke our newly created portlet action, but now another question
is: 'How can we render our own views?' Well, it is not much different
from mapping to portlet action, you simply have to define portlet tag in
gsp.</p>
<p>When car is added I want my application to show a message that car was
added. For that case I created 'added.gsp' in /views/car/ directory,
which looks like that:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>%{--added.gsp--}%
</span><span class='line'><span class="err">&lt;</span>%@ taglib uri=&quot;http://java.sun.com/portlet&quot; prefix=&quot;portlet&quot; %&gt;
</span><span class='line'>
</span><span class='line'>Car was successfully added!
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;portlet:actionURL</span> <span class="na">var=</span><span class="s">&quot;view&quot;</span> <span class="na">portletMode=</span><span class="s">&quot;view&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;&lt;%= view %&gt;&quot;</span><span class="nt">&gt;</span>Back<span class="nt">&lt;/a&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>I wish this page to be rendered after car was added, so I need to
change our 'addCar' closure a little:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">...</span>
</span><span class='line'>
</span><span class='line'><span class="kt">def</span> <span class="n">addCar</span> <span class="o">=</span> <span class="o">{</span>    
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s1">&#39;In add action. &#39;</span> <span class="o">+</span> <span class="n">params</span><span class="o">)</span>    
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">name</span> <span class="o">&amp;&amp;</span> <span class="n">params</span><span class="o">.</span><span class="na">color</span><span class="o">)</span> <span class="o">{</span>      
</span><span class='line'>       <span class="n">carService</span><span class="o">.</span><span class="na">saveCar</span><span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">name</span><span class="o">,</span> <span class="n">params</span><span class="o">.</span><span class="na">color</span><span class="o">)</span>    
</span><span class='line'>    <span class="o">}</span>    
</span><span class='line'>    <span class="n">portletResponse</span><span class="o">.</span><span class="na">setRenderParameter</span><span class="o">(</span><span class="s2">&quot;action&quot;</span><span class="o">,</span> <span class="s2">&quot;added&quot;</span><span class="o">);</span>  
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>'portletResponse.setRendererParameter' will invoke portlet's closure
named 'renderAdded' which I left empty, as it's not necessary to get any
model for that view:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'>   <span class="kt">def</span> <span class="n">renderAdded</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s1">&#39;Rendering added car view.&#39;</span><span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Also If you wish to render custom gsp view file, you can do it by
creating a link to action which renders gsp page:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="err">&lt;</span>%@ taglib uri=&quot;http://java.sun.com/portlet&quot; prefix=&quot;portlet&quot; %&gt;
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;portlet:renderURL</span> <span class="na">var=</span><span class="s">&quot;added&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;portlet:param</span> <span class="na">name=</span><span class="s">&quot;action&quot;</span> <span class="na">value=</span><span class="s">&quot;added&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/portlet:renderURL&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;&lt;%= added %&gt;&quot;</span><span class="nt">&gt;</span>Go to page<span class="nt">&lt;/a&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>By clicking on "Go to page" renderAdded will be invoked, and that
action renders 'added.gsp'. Just what we needed! :)</p>
<p>And this is it! Now let's see what we've got:</p>
<ol>
<li><p>Create war file, using Grails command:<br  />
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'> grails war
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Then just copy freshly created war file to %LIFERAY_HOME%/deploy
directory. Liferay will deploy your portlet application, and it would be
available for use.</p>
</li>
<li><p>Add portlet to the page. Login as Bruno admin (or another credentials
with admin rights), then in control panel go to Add →  More →
<category_you_specified> (in our case it’s named 'Cars') and
simply drag and drop '<display_name_of_portlet>' (which is 'Car
Portlet' for me) to the page.</p>
</li>
</ol>
<p>Here's a screenshot:</p>
<p><img width="460" height="344" src="/images/posts/CarPortlet-3c45612c7159075f8c522881fcab35c7.png"></p>
<p>GitHub:
<a href="https://github.com/Lizard5472/grails-liferay-sample-portlet.git">repo link</a></p>
<p>Hope, this will be helpful. Cheers!<br  />
Aleksey Lisikh,<br  />
SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Agile vs Waterfall Development model]]></title><link href="http://www.sysgears.com/articles/agile-vs-waterfall-development-model/"/><updated>2013-06-12T16:43:00+02:00</updated><id>http://www.sysgears.com/articles/agile-vs-waterfall-development-model/</id><content type="html"><![CDATA[<p><strong>Development methodology</strong> is a framework that is used to structure,
plan, and control the development of software systems. Agile and CMMI
Waterfall methodologies are very alike and have enough differences to be
named differently. Let’s consider the methodologies in detail.</p>
<!--more-->
<h3>Waterfall Methodology</h3>
<p>The first formal description of the <strong>“Waterfall Model”</strong> was given in
an article by Winston W. Royce in 1970. It is a good joke that Royce
presented waterfall model, but used the iterative one. Waterfall is an
old and time-proved development model. There is a huge number of systems
that were developed using CMMI Waterfall methodology. Many IT companies
continue to develop software using waterfall model.</p>
<p>The life cycle of software from idea till realization looks like the
following:</p>
<ol>
<li><strong>Initiation phase:</strong> A sponsor identifies the need for new software
that fits his own requirements. A concept is created.</li>
<li><strong>System Concept Development phase:</strong> Analysts investigate the
problem and define the scope of the future project. Feasibility analysis
is made, relative risks are calculated.</li>
<li><strong>Planning phase:</strong> Project plan and other plan documents are
created. The papers give a rough list of resources that are required to
achieve the solution.</li>
<li><strong>Requirement Specification phase:</strong> Requirement Specification is
created on the base of user needs analysis.</li>
<li><strong>Design phase:</strong> System design documents are worked out on the base
of the detailed requirements. The priority is given to deliver the
required functionality.</li>
<li><strong>Development phase:</strong> System is developed according to its design.
Features, environment, testing procedures are coded and prepared for the
next phase.</li>
<li><strong>Testing and Integration phase:</strong> The testing demonstrates that the
system features fit all the requirements described in respective
documents. Test report is often written by a third party.</li>
<li><strong>Implementation phase:</strong> Problems discovered during the previous
phase must be resolved, the system is transferred to the production
environment.</li>
<li><strong>Operation and Maintenance phase:</strong> The system is monitored to be
sure it works as described in the requirements and for possible
improvements during In-Process Reviews.</li>
<li><strong>Disposition phase:</strong> System is archived to provide an opportunity
to start development again if it's required. The team can move to a new
project.</li>
</ol>
<p>Often the uniform “Waterfall model” is shown in a short view:</p>
<ol>
<li><strong>Analysis </strong>- combines Initiation/Concept/Planning phases.</li>
<li><strong>Requirement Specification</strong></li>
<li><strong>Design</strong></li>
<li>*<em>Development  </em>*</li>
<li><strong>Testing and Integration</strong></li>
<li><strong>Implementation/Deployment</strong> - integrates Implementation,
Maintenance, Disposition phases.</li>
</ol>
<p><img alt="" src="http://s49.radikal.ru/i126/1208/24/e96847237d43.jpg" width="700"></p>
<p>The diagram above shows potential difficulties that may occur during the
development: waterfall model presupposes execution of all steps if an
error is discovered or customer decided to change a part of the
functionality.</p>
<h3>Agile Methodology</h3>
<p><strong>Agile</strong> methodology combines software development methods that are
based on iterative and incremental models. In February 2001, 17
developers met to discuss lightweight development methods, there the<strong>
Manifesto for Agile Software Development</strong> was created. Agile methods
are guided by common principles to overcome the identified problems of
waterfall methodology.<br  /></p>
<p>The workflow of the Agile development process is as follow:</p>
<ol>
<li>The whole project is divided into parts using features'
prioritization.</li>
<li>The customer and development team choose the set of features that
must be implemented during the sprint.</li>
<li>The features are developed.</li>
<li>The features are tested and integrated.</li>
<li>The shippable features are released to the customer.</li>
<li>The customer sends feedback and the team reviews it.</li>
<li>If the customer accepts the product, it can be released to the
market.</li>
<li>If the customer wants any modernization, the next iteration starts
(from step 2: prioritization of the features).</li>
</ol>
<p>Developers team and customer representatives stay in touch during all
development process. Such a cooperation allows to find problems in early
development.</p>
<p><img alt="" src="http://s019.radikal.ru/i607/1208/36/37677f306c57.jpg" width="700"></p>
<p>It is pretty clear from the diagram above that it is very difficult to
calculate the time for development using the Agile methods. Agile
methodology gives customer great opportunity to change the product at
any time, but requires more efforts of the developers and consultant
teams.</p>
<h3>Agile and Waterfall Differences</h3>
<p>The differences between Agile and Waterfall methodologies are:</p>
<p><strong>Idea and Design</strong></p>
<ul>
<li><em>Agile:</em> The most critical parts are designed first. Agile
provides for adding new parts to existing ones. Customer can change the
requirements anytime, that is why the parts are designed as separate
elements, and the structure of one element does not influence much on
the others.</li>
<li><em>Waterfall:</em> Project is planned from top to bottom at once.
Developers have to take into account every detail of the working
process. Inefficient information support may cause problems in the
future.</li>
</ul>
<p><strong>Coordinated actions</strong></p>
<ul>
<li><em>Agile:</em> The customer or the representatives of the customer
work closely with the development team during all development process.
The problems can be avoided, and documents' inaccuracy can be corrected
in a short time.</li>
<li><em>Waterfall:</em> All the responsibility lies with the development
team. The customer is hardly involved into the development.</li>
</ul>
<p><strong>Project execution</strong></p>
<ul>
<li><em>Agile:</em> Development process is iterative. The project is
executed in short (2-4 week) iterations. Every new version of the
product is updated with ranked features. There is a little planning.</li>
<li><em>Waterfall:</em> Development process is phased. The phase is much
bigger then an iteration. Every phase ends with a detailed description
of requirements for the next phase.</li>
</ul>
<p><strong>Testing</strong></p>
<ul>
<li><em>Agile:</em> Every iteration has its own testing phase. That
allows to implement regression testing every time new logics or
functions are released.</li>
<li><em>Waterfall:</em> Testing phase is executed only after development
phase, because separate parts are not fully functional to be tested.
Requirements verification can be only performed on the completed
software.</li>
</ul>
<p><strong>Deliverables</strong></p>
<ul>
<li><em>Agile:</em> The most important features are the first to be
developed: when an iteration ends, potentially shippable features are
delivered to the customer. New features are usable right after
shippment.</li>
<li><em>Waterfall:</em> All features are delivered at once, after the
long implementation phase. The customer cannot make amendments into the
project, because it requires to re-run all passed development phases.</li>
</ul>
<p><strong>Documentation</strong></p>
<ul>
<li><em>Agile:</em> Priority is given to the working software. Project
documentation is not formalized, it is simple and understandable.</li>
<li><em>Waterfall:</em> Project is well documented with all sorts of
documents (including user manual, etc.). The customer can use this
documentation to train the staff, upgrade the software with another
team.</li>
</ul>
<p><strong>Design time</strong></p>
<ul>
<li><em>Agile:</em> Small projects can be implemented very fast. It is
hard to estimate the development time of large projects.</li>
<li><em>Waterfall:</em> Project is well planned, and the shippable date
can be estimated for all sorts of projects.</li>
</ul>
<h3>What Is Your Methodology?</h3>
<p>There are some facts that may help you to choose the development
methodology.</p>
<p><strong>Use Agile if...</strong></p>
<ul>
<li>you need to ship the software in a very short term;</li>
<li>the details of the project are not fully defined or can change
greatly during the development;</li>
<li>you want to use the basic functionality of the software before
project will be finished;</li>
<li>you want to control or take part in the development process
face-to-face;</li>
<li>you can ensure continual visibility of the ones who will use the
software with the developers team;</li>
<li>you can save the high rate development with your resources.</li>
</ul>
<p><strong>Use Waterfall if...</strong></p>
<ul>
<li>there are no tight time frames during development;</li>
<li>you can afford to receive the completed software after a long time;</li>
<li>project is well-defined and can be designed in details;</li>
<li>you need full documentation on the start of the project;</li>
<li>you need a safe software with a high reliability level;</li>
<li>you want to use the finished software;</li>
<li>you do not have resources for face-to-face everyday work.</li>
</ul>
<p>Ekaterina Gladkova,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Easy REST with Spring RestTemplate and JAX-B]]></title><link href="http://www.sysgears.com/articles/easy-rest-spring-resttemplate-and-jax-b/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/easy-rest-spring-resttemplate-and-jax-b/</id><content type="html"><![CDATA[<p>Representational state transfer (REST) is a very popular architecture
for distributed hypermedia. Lots of different web services expose their
APIs in a RESTful manner. It is very convenient when a service of a
choice provides a library for its API, but this is not always so. In
this case you have to construct valid requests and parse responses by
yourself. Assuming that you are familiar with REST itself, I will tell
you how you can make your life easier with the help of Spring and Java
annotations.</p>
<!--more-->
<p>Let’s consider a service that stores some accounts. To retrieve one we
must issue a request<br  />
GET https://api.example.com/accounts/{id}</p>
<p>Providing “1” as the id we get something like this in response body
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
</span><span class='line'><span class="nt">&lt;account</span> <span class="na">href=</span><span class="s">&quot;https:// api.example.com/accounts/1&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;id</span> <span class="na">type=</span><span class="s">&quot;integer&quot;</span><span class="nt">&gt;</span>1<span class="nt">&lt;/id&gt;</span>
</span><span class='line'> <span class="nt">&lt;username&gt;</span>tester<span class="nt">&lt;/username&gt;</span>
</span><span class='line'> <span class="nt">&lt;email&gt;</span>tester@ example.com<span class="nt">&lt;/email&gt;</span>
</span><span class='line'> <span class="nt">&lt;full_name&gt;</span>John Doe<span class="nt">&lt;/full_name&gt;</span>
</span><span class='line'> <span class="nt">&lt;created_at</span> <span class="na">type=</span><span class="s">&quot;datetime&quot;</span><span class="nt">&gt;</span>2011-10-25T12:00:00<span class="nt">&lt;/created_at&gt;</span>
</span><span class='line'><span class="nt">&lt;/account&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Our goal is to map this data to a JavaBean and be able to GET and POST
it back and forth. Doing such a task manually is very low level with all
the consequences. You can use a ready solution such as Spring
RestTemplate for HTTP communications and JAX-B for data binding.</p>
<p>Mapping a JavaBean to an XML element is as easy as putting
@XmlRootElement on top of your class and annotating every field you want
to be mapped with @XmlElement. If you put bare annotation then the name
of the XML Schema element is derived from the JavaBean field name. If
names don’t match you can specify it with the “name” element.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="nd">@XmlRootElement</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;account&quot;</span><span class="o">)</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Account</span> <span class="o">{</span>
</span><span class='line'>    <span class="nd">@XmlElement</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">Integer</span> <span class="n">id</span><span class="o">;</span>
</span><span class='line'>    <span class="nd">@XmlElement</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">String</span> <span class="n">username</span><span class="o">;</span>
</span><span class='line'>    <span class="nd">@XmlElement</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">String</span> <span class="n">email</span><span class="o">;</span>
</span><span class='line'>    <span class="nd">@XmlElement</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;full_name&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">String</span> <span class="n">fullName</span><span class="o">;</span>
</span><span class='line'>    <span class="nd">@XmlElement</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;created_at&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">Date</span> <span class="n">createdAt</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">Account</span><span class="o">()</span> <span class="o">{}</span>
</span><span class='line'>   
</span><span class='line'>    <span class="cm">/* Getters and setters */</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Issuing requests and receiving responses is not a single bit harder. All
data binding occurs automatically.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">RestTemplate</span> <span class="n">rest</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RestTemplate</span><span class="o">();</span>
</span><span class='line'><span class="n">Account</span> <span class="n">account</span> <span class="o">=</span> <span class="n">rest</span><span class="o">.</span><span class="na">getForObject</span><span class="o">(</span><span class="s">&quot;https://api.example.com/accounts/1&quot;</span><span class="o">,</span>
</span><span class='line'>                                    <span class="n">Account</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>First you create a RestTemplate object and then you invoke according
methods against it. First part of method's name indicates what HTTP
method will be used, while the second part of the name indicates what is
returned. In this case a GET is performed, HTTP response is converted
into an object type of Account, which is then returned. There are
dedicated methods for each of six main HTTP methods (DELETE, GET HEAD,
OPTIONS, POST, PUT) in RestTemplate.</p>
<p>Let’s make some changes to the entity’s state
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">account</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">&quot;changed@ example.com&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">URI</span> <span class="n">uri</span> <span class="o">=</span> <span class="n">rest</span><span class="o">.</span><span class="na">postForLocation</span><span class="o">(</span><span class="s">&quot;https:// api.example.com/accounts/1&quot;</span><span class="o">,</span> <span class="n">account</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And delete it when it is no longer needed
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">rest</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">uri</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now, suppose our service mandates authentication for using its API. For
this purpose it requires an API key to be present in request headers.
For such manipulations on the request we must implement
ClientHttpRequestFactory interface and provide this object as a
constructor parameter during RestTemplate initialization. Here’s an
example of extending CommonsClientHttpRequestFactory
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">example</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.commons.httpclient.HttpMethodBase</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.springframework.http.client.CommonsClientHttpRequestFactory</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">RequestWithHeadersFactory</span> <span class="kd">extends</span> <span class="n">CommonsClientHttpRequestFactory</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">apiKey</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">RequestWithHeadersFactory</span><span class="o">(</span><span class="n">String</span> <span class="n">apiKey</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">super</span><span class="o">();</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">apiKey</span> <span class="o">=</span> <span class="n">apiKey</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Override</span>
</span><span class='line'>    <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">postProcessCommonsHttpMethod</span><span class="o">(</span><span class="n">HttpMethodBase</span> <span class="n">httpMethod</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">super</span><span class="o">.</span><span class="na">postProcessCommonsHttpMethod</span><span class="o">(</span><span class="n">httpMethod</span><span class="o">);</span>
</span><span class='line'>        <span class="n">httpMethod</span><span class="o">.</span><span class="na">addRequestHeader</span><span class="o">(</span><span class="s">&quot;Accept&quot;</span><span class="o">,</span> <span class="s">&quot;application/xml&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">httpMethod</span><span class="o">.</span><span class="na">addRequestHeader</span><span class="o">(</span><span class="s">&quot;Content-Type&quot;</span><span class="o">,</span>
</span><span class='line'>                                    <span class="s">&quot;application/xml; charset=utf-8&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">httpMethod</span><span class="o">.</span><span class="na">addRequestHeader</span><span class="o">(</span><span class="s">&quot;Authorization&quot;</span><span class="o">,</span> <span class="n">apiKey</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now the construction of RestTemplate looks like this
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">RestTemplate</span> <span class="n">rest</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RestTemplate</span><span class="o">(</span><span class="k">new</span> <span class="n">RequestWithHeadersFactory</span><span class="o">(</span><span class="s">&quot;mySecureKey&quot;</span><span class="o">));</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And all subsequent request will contain above headers. This is it,
working with REST should be as easy as rest.</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Custom sorting in Grails]]></title><link href="http://www.sysgears.com/articles/custom-sorting-grails-derived-properties-and-groovy-sort-solutions/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/custom-sorting-grails-derived-properties-and-groovy-sort-solutions/</id><content type="html"><![CDATA[<p>Hi, guys, today we’re gonna talk about the really interesting and tricky
Grails task, implementation of the custom sorting.<br  />
It’s a pretty often appearing situation, when you need to sort the list
of items, basing on the values that can only be calculated, and that are
not persisted in the db.<br  />
I know what you might say, - "Hey, why don’t you just use transient
properties for that?"</p>
<!--more-->
<p>Yep, lot of you knows that transient properties doesn't have their
values persisted in the database, though we may use them in the code
like this: a.sortField. Let's take a look at the example: if we will
write the following code in the domain class, 'sortField' here will be
treated like the transient property.</p>
<p><strong>Note:</strong> All following suggestions and the code is tested for the
Grails 1.3.7 and MySQL 5.1
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">A</span> <span class="o">{</span>
</span><span class='line'>   <span class="kt">def</span> <span class="nf">getSortField</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="c1">//some complex db request goes here</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Note that I didn’t write method as a closure, like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">getSortField</span> <span class="o">=</span> <span class="o">{</span>  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In this case ‘sortField’ wouldn’t be treated like a property. Also
notice I didn’t specified method’s return type. If we will code this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">Integer</span> <span class="nf">getSortField</span><span class="o">()</span> <span class="o">{</span>  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Exception will occur saying "org.hibernate.PropertyNotFoundException:
Could not find a setter for property sortField". To be able to use above
code you should specify ‘sortField’ as the transient in the domain
class:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">static</span> <span class="n">transients</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;sortField&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>So now when we have domain class set up, can we get the sorted list with
the following code?
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">A</span><span class="o">.</span><span class="na">findAll</span><span class="o">([</span><span class="nl">sort:</span> <span class="s1">&#39;sortField&#39;</span><span class="o">,</span> <span class="nl">order:</span> <span class="s1">&#39;asc&#39;</span><span class="o">])</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>No, the above code will throw an exception:
"org.hibernate.QueryException: could not resolve property: sortField".
It happens because the Hibernate translates the request to be processed
with the database, and database simply doesn’t know what the sortField
is anyway.<br  />
There’s two solutions in order to implement this task I’ve found so far.</p>
<p>Using Groovy sorting could be a really nice solution. Check this code
out:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm">* Grails action for processing the custom sorting, params to accept: </span>
</span><span class='line'><span class="cm">* field - property to sort by(could be transient)</span>
</span><span class='line'><span class="cm">* order - order to sort, could be ascending or descending</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="kt">def</span> <span class="n">customSorting</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>   <span class="kt">def</span> <span class="n">listToSort</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">findAll</span><span class="o">()</span>
</span><span class='line'>   <span class="k">if</span> <span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">order</span> <span class="o">==</span> <span class="s1">&#39;asc&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">listToSort</span><span class="o">.</span><span class="na">sort</span><span class="o">{</span><span class="n">it</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">field</span><span class="o">)}</span>    
</span><span class='line'>   <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">order</span> <span class="o">==</span> <span class="s1">&#39;desc&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">listToSort</span><span class="o">.</span><span class="na">sort</span><span class="o">{-</span><span class="n">it</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">field</span><span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="o">[</span><span class="nl">list:</span> <span class="n">listToSort</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>As you can see, Groovy sorting syntax is pretty self explainable. So
what you want to remember except that, is a.sort{it.b} stands for the
ascending order, and a.sort{-it.b} for the descending.<br  />
There is also a nice and elegant solution provided by Grails: derived
properties. Derived properties takes its values from the SQL expression,
so the database can calculate it and sort request results by it. Note
that formula for the derived properties should be based on the
field/table names as they expressed in your database, not in your domain
model. Let’s get more detailed with the following example. Here some
companies have collections of tickets on some events they offer, and
ticket has collection of ticket types - product order lines. The task is
to sort companies by the minimum cost of the tickets they offer.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProcutOrderLine</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">BigDecimal</span> <span class="n">price</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">belongsTo</span> <span class="o">=</span> <span class="o">[</span><span class="nl">ticket:</span> <span class="n">Ticket</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">Ticket</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">productOrderLines:</span> <span class="n">ProductOrderLine</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">belongsTo</span> <span class="o">=</span> <span class="o">[</span><span class="nl">parent:</span> <span class="n">User</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">Company</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">BigDecimal</span> <span class="n">price</span>
</span><span class='line'>   
</span><span class='line'>   <span class="kd">static</span> <span class="n">hasMany</span> <span class="o">=</span> <span class="o">[</span><span class="nl">tickets:</span> <span class="n">Ticket</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">price</span> <span class="nl">formula:</span> <span class="s2">&quot;(select min(x.price) from product_order_line x &quot;</span> <span class="o">+</span>
</span><span class='line'>               <span class="s2">&quot;WHERE x.ticket_id IN(select x.id from ticket x &quot;</span> <span class="o">+</span>
</span><span class='line'>               <span class="s2">&quot;WHERE x.parent_id = id))&quot;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Note that the whole request is held inside parenthesis, it won’t work
without them. Also even if the request works in the db console, it may
not work for your code, so may sure you include all those ‘x’ into your
formula.<br  />
So after you get things to work, following code would be a solution:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm">* Grails action for processing the custom sorting, params to accept: </span>
</span><span class='line'><span class="cm">* field - property to sort by(could be transient)</span>
</span><span class='line'><span class="cm">* order - order to sort, could be ascending or descending</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="kt">def</span> <span class="n">customSorting</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>   <span class="kt">def</span> <span class="n">listToSort</span>
</span><span class='line'>   <span class="nf">if</span> <span class="o">(</span><span class="n">params</span><span class="o">.</span><span class="na">order</span> <span class="o">==</span> <span class="s1">&#39;asc&#39;</span> <span class="o">||</span> <span class="n">params</span><span class="o">.</span><span class="na">order</span> <span class="o">==</span> <span class="s1">&#39;desc&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">listToSort</span> <span class="o">=</span> <span class="n">Company</span><span class="o">.</span><span class="na">findAll</span><span class="o">([</span><span class="nl">sort:</span> <span class="n">params</span><span class="o">.</span><span class="na">field</span><span class="o">,</span> <span class="nl">order:</span> <span class="n">params</span><span class="o">.</span><span class="na">order</span><span class="o">])</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="o">[</span><span class="nl">list:</span> <span class="n">listToSort</span><span class="o">]</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Another pretty self explainable code, isn’t it? Using derived properties
also has awesome advantage: you may use it for all the dynamic methods
that Grails providing, like findBy. So for the domain example we
considered, you may find useful something like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">Company</span><span class="o">.</span><span class="na">findByPriceLessThan</span><span class="o">(</span><span class="mi">50</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Hope you have found this article interesting and helpful, so have fun!</p>
<p>Andrey Shevchenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Groovy's True Object-Orientation]]></title><link href="http://www.sysgears.com/articles/groovys-true-object-orientation/"/><updated>2013-06-17T09:58:00+02:00</updated><id>http://www.sysgears.com/articles/groovys-true-object-orientation/</id><content type="html"><![CDATA[<p>Unlike Java, which mixes primitive and reference types, Groovy handles
everything in common manner — as objects, what makes it truly
object-oriented. When a primitive type gets passed into the Groovy
world, it is automatically “boxed” into its object equivalent, and vice
versa. This allows Groovy to support some interesting concepts like
methods on primitives, operator overloading and The Groovy Truth. Let’s
look at them more closely.</p>
<!--more-->
<p>Methods on primitives:</p>
<p>In Groovy it is absolutely eligible to make method calls on primitives,
just like this one: 5.minus(7). As you know, Groovy source code is
compiled into Java bytecode, which in turn runs on JVM where such things
are not possible. So, how does Groovy carry out this trickery? Let’s
find out! Try this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">int</span> <span class="n">number</span> <span class="o">=</span> <span class="mi">3</span>
</span><span class='line'><span class="n">println</span> <span class="n">number</span>
</span><span class='line'><span class="n">println</span> <span class="n">number</span><span class="o">.</span><span class="na">getClass</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>After running it you will see in the output:<br  />
3<br  />
class java.lang.Integer</p>
<p>It is clearly visible that Groovy has converted primitive int into
Integer class. So, in fact all primitives in Groovy are just visionary
and are automatically boxed into corresponding wrapper classes, exposing
due methods for our use. Along with Groovy’s way of passing closures as
method arguments we can do pretty slick things. Here’s an example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="mi">3</span><span class="o">.</span><span class="na">times</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">print</span> <span class="n">it</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This code uses void times(Closure closure) method of
<a href="http://groovy.codehaus.org/groovy-jdk/java/lang/Number.html#times%28groovy.lang.Closure%29" id="internal-source-marker_0.951338568944994">
Number</a> class, which is a superclass of Integer, and will give “012”
as an output. Or another one: void upto(Number to, Closure closure):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nt">7</span><span class="nc">.upto</span><span class="o">(</span><span class="nt">9</span><span class="nc">.99</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">print</span> <span class="n">it</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Will print “789”</p>
<p>Operator overloading:</p>
<p>As I mentioned, Groovy is a true object-oriented language, and this
extends to the operators themselves. In Groovy it is possible to do
things like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">list</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'><span class="n">list</span> <span class="o">&lt;&lt;</span> <span class="s1">&#39;car&#39;</span> <span class="o">&lt;&lt;</span> <span class="s1">&#39;bike&#39;</span>
</span><span class='line'><span class="n">println</span> <span class="n">list</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Which will print [car, bike]</p>
<p>In Java “&lt;&lt;” means bitwise left shift and nothing else. What
Groovy does is translates all operators into method calls, that’s right,
“&lt;&lt;” becomes “.append()”. This means that you can change default
behavior of any operator. We can put a little experiment to test this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">A</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="nf">plus</span><span class="o">(</span><span class="n">addend</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">println</span> <span class="s2">&quot;I am adding $addend&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">def</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="n">A</span><span class="o">()</span>
</span><span class='line'><span class="n">a</span> <span class="o">+</span> <span class="mi">2</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Will print “I am adding 2”</p>
<p>All operators follow naming convention, here are few of them:<br  />
a == b        a.equals(b)<br  />
a * b           a.multiply(b)<br  />
a / b           a.divide(b)<br  />
a++           a.next()<br  />
a--             a.previous()<br  />
a <=> b     a.compareTo(b)<br  />
You can find comprehensive list
<a href="http://groovy.codehaus.org/Operator+Overloading" id="internal-source-marker_0.951338568944994">
here</a>.<br  />
The good news is that all such operators handle nulls gracefully
avoiding the throwing of java.lang.NullPointerException. So, you don’t
have to worry if ‘a’ is a null before making a comparison.</p>
<p>The Groovy Truth:</p>
<p>In Groovy booleans aren't the sole things that can be evaluated to true
or false, but for instance, null references, number zero, empty strings
or collections are evaluated to false. This makes code to be infinitely
cleaner, especially in the context of web applications given the amount
of string evaluation necessary.</p>
<p>Again, this is possible due to implicit method invocation and, as
always, you can customize it for your needs in your own classes. Let’s
make sure:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">A</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">boolean</span> <span class="nf">asBoolean</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">println</span> <span class="s1">&#39;Ð¡onverting to boolean&#39;</span>
</span><span class='line'>        <span class="k">return</span> <span class="kc">true</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">def</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="n">A</span><span class="o">()</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">a</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">println</span> <span class="s2">&quot;It&#39;s true!&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And here’s the output:<br  />
Converting to boolean<br  />
It's true!</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Reinforcing Grails Application With Hudson/Jenkins]]></title><link href="http://www.sysgears.com/articles/reinforcing-grails-application-hudsonjenkins/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/reinforcing-grails-application-hudsonjenkins/</id><content type="html"><![CDATA[<p>Hudson is an excellent continuous integration tool and has become an
indispensable assistant in software quality control for many
organisations. As for this post I will describe how to couple Hudson and
Grails to work in effective synergy.</p>
<!--more-->
<p>In 2011 Hudson has
<a href="http://jenkins-ci.org/content/hudsons-future" id="internal-source-marker_0.49970203923336487">
split</a> into two branches: Hudson and Jenkins — and for now they are
twin brothers. I will refer to Hudson throughout this post, but for
those who like Jenkins more, just replace all ‘hudson’ words with
‘jenkins’ and you’ll get pretty much the same result.</p>
<p>On Debian-based distributions, such as Ubuntu, you can install Hudson
through apt-get.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo sh -c <span class="s2">&quot;echo &#39;deb http://hudson-ci.org/debian binary/&#39; &gt; /etc/apt/sources.list.d/hudson.list&quot;</span>
</span><span class='line'>sudo apt-get update
</span><span class='line'>sudo apt-get install hudson
</span></code></pre></td></tr></table></div></figure></p>
<p>Alongside with common installation this package will create ‘hudson’
user and will be launching Hudson under it as a daemon on system
startups.</p>
<p>Alternatively you can download Hudson artifact manually from
<a href="http://hudson-ci.org/" id="internal-source-marker_0.49970203923336487">
http://hudson-ci.org</a> and run it with
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>java -jar hudson.war
</span></code></pre></td></tr></table></div></figure></p>
<p>This will start Hudson running on the default port 8080, if you want you
can change it by providing http port parameter in command line in the
form of --httpPort=8070. Or change value of HTTP_PORT in
/etc/default/hudon (on Ubuntu).</p>
<p>Hudson already can run arbitrary scripts and commands out of the box,
but the most convenient way to work with Grails projects is by using
Grails plugin. To install it take a view of the panel on the left side
and navigate to 'Hudson -> Manage Hudson -> Manage Plugins', then
select Grails plugin in the ‘Available’ tab. After completed download
don’t forget to restart Hudson for the plugin to take effect.</p>
<p>Finally, Hudson might manage to find Grails on the system path, but
better specify it explicitly by going to ‘Manage Hudson -> Configure
System’ and providing path to your Grails installation in Grails
Builder.</p>
<p><img src="https://lh5.googleusercontent.com/UqQbBXFgcvul_76_kKeC3nIwXa78E09IkvwS50dZSbt3npA2o7UM8ZRGnCJRmg9EUsShR4o_lzH_YWU1Cf80p-olVrcvbZNftgxcrdXh9L6cNnsHQRg" height="150px;" width="477px;"></p>
<p>Now, when all setup is done, it’s time to issue a job for our servant.
As an example I’ll show how to make Hudson poll Subversion repository
every 10 minutes and fire Grails integration tests in case of any new
commits detected.</p>
<p>Click ‘New Job’ on the left menu, then give job a name and select ‘Build
a free-style software project’ option. In the appeared job configuration
menu scroll down to the Source Code Management section, choose
Subversion (or any other VCS of your choice) and fill in Repository URL.
It will ask you to provide valid credentials, hope you have already an
answer to this question. In the Build Triggers you can specify a
schedule in
<a href="http://en.wikipedia.org/wiki/Cron" id="internal-source-marker_0.49970203923336487">
cron</a> syntax to poll the source code management system.</p>
<p><img src="https://lh4.googleusercontent.com/K7js6gYagS2IDwhqG2tMYCvxZNpks3Uzdnryds3Ih1UIELRI3atYNadzvRWZYfqrpV9a13YUg5pXVInL8SAJdfWsH6HeFrD9Tnrrz2_hUlOlcqUCrjw" height="487px;" width="564px;"></p>
<p>That’s what for source code acquisition. Now let’s proceed to the actual
build configurations. In the build section add ‘Build With Grails’ and
choose the Grails installation you want to use. Targets field contains
Grails commands that Hudson will execute. You can invoke several targets
in the same line, however, you need to enclose each command, including
its arguments and options, in double quotes.</p>
<p><img src="https://lh3.googleusercontent.com/U5BA5iTYNeUc6akKNQH5LnjtPQdY2FI1K6PJ3szz1PSID86eNCrx3RdRw4leb1IwEm9czv-20D-2L8Igu5nf7P1j4kEDMKPJiClZ0oBQiXjkg_J95TA" height="439px;" width="496px;"></p>
<p>Note the --non-interactive option. As you are running the script not
manually, but as an automated process, there's no one to answer the
questions like whether to install a missing plugin. The
--non-interactive option is the workaround for this issue. With this
option, any queries will be automatically answered with the default
option (which is usually a sensible choice), and the build will
continue.</p>
<p>The other fields may be left blank if this is the only job you are
running. But in case you have many simultaneous job executions it’s wise
to set different port and working directory, which Grails will be
operating on, for every separate build.</p>
<p>That’s all, a job for continuously testing your code is ready. But, of
course, this is not the limit as you can extend Hudson’s duties with
whatever you want, like deploying, code coverage reports, alerting on
fails and much more.</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Spring Security Grails plugin. Quick start and some tips]]></title><link href="http://www.sysgears.com/articles/spring-security-grails-plugin-quick-start-and-some-tips/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/spring-security-grails-plugin-quick-start-and-some-tips/</id><content type="html"><![CDATA[<p>Spring Security plugin is a fast and convenient solution for authorizing
user access. Almost every Grails web application uses it. In this
article I would like to provide a guide about how to apply this solution
quickly, and show you some tips that should be really useful for
beginners.</p>
<!--more-->
<p>So let’s download the plugin.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>grails install-plugin spring-security-core
</span></code></pre></td></tr></table></div></figure></p>
<p>Install output tells us "Next run the "s2-quickstart" script to
initialize Spring Security and create your domain classes.". If you
haven’t used this plugin before I strongly recommend you to run the
script. Classes that will be generated by the script will have some
properties and methods that are necessary or strongly recommended for
running the application powered by Spring Security. Actually, if you
know that in your application should be such feature as authorized user
access, you should run the script before constructing the domain model,
just trust my experience - this will save you a lot of time.</p>
<p>When you will run the script, it will ask you to run it with the
specification of the classes names that should be generated, so it could
generate domain User class, User’s Roles class and the User/Role
many-to-many join class. Also, script optionally offers to enter request
map class name, if you are beginner, let’s just move on, don’t worry
about the case if you will need it later, it’s easy to configure it by
yourself, we’ll get to that. Finally, let’s run the following command:
s2-quickstart com.sysgears.example User Role. Notice, that script also
generated controllers Login and Logout and the auth and denied GSP
pages. Auth is a user’s login page and denied is a page that will be
shown to user in case if he will try to access urls, to which he has no
access rights. The script will also add following lines to your
Config.groovy file:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>grails.plugins.springsecurity.userLookup.userDomainClassName <span class="o">=</span> <span class="s1">&#39;com.sysgears.example.User&#39;</span>
</span><span class='line'>grails.plugins.springsecurity.userLookup.authorityJoinClassName <span class="o">=</span> <span class="s1">&#39;com.sysgears.example.UserRole&#39;</span>
</span><span class='line'>grails.plugins.springsecurity.authority.className <span class="o">=</span> <span class="s1">&#39;com.sysgears.example.Role&#39;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>If you want to look at all the properties that could be configured here
and their detailed description, please read
<a href="http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/8%20User,%20Authority%20%28Role%29,%20and%20Requestmap%20Properties.html">
appropriate documentation section</a>. Now let’s get to adding the
access control. There are three ways to authorize access with the Spring
Security tools. These ways are to use @Secured annotations, intercept
URL map and the request map. Brief description of the first two tools
usage you may find at one of my previous posts:
<a href="/articles/filtering-user-access-grails">
http://sysgears.com/articles/filtering-user-access-grails</a> So also we
should talk about the request map. Basically it is the same tool as
intercept URL map. The only difference is that you may change or add
access configurations without the need of restarting the application,
and if you are not gonna use this feature, there is no need to use
request map. Anyway here is the example of usage. To use the request map
tool, in the Config.groovy file add the following code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>grails.plugins.springsecurity.requestMap.className <span class="o">=</span> <span class="s1">&#39;com.sysgears.example.SecurityMap&#39;</span>
</span><span class='line'>grails.plugins.springsecurity.securityConfigType <span class="o">=</span> SecurityConfigType.Requestmap
</span></code></pre></td></tr></table></div></figure></p>
<p>com.sysgears.example.SecurityMap is a class, which instances represents
URL access configuration. This class should look like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">example</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">SecurityMap</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">String</span> <span class="n">url</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">configAttribute</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">cache</span> <span class="kc">true</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">static</span> <span class="n">constraints</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">url</span> <span class="nl">blank:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">unique:</span> <span class="kc">true</span>
</span><span class='line'>       <span class="n">configAttribute</span> <span class="nl">blank:</span> <span class="kc">false</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>You will notice, that configuring is pretty similar to the intercept URL
map config type:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/js/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/css/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/images/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/login/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/logout/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/favicon.ico&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/admin/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;ROLE_ADMIN&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span><span class='line'><span class="k">new</span> <span class="nf">SecurityMap</span><span class="o">(</span><span class="nl">url:</span> <span class="s1">&#39;/*/**&#39;</span><span class="o">,</span> <span class="nl">configAttribute:</span> <span class="s1">&#39;ROLE_ADMIN, ROLE_USER&#39;</span><span class="o">).</span><span class="na">save</span><span class="o">(</span><span class="nl">flush:</span><span class="kc">true</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Spring security plugin also has a bunch of helper tools that should be
really helpful for your app. Controllers and services will often use the
Spring Security Service. For example, one of the most common usages is
to get username of current user, it can be done this way:
springSecurityService.authentication.name Another common usage is to
execute the code depending on whether user logged in or not.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'>   <span class="k">if</span> <span class="o">(!</span><span class="n">springSecurityService</span><span class="o">.</span><span class="na">isLoggedIn</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>       <span class="c1">//do something</span>
</span><span class='line'>   <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Another great helpers from the Spring Security plugin are taglibs. They
are used when you need to restrict the access to some information
directly at the GSP pages. In my applications I have a lot of this kind
of usages:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;sec:</span> <span class="err">ifLoggedIn</span><span class="nt">&gt;</span>You are logged in as ${user.username}<span class="err">&lt;</span>/sec: ifLoggedIn&gt;
</span><span class='line'><span class="nt">&lt;sec:ifAnyGranted</span> <span class="na">roles=</span><span class="s">&quot;ROLE_ADMIN&quot;</span><span class="nt">&gt;</span>Some admin info<span class="nt">&lt;/sec:ifAnyGranted&gt;</span>
</span><span class='line'><span class="nt">&lt;sec:ifNotLoggedIn&gt;</span>
</span><span class='line'>  <span class="nt">&lt;g:link</span> <span class="na">controller=</span><span class="s">&quot;login&quot;</span> <span class="na">action=</span><span class="s">&#39;index&#39;</span><span class="nt">&gt;</span>Login<span class="nt">&lt;/g:link&gt;</span>
</span><span class='line'>  <span class="nt">&lt;g:link</span> <span class="na">controller=</span><span class="s">&quot;register&quot;</span> <span class="na">action=</span><span class="s">&#39;index&#39;</span><span class="nt">&gt;</span>Sign Up<span class="nt">&lt;/g:link&gt;</span> 
</span><span class='line'><span class="nt">&lt;/sec:ifNotLoggedIn&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Sure, the text inside the tags is included to the page only if condition
specified in the tag is true. There are also a lot of stuff that will
help you to develop Spring Security powered application, for the full
information about, please read the
<a href="http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/6%20Helper%20Classes.html">
appropriate documentation section</a>.<br  />
When you will get your configured app to work you may run into this
problem. When user will login to the application, he may receive an
error: "HTTP Status 404. The requested resource (/favicon.ico) is not
available." To fix this you should specify
'IS<em>AUTHENTICATED</em>ANONYMOUSLY' rights for the URL ‘/favicon.ico’.
<a href="http://blog.idm.fr/2010/09/spring-security-redirecting-to-faviconico.html">
Here</a> is the detailed explanation of this issue.<br  />
The feature you may need to implement in your application immediately
without the detailed learning of the documentation is to use not only
username for user login. For example, it would be nice to give user the
ability to login using email. You may implement this feature this way:
create a service that will implement GrailsUserDetailsService interface
and include it to the Spring resources. Add the following code to the
conf/spring/resources.groovy:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">beans</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">userDetailsService</span><span class="o">(</span><span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">CustomUserDetailsService</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>To give user an ability to login with his email in the implemented
method loadUserByUsername(String username) user should be found this
way:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="na">findByUsernameOrEmail</span><span class="o">(</span><span class="n">username</span><span class="o">,</span> <span class="n">username</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>So code should look like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">CustomUserDetailsService</span> <span class="kd">implements</span> <span class="n">GrailsUserDetailsService</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="cm">/**</span>
</span><span class='line'><span class="cm">    * Some Spring Security classes (e.g. RoleHierarchyVoter) expect at least one role, so</span>
</span><span class='line'><span class="cm">    * we give a user with no granted roles this one which gets past that restriction but</span>
</span><span class='line'><span class="cm">    * doesn&#39;t grant anything.   </span>
</span><span class='line'><span class="cm">    */</span>
</span><span class='line'>   <span class="kd">static</span> <span class="kd">final</span> <span class="n">List</span> <span class="n">NO_ROLES</span> <span class="o">=</span> 
</span><span class='line'>           <span class="o">[</span><span class="k">new</span> <span class="n">GrantedAuthorityImpl</span><span class="o">(</span><span class="n">SpringSecurityUtils</span><span class="o">.</span><span class="na">NO_ROLE</span><span class="o">)]</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">UserDetails</span> <span class="nf">loadUserByUsername</span><span class="o">(</span><span class="n">String</span> <span class="n">username</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">loadRoles</span><span class="o">)</span> 
</span><span class='line'>           <span class="kd">throws</span> <span class="n">UsernameNotFoundException</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">return</span> <span class="nf">loadUserByUsername</span><span class="o">(</span><span class="n">username</span><span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">UserDetails</span> <span class="nf">loadUserByUsername</span><span class="o">(</span><span class="n">String</span> <span class="n">username</span><span class="o">)</span>
</span><span class='line'>           <span class="kd">throws</span> <span class="n">UsernameNotFoundException</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">User</span><span class="o">.</span><span class="na">withTransaction</span> <span class="o">{</span> <span class="n">status</span> <span class="o">-&gt;</span>
</span><span class='line'>       <span class="n">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="na">findByUsernameOrEmail</span><span class="o">(</span><span class="n">username</span><span class="o">,</span> <span class="n">username</span><span class="o">)</span>
</span><span class='line'>           <span class="k">if</span> <span class="o">(!</span><span class="n">user</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>               <span class="k">throw</span> <span class="k">new</span> <span class="nf">UsernameNotFoundException</span><span class="o">(</span><span class="s1">&#39;User not found&#39;</span><span class="o">,</span> 
</span><span class='line'>                       <span class="n">username</span><span class="o">)</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">authorities</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="na">authorities</span><span class="o">.</span><span class="na">collect</span> <span class="o">{</span> 
</span><span class='line'>               <span class="k">new</span> <span class="nf">GrantedAuthorityImpl</span><span class="o">(</span><span class="n">it</span><span class="o">.</span><span class="na">authority</span><span class="o">)</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>           <span class="k">return</span> <span class="k">new</span> <span class="nf">GrailsUser</span><span class="o">(</span><span class="n">user</span><span class="o">.</span><span class="na">username</span><span class="o">,</span>
</span><span class='line'>                   <span class="n">user</span><span class="o">.</span><span class="na">password</span><span class="o">,</span>
</span><span class='line'>                   <span class="n">user</span><span class="o">.</span><span class="na">enabled</span><span class="o">,</span>
</span><span class='line'>                   <span class="o">!</span><span class="n">user</span><span class="o">.</span><span class="na">accountExpired</span><span class="o">,</span>
</span><span class='line'>                   <span class="o">!</span><span class="n">user</span><span class="o">.</span><span class="na">passwordExpired</span><span class="o">,</span>
</span><span class='line'>                   <span class="o">!</span><span class="n">user</span><span class="o">.</span><span class="na">accountLocked</span><span class="o">,</span>
</span><span class='line'>                   <span class="n">authorities</span> <span class="o">?:</span> <span class="n">NO_ROLES</span><span class="o">,</span>
</span><span class='line'>                   <span class="n">user</span><span class="o">.</span><span class="na">id</span><span class="o">)</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Hope this quickstart guide was helpful for you, for more info please
read the
<a href="http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/index.html">
documentation</a>.</p>
<p>Andrey Shevchenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Groovy. Differences from Java]]></title><link href="http://www.sysgears.com/articles/groovy-differences-java/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/groovy-differences-java/</id><content type="html"><![CDATA[<p>Groovy is a popular object oriented dynamic language used by Grails web
application framework. Groovy is dynamically compiled to
<a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine"> </a>(JVM)
bytecode and interoperates with other Java code and libraries. It uses a
Java-like syntax and most Java code is also syntactically valid in
Groovy.</p>
<!--more-->
<p>If you are a Java developer and going to start writing grails
applications, Groovy is the first thing you meet. This article describes
Groovy syntax and differences between Groovy and Java.<br  /></p>
<p>Groovy beans. Groovy beans use much simpler syntax than Java beans. A
typical Java bean has constructor which doesn’t takes args, private
properties and getters / setters for them. For Groovy bean there is no
need to add getters and setters they will be added automatically, for
example the simple Groovy bean:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">firstName</span> <span class="c1">// bean property</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">lastName</span> <span class="c1">// bean property</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The bean initialization:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="n">User</span><span class="o">()</span>
</span><span class='line'><span class="n">user</span><span class="o">.</span><span class="na">firstName</span> <span class="o">=</span> <span class="s2">&quot;John&quot;</span>
</span><span class='line'><span class="n">user</span><span class="o">.</span><span class="na">lastName</span> <span class="o">=</span> <span class="s2">&quot;Doe&quot;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Also, you can set named properties in bean constructor:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="n">User</span><span class="o">(</span>
</span><span class='line'>        <span class="nl">firstName:</span> <span class="s2">&quot;John&quot;</span><span class="o">,</span> <span class="nl">lastName:</span> <span class="s2">&quot;Doe&quot;</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Notice, here Groovy calls setter methods for the fields firstName and
lastName.</p>
<p>You can declare your own getter and setter for a property:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">String</span> <span class="n">firstName</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">String</span> <span class="nf">getFirstName</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="s2">&quot;First name is $firstName&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">void</span> <span class="nf">setFirstName</span><span class="o">(</span><span class="n">String</span> <span class="n">firstName</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">firstName</span> <span class="o">=</span> <span class="s2">&quot;[$firstName]&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">user</span><span class="o">.</span><span class="na">firstName</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</span>
</span><span class='line'><span class="n">println</span> <span class="n">user</span><span class="o">.</span><span class="na">firstName</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The output is:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>First name is <span class="o">[</span>John<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Also, if you declare property name with an access modifier then the
getter and the setter won’t be generated.<br  /></p>
<p>Groovy closures. Java doesn’t support closures, but Groovy makes
possible to create functions that are first class objects. Thus, you can
define a code and then pass it around as if it was a variable. For
example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">// Simple closure</span>
</span><span class='line'><span class="kt">def</span> <span class="n">hello</span> <span class="o">=</span> <span class="o">{</span><span class="s2">&quot;Hello, $it!&quot;</span><span class="o">}</span>
</span><span class='line'><span class="k">assert</span> <span class="nf">hello</span><span class="o">(</span><span class="s1">&#39;Chris&#39;</span><span class="o">)</span> <span class="o">==</span> <span class="s1">&#39;Hello, Chris!&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Closure without any params</span>
</span><span class='line'><span class="kt">def</span> <span class="n">bye</span> <span class="o">=</span> <span class="o">{-&gt;</span><span class="s1">&#39;Bye!&#39;</span><span class="o">}</span>
</span><span class='line'><span class="k">assert</span> <span class="nf">bye</span><span class="o">()</span> <span class="o">==</span> <span class="s1">&#39;Bye!&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Closure with several params</span>
</span><span class='line'><span class="kt">def</span> <span class="n">niceHello</span> <span class="o">=</span> <span class="o">{</span><span class="n">firstName</span><span class="o">,</span> <span class="n">lastName</span> <span class="o">-&gt;</span> <span class="s2">&quot;Hello, $firstName $lastName!&quot;</span><span class="o">}</span>
</span><span class='line'><span class="k">assert</span> <span class="nf">niceHello</span><span class="o">(</span><span class="s1">&#39;Chris&#39;</span><span class="o">,</span> <span class="s1">&#39;Bennett&#39;</span><span class="o">)</span> <span class="o">==</span> <span class="s1">&#39;Hello, Chris Bennett!&#39;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>As you can see above, by default closures take one parameter called
"it", but you can also create closures with named parameters.<br  /></p>
<p>Groovy lists and maps. Groovy has build-in support for Lists and Maps.
The first native data structure is a List. Lists are used to store
ordered sets of data. For example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">// Empty list</span>
</span><span class='line'><span class="kt">def</span> <span class="n">emptyList</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Predefined list</span>
</span><span class='line'><span class="kt">def</span> <span class="n">list</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;One&#39;</span><span class="o">,</span> <span class="s1">&#39;Two&#39;</span><span class="o">,</span> <span class="s1">&#39;Three&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>You can get access to one element or to the range of elements that will
be returned as list:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">list</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;One&#39;</span><span class="o">,</span> <span class="s1">&#39;Two&#39;</span><span class="o">,</span> <span class="s1">&#39;Three&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Get the first element from the list</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;One&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Get elements range from the list</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">[</span><span class="mi">1</span><span class="o">..</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="o">[</span><span class="s1">&#39;Two&#39;</span><span class="o">,</span> <span class="s1">&#39;Three&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Get another range</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">[-</span><span class="mi">1</span><span class="o">..-</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="o">[</span><span class="s1">&#39;Three&#39;</span><span class="o">,</span> <span class="s1">&#39;Two&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Get set from the list</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">[</span><span class="mi">0</span><span class="o">,</span> <span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="o">[</span><span class="s1">&#39;One&#39;</span><span class="o">,</span> <span class="s1">&#39;Three&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>There are several operation you can do with list:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">// Get list size</span>
</span><span class='line'><span class="kt">def</span> <span class="n">list</span> <span class="o">=</span> <span class="o">[</span><span class="mi">3</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">]</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="mi">3</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Iterate through list</span>
</span><span class='line'><span class="kt">def</span> <span class="n">emptyList</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'><span class="n">list</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span><span class="n">emptyList</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;$it!&quot;</span><span class="o">}</span>
</span><span class='line'><span class="k">assert</span> <span class="n">emptyList</span> <span class="o">==</span> <span class="o">[</span><span class="s1">&#39;3!&#39;</span><span class="o">,</span> <span class="s1">&#39;1!&#39;</span><span class="o">,</span> <span class="s1">&#39;2!&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Iterate through list and transform each entry into a new value </span>
</span><span class='line'><span class="c1">// using the closure</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">.</span><span class="na">collect</span> <span class="o">{</span><span class="n">it</span> <span class="o">*</span> <span class="mi">2</span><span class="o">}</span> <span class="o">==</span> <span class="o">[</span><span class="mi">6</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">4</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Sort using closure as comparator</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">.</span><span class="na">sort</span> <span class="o">{</span><span class="n">it1</span><span class="o">,</span> <span class="n">it2</span> <span class="o">-&gt;</span> <span class="n">it1</span> <span class="o">&lt;=&gt;</span> <span class="n">it2</span><span class="o">}</span> <span class="o">==</span> <span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Get min or max using closure as comparator</span>
</span><span class='line'><span class="k">assert</span> <span class="n">list</span><span class="o">.</span><span class="na">min</span> <span class="o">{</span><span class="n">it1</span><span class="o">,</span> <span class="n">it2</span> <span class="o">-&gt;</span> <span class="n">it1</span> <span class="o">&lt;=&gt;</span> <span class="n">it2</span><span class="o">}</span> <span class="o">==</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Map is another native data structure. It’s used to store associative
heterogeneous key-value arrays. For example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">// Empty map</span>
</span><span class='line'><span class="kt">def</span> <span class="n">emptyMap</span> <span class="o">=</span> <span class="o">[:]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Predefined map</span>
</span><span class='line'><span class="kt">def</span> <span class="n">map</span> <span class="o">=</span> <span class="o">[</span><span class="nl">John:</span> <span class="mi">10</span><span class="o">,</span> <span class="nl">Mark:</span> <span class="mi">20</span><span class="o">,</span> <span class="nl">Peter:</span> <span class="s1">&#39;Not defined&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Each of the values stored in the map can be of a different type. You can
get access to the map value in two main ways, using the bean style or
array style:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">map</span> <span class="o">=</span> <span class="o">[</span><span class="nl">John:</span> <span class="mi">10</span><span class="o">,</span> <span class="nl">Mark:</span> <span class="mi">20</span><span class="o">,</span> <span class="nl">Peter:</span> <span class="s1">&#39;Not defined&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Array style</span>
</span><span class='line'><span class="k">assert</span> <span class="n">map</span><span class="o">[</span><span class="s1">&#39;Peter&#39;</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;Not defined&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Bean style</span>
</span><span class='line'><span class="k">assert</span> <span class="n">map</span><span class="o">.</span><span class="na">Mark</span> <span class="o">==</span> <span class="mi">20</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Also you can preset default value that will be returned by </span>
</span><span class='line'><span class="c1">// get method if key doesnât exist</span>
</span><span class='line'><span class="k">assert</span> <span class="n">map</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s1">&#39;Michael&#39;</span><span class="o">,</span> <span class="mi">100</span><span class="o">)</span> <span class="o">==</span> <span class="mi">100</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>There are available similar set of operations:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">// Iterate over all the entries in a Map</span>
</span><span class='line'><span class="kt">def</span> <span class="n">emptyMap</span> <span class="o">=</span> <span class="o">[:]</span>
</span><span class='line'><span class="kt">def</span> <span class="n">map</span> <span class="o">=</span> <span class="o">[</span><span class="nl">John:</span> <span class="mi">10</span><span class="o">,</span> <span class="nl">Mark:</span> <span class="mi">20</span><span class="o">,</span> <span class="nl">Peter:</span> <span class="s1">&#39;Not defined&#39;</span><span class="o">]</span>
</span><span class='line'><span class="n">map</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span> <span class="n">key</span><span class="o">,</span> <span class="n">value</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="n">emptyMap</span><span class="o">.</span><span class="na">put</span> <span class="n">key</span><span class="o">,</span> <span class="s2">&quot;$key: $value&quot;</span> <span class="k">as</span> <span class="n">String</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="k">assert</span> <span class="n">emptyMap</span> <span class="o">==</span> <span class="o">[</span><span class="nl">John:</span> <span class="s1">&#39;John: 10&#39;</span><span class="o">,</span> <span class="nl">Mark:</span> <span class="s1">&#39;Mark: 20&#39;</span><span class="o">,</span> 
</span><span class='line'>        <span class="nl">Peter:</span> <span class="s1">&#39;Peter: Not defined&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Iterate through map entries and transform each entry into </span>
</span><span class='line'><span class="c1">// a new value using the closure, return a list of transformed values</span>
</span><span class='line'><span class="k">assert</span> <span class="n">map</span><span class="o">.</span><span class="na">collect</span> <span class="o">{</span> <span class="n">key</span><span class="o">,</span> <span class="n">value</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="s2">&quot;$key: $value&quot;</span>
</span><span class='line'><span class="o">}</span> <span class="o">==</span> <span class="o">[</span><span class="s1">&#39;John: 10&#39;</span><span class="o">,</span> <span class="s1">&#39;Mark: 20&#39;</span><span class="o">,</span> <span class="s1">&#39;Peter: Not defined&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Sort the map elements into a new ordered map using the closure as </span>
</span><span class='line'><span class="c1">// a comparator</span>
</span><span class='line'><span class="n">map</span><span class="o">.</span><span class="na">put</span> <span class="s1">&#39;Chris&#39;</span><span class="o">,</span> <span class="mi">15</span>
</span><span class='line'><span class="k">assert</span> <span class="n">map</span><span class="o">.</span><span class="na">sort</span> <span class="o">{</span> <span class="n">e1</span><span class="o">,</span> <span class="n">e2</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="n">e1</span><span class="o">.</span><span class="na">key</span> <span class="o">&lt;=&gt;</span> <span class="n">e2</span><span class="o">.</span><span class="na">key</span>
</span><span class='line'><span class="o">}</span> <span class="o">==</span> <span class="o">[</span><span class="nl">John:</span> <span class="mi">10</span><span class="o">,</span> <span class="nl">Chris:</span> <span class="mi">15</span><span class="o">,</span> <span class="nl">Mark:</span> <span class="mi">20</span><span class="o">,</span> <span class="nl">Peter:</span> <span class="s1">&#39;Not defined&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The ‘.*’ operator. It allows to perform operations on all the members of
a collection:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="k">assert</span> <span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <span class="o">==</span> <span class="o">[</span><span class="s1">&#39;a&#39;</span><span class="o">,</span> <span class="s1">&#39;ab&#39;</span><span class="o">,</span> <span class="s1">&#39;abc&#39;</span><span class="o">]*.</span><span class="na">size</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Other important differences from Java.</p>
<ul>
<li>In Groovy boolean operator == means equals on all types. Unlike Java
where == means equality for primitive types and identity for objects. If
you need the identity, you should use the method "is":</li>
</ul>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="k">assert</span> <span class="o">[]</span> <span class="o">==</span> <span class="o">[]</span>
</span><span class='line'><span class="k">assert</span> <span class="o">![].</span><span class="na">is</span><span class="o">([])</span>
</span></code></pre></td></tr></table></div></figure></p>
<ul>
<li>The return keyword is optional at the end of the methods:</li>
</ul>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="nf">foo</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// do something</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">something</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="c1">// is equals to</span>
</span><span class='line'><span class="kt">def</span> <span class="nf">bar</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// do something</span>
</span><span class='line'>    <span class="n">something</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Geb/Spock functional testing in Grails]]></title><link href="http://www.sysgears.com/articles/gebspock-functional-testing-grails/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/gebspock-functional-testing-grails/</id><content type="html"><![CDATA[<p>At our company’s blog we have already considered many types of the
Grails testing. But there are yet one testing type, on which we have to
take a look at. In this article we will check out the overview of
writing functional tests using Geb/Spock technologies.</p>
<!--more-->
<p>Geb and Spock is a young and fast developing technologies. Spock
provides fast and convenient test writing. And Geb provides testing of
the web application by the HTMLUnit and the real browsers web drivers.
Let’s look how it works.<br  />
At first, let’s install geb and spock plugins.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>grails install-plugin geb
</span><span class='line'>grails install-plugin spock
</span></code></pre></td></tr></table></div></figure></p>
<p>Then you should specify following code in your BuildConfig.groovy
dependencies
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">dependencies</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">test</span><span class="o">(</span><span class="s2">&quot;org.seleniumhq.selenium:selenium-htmlunit-driver:2.0rc3&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">exclude</span> <span class="s2">&quot;xml-apis&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="n">test</span><span class="o">(</span><span class="s2">&quot;org.seleniumhq.selenium:selenium-chrome-driver:2.0rc3&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="n">test</span><span class="o">(</span><span class="s2">&quot;org.seleniumhq.selenium:selenium-firefox-driver:2.0rc3&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="n">test</span> <span class="s2">&quot;org.codehaus.geb:geb-spock:0.6.0&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>At the test running stage you may experience some troubles because of
conflict between this plugins and some others you have already installed
to your project, one of this conflict related to "release" plugin usage.
For me, adding of the following lines to the build config worked.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">dependencies</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">//code weâve already specified</span>
</span><span class='line'>    <span class="n">build</span><span class="o">(</span><span class="s1">&#39;net.sourceforge.nekohtml:nekohtml:1.9.14&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">excludes</span> <span class="s2">&quot;xml-apis&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">plugins</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">build</span><span class="o">(</span><span class="s1">&#39;:release:1.0.0.M3&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">excludes</span> <span class="s2">&quot;svn&quot;</span><span class="o">,</span> <span class="s1">&#39;nekohtml&#39;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now, when we have everything ready, let’s get down to business.
Unfortunately, as you may already notice, grails has nothing like grails
create-functional-test, so you should create functional tests by
yourself, specifying them at the directory test/functional or use this
solution
<a href="http://adhockery.blogspot.com/2010/08/auto-generate-spock-specs-for-grails.html">
http://adhockery.blogspot.com/2010/08/auto-generate-spock-specs-for-grails.html
</a>.<br  />
The next step would be the creating page objects that you are going to
use in your tests. Let’s write a simple test that is gonna test the
login page generated by spring security.<br  />
Login page HTML looks as follows:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;form</span> <span class="na">action=</span><span class="s">&#39;${postUrl}&#39;</span> <span class="na">method=</span><span class="s">&#39;POST&#39;</span> <span class="na">id=</span><span class="s">&quot;loginForm&quot;</span> <span class="na">name=</span><span class="s">&quot;loginForm&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">&quot;form_label&quot;</span><span class="nt">&gt;&lt;g:message</span> <span class="na">code=</span><span class="s">&#39;ex.ui.login.auth.username&#39;</span> <span class="na">default=</span><span class="s">&quot;Username&quot;</span><span class="nt">/&gt;&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;login&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;j_username&quot;</span> <span class="na">id=</span><span class="s">&quot;username&quot;</span> <span class="na">size=</span><span class="s">&quot;15&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/span&gt;&lt;/p&gt;</span>
</span><span class='line'>       
</span><span class='line'>  <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">&quot;form_label&quot;</span><span class="nt">&gt;&lt;g:message</span> <span class="na">code=</span><span class="s">&#39;ex.ui.login.auth.password&#39;</span> <span class="na">default=</span><span class="s">&quot;Password&quot;</span><span class="nt">/&gt;&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;login&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;password&quot;</span> <span class="na">name=</span><span class="s">&quot;j_password&quot;</span> <span class="na">id=</span><span class="s">&quot;password&quot;</span> <span class="na">size=</span><span class="s">&quot;15&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/span&gt;&lt;/p&gt;</span>
</span><span class='line'>       
</span><span class='line'>  <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;checkbox&quot;</span> <span class="na">class=</span><span class="s">&quot;checkbox&quot;</span> <span class="na">name=</span><span class="s">&quot;${rememberMeParameter}&quot;</span> <span class="na">id=</span><span class="s">&quot;remember_me&quot;</span> <span class="na">checked=</span><span class="s">&quot;checked&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;label</span> <span class="na">for=</span><span class="s">&quot;remember_me&quot;</span><span class="nt">&gt;&lt;g:message</span> <span class="na">code=</span><span class="s">&#39;ex.ui.login.auth.remember&#39;</span> <span class="na">default=</span><span class="s">&quot;Remember me&quot;</span><span class="nt">/&gt;&lt;/label&gt;</span>
</span><span class='line'>  <span class="nt">&lt;g:submitButton</span> <span class="na">name=</span><span class="s">&quot;loginBtn&quot;</span> <span class="na">value=</span><span class="s">&quot;${message(code:&#39;ex.ui.login.auth.loginBtn&#39;)}&quot;</span><span class="nt">/&gt;</span>    
</span><span class='line'><span class="nt">&lt;/form&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>We’re gonna use login page and the home page at our test. Their objects
should look like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">pages</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">geb.Page</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">ViewUserPage</span> <span class="kd">extends</span> <span class="n">Page</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;admin/view&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">at</span> <span class="o">=</span> <span class="o">{</span> <span class="n">title</span> <span class="o">==</span> <span class="s2">&quot;Users&quot;</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">content</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">pages</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">geb.Page</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">LoginPage</span> <span class="kd">extends</span> <span class="n">Page</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;login/auth&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">at</span> <span class="o">=</span> <span class="o">{</span> <span class="n">title</span> <span class="o">==</span> <span class="s2">&quot;Login&quot;</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">content</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">loginForm</span> <span class="o">{</span> <span class="n">$</span><span class="o">(</span><span class="s2">&quot;form&quot;</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>       <span class="n">loginButton</span> <span class="o">{</span> <span class="n">$</span><span class="o">(</span><span class="s2">&quot;input&quot;</span><span class="o">,</span> <span class="nl">value:</span> <span class="s2">&quot;Login&quot;</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Let’s take a closer look at the properties: "at" closure specifies a
condition when this is a current page. Values at the "content" property
helps us to access the page elements in the tests. Notice, that access
to the elements is provided in jQuery-like language, that makes
accessing the elements extremely convenient. Now, let’s check out the
test example.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">example</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">geb.spock.GebReportingSpec</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">spock.lang.Stepwise</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">com.sysgears.example.pages.*</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@Stepwise</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">LoginAuthSpec</span> <span class="kd">extends</span> <span class="n">GebReportingSpec</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">String</span> <span class="nf">getBaseUrl</span><span class="o">()</span> <span class="o">{</span> <span class="s2">&quot;http://localhost:8080/&quot;</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">File</span> <span class="nf">getReportDir</span><span class="o">()</span> <span class="o">{</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s2">&quot;target/reports/geb&quot;</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="s2">&quot;invalid login&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="nl">given:</span> <span class="s2">&quot;I am at the login page&quot;</span>
</span><span class='line'>       <span class="n">to</span> <span class="n">LoginPage</span>
</span><span class='line'>
</span><span class='line'>       <span class="nl">when:</span> <span class="s2">&quot;I am entering invalid password&quot;</span>
</span><span class='line'>       <span class="n">loginForm</span><span class="o">.</span><span class="na">j_username</span> <span class="o">=</span> <span class="s2">&quot;admin&quot;</span>
</span><span class='line'>       <span class="n">loginForm</span><span class="o">.</span><span class="na">j_password</span> <span class="o">=</span> <span class="s2">&quot;ioguffwf&quot;</span>
</span><span class='line'>       <span class="n">loginButton</span><span class="o">.</span><span class="na">click</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>       <span class="nl">then:</span> <span class="s2">&quot;I am being redirected to the login page, the password I entered is wrong&quot;</span>
</span><span class='line'>       <span class="n">at</span> <span class="n">LoginPage</span>
</span><span class='line'>       <span class="n">loginForm</span><span class="o">.</span><span class="na">j_username</span> <span class="o">==</span> <span class="s2">&quot;admin&quot;</span>
</span><span class='line'>       <span class="o">!</span><span class="n">loginForm</span><span class="o">.</span><span class="na">j_password</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    
</span><span class='line'>    <span class="kt">def</span> <span class="s2">&quot;admin login&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">given</span> <span class="o">:</span> <span class="s2">&quot;I am at the login page&quot;</span>
</span><span class='line'>       <span class="n">to</span> <span class="n">LoginPage</span>
</span><span class='line'>
</span><span class='line'>       <span class="nl">when:</span> <span class="s2">&quot;I am entering valid username and password&quot;</span>
</span><span class='line'>       <span class="n">loginForm</span><span class="o">.</span><span class="na">j_username</span> <span class="o">=</span> <span class="s2">&quot;admin&quot;</span>
</span><span class='line'>       <span class="n">loginForm</span><span class="o">.</span><span class="na">j_password</span> <span class="o">=</span> <span class="s2">&quot;1234&quot;</span>
</span><span class='line'>       <span class="n">loginButton</span><span class="o">.</span><span class="na">click</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>       <span class="nl">then:</span> <span class="s2">&quot;I am being redirected to the admin homepage&quot;</span>
</span><span class='line'>       <span class="n">at</span> <span class="n">ViewUserPage</span>
</span><span class='line'>       <span class="n">$</span><span class="o">().</span><span class="na">text</span><span class="o">().</span><span class="na">contains</span><span class="o">(</span><span class="s2">&quot;You are logged in as admin&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Let’s take a closer look. Test methods here breaked on the sections
given, when and then. 'Given' gives initial conditions for the test,
'when' specifies test behaviour and 'then' checks assertions at the end
of the test. Test methods: to() method sends HTTP request to the URL,
that was specified in url property of the page object; at() method
checks whether specified page is current or not, for doing this
condition specified at the "at" property is being used. Notice that you
may access HTML elements not only via those values, which was defined in
content property, but also access them directly from the test.<br  />
For more examples please see this examples from the Geb
<a href="https://github.com/geb/geb-example-grails">
https://github.com/geb/geb-example-grails</a> . Also Geb book should be
very useful <a href="http://www.gebish.org/manual/current/">
http://www.gebish.org/manual/current/</a></p>
<p>Andrey Shevchenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Introduction to Git]]></title><link href="http://www.sysgears.com/articles/introduction-git/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/introduction-git/</id><content type="html"><![CDATA[<p>Git is a version control system, that was designed by Linus Torvalds,
first released in 2005. In opposite to CVS (concurrent version systems)
systems, which in it’s basics have a file as a processing item, in the
Git basics lays work with the set of changes, other words, patches. This
article dedicated to that persons, that is already familiar with the
version control systems, such as SVN, and wants to know more about
alternative version control solutions and persons that wants to get a
tutorials about quick migration to the Git.</p>
<!--more-->
<p>First difference that comes into view, is that Git is oriented to work
with the local repositories. So basic operations, like commit are
performed for the local repository on your computer. Let’s take a simple
guide for the basic operations you gonna use. Checking out the project
copy from the repository on the server is performed by operation git
clone.</p>
<p>git clone gitosis@git.yourserver.com:yourproject.git
/home/homeDir/myProject</p>
<p>Now you have local copy of the repository in myProject directory and you
are going to work on some new feature. The best practice of doing it is
to create a new branch. By default, after you have cloned the
repository, you are at the branch called master, you may tell that,
after viewing the branches with the command git branch -a. Active branch
is marked by the star. You may create new branch with the command git
branch.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#creating new branch &#39;feature&#39;</span>
</span><span class='line'>git branch feature
</span><span class='line'><span class="c">#switching to the branch that you created</span>
</span><span class='line'>git checkout feature
</span><span class='line'><span class="c">#or do the same operations in one line</span>
</span><span class='line'>git checkout -b feature
</span></code></pre></td></tr></table></div></figure></p>
<p>Notice that this operation didn’t create a new directory. All required
info is in the .git directory. Using of the local branches very
convenient. Imagine that you work on some serious feature, that isn’t
done yet, project isn’t currently work as it should and you need to make
a quick bugfix on the production version. I know that this is a
nightmare for everyone that have used the CVS. But in Git, you simply
switching the branch for example to the master running this command:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git checkout master
</span></code></pre></td></tr></table></div></figure></p>
<p>Do the bugfix, commit the changes and get back to work on your feature.
The only moment about switching the branch is if you haven't done that
part of work yet, that could be a commit, but you need to switch the
branch now, or you need to make some other changes to current branch,
you will need to use stashing first. To reset your working tree and save
your changes to the stash, apply this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git stash save âWork in progress <span class="k">for </span>feature fooâ
</span></code></pre></td></tr></table></div></figure></p>
<p>Now you may do the bugfix or something like this, commit the changes and
now return to working on your feature.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git apply stash
</span></code></pre></td></tr></table></div></figure></p>
<p>This will return the changes you’ve stashed. In case if you have stashed
more than one feature, you may list all of them running command
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git stash list
</span></code></pre></td></tr></table></div></figure></p>
<p>and return one, specifying the stash you want this way:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git stash apply stash@<span class="o">{</span>1<span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now let’s talk about interacting with the remote repository. As I said
before, commit is performed on your computer, so how to get your changes
to the remote repository? It is actually done in three stages. First,
when you create some file in the project, it is untracked, and when you
will commit the changes, the untracked files won’t be commited. Here are
the basic commands that are used for indexing:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#indexing newFile file</span>
</span><span class='line'>git add newFile
</span><span class='line'><span class="c">#reset index for newFile file </span>
</span><span class='line'>git rm newFile
</span><span class='line'><span class="c">#indexes all the untracked files</span>
</span><span class='line'>git add .
</span></code></pre></td></tr></table></div></figure></p>
<p>To look at the indexed files that awaits commit, and files that are not
indexed yet on the current branch use command git status.<br  />
In every development process,  there are some files that shouldn't be on
the server, like files, created by the development framework, or files
in out/ and target/ directories, that contains compiled files. If you
will not ignore them, command git add . becomes useless. To ignore some
files, create a file named .gitignore in the top level directory of your
project. For example, you want to exclude files with extension .foo and
to exclude all the files in directory /out, so your gitignore file
should be look like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>*.foo
</span><span class='line'>/out
</span></code></pre></td></tr></table></div></figure></p>
<p>Now, when you will run git status, it won’t show you excluded files as
ones that awaits indexing. Now, you are ready to commit the changes.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#commits and writes a commit message</span>
</span><span class='line'>git commit -m <span class="s2">&quot;Initial commit&quot;</span>
</span><span class='line'><span class="c">#indexing all the untracked files, commits and writes a commit message</span>
</span><span class='line'>git commit -a -m <span class="s2">&quot;Initial commit&quot;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now you have several options available, depending on how you are
planning to use this branch. If you are the only person that is gonna
work with the branch, switch to the master branch, and run
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git merge feature
</span></code></pre></td></tr></table></div></figure></p>
<p>That will merge the changes, made in feature branch to the master
branch. Next, and the last step to get your changes on the server, run
the command
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git push
</span></code></pre></td></tr></table></div></figure></p>
<p>If you are already finished the work in branch, you may delete it:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git branch -d feature
</span></code></pre></td></tr></table></div></figure></p>
<p>But what if several people are going to work with the branch you
created? In this case, you should push the branch to the server.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git push origin feature:refs/heads/feature
</span></code></pre></td></tr></table></div></figure></p>
<p>Where origin is the repository name, refs/heads/feature is the path to
the branch description, that is placed in the /.git directory. In the
last versions of Git, you may use
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git push origin feature:feature.
</span></code></pre></td></tr></table></div></figure></p>
<p>Further, you may update the branch this way:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git pull origin feature
</span></code></pre></td></tr></table></div></figure></p>
<p>In case if you want to join the development for one of the branches run
this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git checkout --track -b feature origin/feature
</span></code></pre></td></tr></table></div></figure></p>
<p>This will create local branch feature and switch to it.<br  />
Another convenience about Git is how reverting of the changes
implemented here. In case if you haven’t commited undesirable changes
yet, you may revert the working tree by running this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git reset --hard HEAD
</span></code></pre></td></tr></table></div></figure></p>
<p>For restoring one file run following commands:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git checkout -- foo.bar
</span><span class='line'>git checkout HEAD foo.bar
</span></code></pre></td></tr></table></div></figure></p>
<p>If you have already commited one, but changes are not public yet, you
may modify the last commit with the new one, just use flag --amend while
commiting. But if the changes are already public, you should never use
it. In this case use
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git revert HEAD
</span></code></pre></td></tr></table></div></figure></p>
<p>It will create commit, that is undoing all the changes in HEAD.<br  />
So this is the basics you should know to start working with Git. To
learn more about Git, please read http://book.git-scm.com</p>
<p>Andrey Shevchenko,<br  />
SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Tag Libraries in Grails]]></title><link href="http://www.sysgears.com/articles/tag-libraries-grails/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/tag-libraries-grails/</id><content type="html"><![CDATA[<p>Grails GSP supports the concept of custom tag libraries, a custom
actions which are invoked by using a custom tags in a GSP page.</p>
<!--more-->
<p><strong>Basics.</strong> TagLib is a Groovy class that ends with the convention
TagLib and placed within the grails-app/taglib directory. Tag is a
property that is assigned a block of code that takes the tag attributes
and the body content.</p>
<p>Following example demonstrates a simple TagLib that contains tag <em>
formatProduct</em> for product instances formatting, each product
instance has code and name:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductTagLib</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="cm">/**</span>
</span><span class='line'><span class="cm">    * @attr product</span>
</span><span class='line'><span class="cm">    */</span>
</span><span class='line'>   <span class="kt">def</span> <span class="n">formatProduct</span> <span class="o">=</span> <span class="o">{</span> <span class="n">attrs</span><span class="o">,</span> <span class="n">body</span> <span class="o">-&gt;</span>
</span><span class='line'>       <span class="n">out</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;&lt;div id=\&quot;${attrs.product.code}\&quot;&gt; \</span>
</span><span class='line'><span class="s2">Name: ${attrs.product.name} &lt;/div&gt;&quot;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The GSP page code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">&lt;</span><span class="nl">g:</span><span class="n">formatProduct</span> <span class="n">product</span><span class="o">=</span><span class="s2">&quot;${product}&quot;</span> <span class="o">/&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The <em>attrs</em> argument is an attributes map of the tag. The <em>
body</em> argument returns body content when invoked.</p>
<p>Also TagLib may use a grails template for formatting an output:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductTagLib</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="cm">/**</span>
</span><span class='line'><span class="cm">    * @attr product</span>
</span><span class='line'><span class="cm">    */</span>
</span><span class='line'>   <span class="kt">def</span> <span class="n">formatProduct</span> <span class="o">=</span> <span class="o">{</span> <span class="n">attrs</span><span class="o">,</span> <span class="n">body</span> <span class="o">-&gt;</span>
</span><span class='line'>       <span class="n">out</span> <span class="o">&lt;&lt;</span> <span class="n">render</span><span class="o">(</span><span class="nl">template:</span> <span class="s2">&quot;/includes/productTemplate&quot;</span><span class="o">,</span> 
</span><span class='line'>               <span class="nl">model:</span> <span class="o">[</span><span class="nl">product:</span> <span class="n">attrs</span><span class="o">.</span><span class="na">product</span><span class="o">])</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The template content:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">&lt;</span><span class="n">div</span> <span class="n">id</span><span class="o">=</span><span class="s2">&quot;${product.code}&quot;</span><span class="o">&gt;</span> <span class="nl">Name:</span> <span class="n">$</span><span class="o">{</span><span class="n">product</span><span class="o">.</span><span class="na">name</span><span class="o">}</span> <span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><strong>Reference a tag variable</strong><strong>.</strong> You are able to reference a tag
variable within the body of the tag<strong>:</strong>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductTagLib</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="cm">/**</span>
</span><span class='line'><span class="cm">    * @attr times</span>
</span><span class='line'><span class="cm">    * @attr iterator</span>
</span><span class='line'><span class="cm">    */</span>
</span><span class='line'>   <span class="kt">def</span> <span class="n">iterate</span> <span class="o">=</span> <span class="o">{</span> <span class="n">attrs</span><span class="o">,</span> <span class="n">body</span> <span class="o">-&gt;</span>
</span><span class='line'>       <span class="n">attrs</span><span class="o">.</span><span class="na">times</span><span class="o">?.</span><span class="na">toInteger</span><span class="o">().</span><span class="na">times</span> <span class="o">{</span> <span class="n">it</span> <span class="o">-&gt;</span>
</span><span class='line'>           <span class="n">out</span> <span class="o">&lt;&lt;</span> <span class="n">body</span><span class="o">((</span><span class="n">attrs</span><span class="o">.</span><span class="na">iterator</span> <span class="o">?</span> <span class="n">attrs</span><span class="o">.</span><span class="na">iterator</span> <span class="o">:</span> <span class="s2">&quot;i&quot;</span><span class="o">):</span><span class="n">it</span><span class="o">)</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The GSP page code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">&lt;</span><span class="nl">g:</span><span class="n">iterate</span> <span class="n">times</span><span class="o">=</span><span class="s2">&quot;3&quot;</span> <span class="n">iterator</span><span class="o">=</span><span class="s2">&quot;j&quot;</span><span class="o">&gt;</span><span class="n">Iterated</span> <span class="n">$</span><span class="o">{</span><span class="n">j</span><span class="o">}</span> <span class="n">times</span><span class="o">&lt;/</span><span class="nl">g:</span><span class="n">iterate</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The same code without predefined iterator, then iterator i will be used
by default:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">&lt;</span><span class="nl">g:</span><span class="n">iterate</span> <span class="n">times</span><span class="o">=</span><span class="s2">&quot;3&quot;</span><span class="o">&gt;</span><span class="n">Iterated</span> <span class="n">$</span><span class="o">{</span><span class="n">i</span><span class="o">}</span> <span class="n">times</span><span class="o">&lt;/</span><span class="nl">g:</span><span class="n">iterate</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Here you can predefine name of the iterator that will be passed into the
body invocation:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">out</span> <span class="o">&lt;&lt;</span> <span class="n">body</span><span class="o">((</span><span class="n">nameToPredefine</span><span class="o">):</span><span class="n">it</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><strong>Namespaces.</strong> By default, all of the custom tags are added to the
default Grails namespace and are used with the g: prefix in GSP pages.
To specify a different namespace you should add a static property
namespace to your TagLib class:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductTagLib</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">static</span> <span class="n">namespace</span> <span class="o">=</span> <span class="s2">&quot;prod&quot;</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now the tag lib must be referenced from GSP pages like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">&lt;</span><span class="nl">prod:</span><span class="n">iterate</span> <span class="err">â¦</span> <span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><strong>TagLib unit testing.</strong> For TagLib unit testing the TagLibUnitTestCase
class is used. It calls mockTagLib method on test set up which adds mock
versions of the dynamic taglib properties and methods to the given
class:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductTagLibTests</span> <span class="kd">extends</span> <span class="n">TagLibUnitTestCase</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">ProductTagLibTests</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="kd">super</span><span class="o">(</span><span class="n">ProductTagLib</span><span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">void</span> <span class="nf">testIterate</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">tagLib</span><span class="o">.</span><span class="na">iterate</span><span class="o">(</span><span class="nl">times:</span> <span class="s1">&#39;2&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="s1">&#39;text_&#39;</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="s1">&#39;text_text_&#39;</span><span class="o">,</span> <span class="n">tagLib</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">toString</span><span class="o">()</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><strong>Predefined variables.</strong> There are predefined variables within a tag
library scope:</p>
<ul>
<li>out - response writer for writing to the output stream</li>
<li>params - params object from which the request parameters can be
retrieved</li>
<li>flash - flash object</li>
<li>actionName - name of currently executed action</li>
<li>controllerName - name of currently executed controller</li>
<li>pluginContextPath - The context path to the plug-in that contains the
tag library</li>
<li>grailsApplication - instance of grails application</li>
</ul>
<p>Also it includes request (HttpServletRequest), response
(HttpServletResponse), servletContext (ServletContext) and session
(HttpSession) variables.</p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Grails unit testing]]></title><link href="http://www.sysgears.com/articles/grails-unit-testing/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/grails-unit-testing/</id><content type="html"><![CDATA[<p>Unit testing is a method by which an individual blocks of code or code
"units" are tested without considering for surrounding infrastructure.
The main approach of the testing is to isolate each part of the code and
show that the individual parts are correct.</p>
<!--more-->
<p>Grails does not inject any of the dynamic methods in unit tests. The
core of the testing plugin is the grails.test.GrailsUnitTestCase class.
This is a sub-class of GroovyTestCase. A <em>GroovyTestCase</em> is a
Groovy facade over a JUnit test, thereby the <em>GroovyTestCase</em>
works like the JUnit <em>TestCase</em>. The <em>GrailsUnitTestCas</em>e
offers the following mock methods:</p>
<ul>
<li>mockDomain()</li>
<li>mockFor()</li>
<li>mockForConstraintsTest()</li>
<li>mockLogging()</li>
<li>mockConfig()</li>
<li>mockController()</li>
<li>mockTagLib()</li>
</ul>
<p>The mockDomain is a method of <em>GrailsUnitTestCase</em>, that helps to
mock a domain class (makes mock implementations of all the domain class
methods). It also mocks most of the injected methods of the domain class
like save(), validate(), delete(), get(), etc. For example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">Product</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">code</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">name</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">static</span> <span class="n">constraints</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">code</span> <span class="nl">blank:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">unique:</span> <span class="kc">true</span>
</span><span class='line'>       <span class="n">name</span> <span class="nl">blank:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">minSize:</span> <span class="mi">3</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">table</span> <span class="s1">&#39;products&#39;</span>
</span><span class='line'>       <span class="n">version</span> <span class="kc">false</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductService</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">def</span> <span class="nf">saveProduct</span><span class="o">(</span><span class="n">String</span> <span class="n">code</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">new</span> <span class="nf">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="n">code</span><span class="o">,</span> <span class="nl">name:</span> <span class="n">name</span><span class="o">).</span><span class="na">save</span><span class="o">()</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">def</span> <span class="nf">productCount</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">Product</span><span class="o">.</span><span class="na">count</span><span class="o">()</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductServiceTests</span> <span class="kd">extends</span> <span class="n">GrailsUnitTestCase</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">void</span> <span class="nf">testSaveProduct</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">mockDomain</span><span class="o">(</span><span class="n">Product</span><span class="o">)</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="n">Product</span><span class="o">.</span><span class="na">list</span><span class="o">().</span><span class="na">size</span><span class="o">(),</span> <span class="mi">0</span>
</span><span class='line'>       <span class="k">new</span> <span class="nf">ProductService</span><span class="o">().</span><span class="na">saveProduct</span><span class="o">(</span><span class="s2">&quot;QWER-0&quot;</span><span class="o">,</span> <span class="s2">&quot;product0&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="n">Product</span><span class="o">.</span><span class="na">list</span><span class="o">().</span><span class="na">size</span><span class="o">(),</span> <span class="mi">1</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">void</span> <span class="nf">testProductCount</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="kt">def</span> <span class="n">testInstances</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>               <span class="k">new</span> <span class="nf">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="s2">&quot;QWER-1&quot;</span><span class="o">,</span> <span class="nl">name:</span> <span class="s2">&quot;product1&quot;</span><span class="o">),</span>
</span><span class='line'>               <span class="k">new</span> <span class="nf">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="s2">&quot;QWER-2&quot;</span><span class="o">,</span> <span class="nl">name:</span> <span class="s2">&quot;product2&quot;</span><span class="o">),</span>
</span><span class='line'>               <span class="k">new</span> <span class="nf">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="s2">&quot;QWER-3&quot;</span><span class="o">,</span> <span class="nl">name:</span> <span class="s2">&quot;product3&quot;</span><span class="o">)]</span>
</span><span class='line'>       <span class="n">mockDomain</span><span class="o">(</span><span class="n">Product</span><span class="o">,</span> <span class="n">testInstances</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="n">productService</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ProductService</span><span class="o">()</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="n">productService</span><span class="o">.</span><span class="na">productCount</span><span class="o">(),</span> <span class="mi">3L</span>
</span><span class='line'>       <span class="n">productService</span><span class="o">.</span><span class="na">saveProduct</span><span class="o">(</span><span class="s2">&quot;QWER-0&quot;</span><span class="o">,</span> <span class="s2">&quot;product0&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="n">productService</span><span class="o">.</span><span class="na">productCount</span><span class="o">(),</span> <span class="mi">4L</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The objects cache is represented by testInstances. The cache contains 3
predefined product objects when initializes, but when save method is
called it will automatically put new object in this cache.</p>
<p>The mockFor creates a new Grails mock for the given class.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">HelperService</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">def</span> <span class="nf">generateCode</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="c1">// implementation</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductService</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">def</span> <span class="n">helperService</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">def</span> <span class="nf">saveProduct</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">new</span> <span class="nf">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="n">helperService</span><span class="o">.</span><span class="na">generateCode</span><span class="o">(),</span>
</span><span class='line'>               <span class="nl">name:</span> <span class="n">name</span><span class="o">).</span><span class="na">save</span><span class="o">()</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// â¦</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductServiceTests</span> <span class="kd">extends</span> <span class="n">GrailsUnitTestCase</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">void</span> <span class="nf">testSaveProductCodeGenerated</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">mockDomain</span><span class="o">(</span><span class="n">Product</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">String</span> <span class="n">code</span> <span class="o">=</span> <span class="s2">&quot;QWER-1&quot;</span>
</span><span class='line'>       <span class="n">String</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;product1&quot;</span>
</span><span class='line'>       <span class="kt">def</span> <span class="n">mockControl</span> <span class="o">=</span> <span class="n">mockFor</span><span class="o">(</span><span class="n">HelperService</span><span class="o">)</span>
</span><span class='line'>       <span class="n">mockControl</span><span class="o">.</span><span class="na">demand</span><span class="o">.</span><span class="na">generateCode</span><span class="o">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">1</span><span class="o">)</span> <span class="o">{-&gt;</span> <span class="k">return</span> <span class="n">code</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="kt">def</span> <span class="n">productService</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ProductService</span><span class="o">()</span>
</span><span class='line'>       <span class="n">productService</span><span class="o">.</span><span class="na">helperService</span> <span class="o">=</span> <span class="n">mockControl</span><span class="o">.</span><span class="na">createMock</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">productService</span><span class="o">.</span><span class="na">saveProduct</span><span class="o">(</span><span class="n">name</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="n">Product</span><span class="o">.</span><span class="na">list</span><span class="o">().</span><span class="na">size</span><span class="o">(),</span> <span class="mi">1</span>
</span><span class='line'>       <span class="n">assertTrue</span> <span class="n">Product</span><span class="o">.</span><span class="na">list</span><span class="o">()[</span><span class="mi">0</span><span class="o">]</span> <span class="k">instanceof</span> <span class="n">Product</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="n">Product</span><span class="o">.</span><span class="na">findByCode</span><span class="o">(</span><span class="n">code</span><span class="o">).</span><span class="na">name</span><span class="o">,</span> <span class="n">name</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Here, the helper service and its <em>generateCode()</em> method are
mocked.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">mockControl</span><span class="o">.</span><span class="na">demand</span><span class="o">.</span><span class="na">something</span><span class="o">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">2</span><span class="o">)</span> <span class="o">{-&gt;</span> <span class="err">â¦</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<ul>
<li>mockControl - returned by <em>mockFor()</em></li>
<li>demand - start new expectation</li>
<li>something - name of expected method</li>
<li>(1..2) - expected number of calls. If no range is specified, a
default of "1..1" is assumed.</li>
<li>{-> ...} - mock method implementation</li>
</ul>
<p>The mockForConstraintsTest allows you to check contraints behavior.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductTests</span> <span class="kd">extends</span> <span class="n">GrailsUnitTestCase</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">void</span> <span class="nf">testConstraints</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">mockForConstraintsTests</span><span class="o">(</span><span class="n">Product</span><span class="o">,</span> <span class="o">[</span><span class="k">new</span> <span class="n">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="s2">&quot;QWER-0&quot;</span><span class="o">,</span> 
</span><span class='line'>               <span class="nl">name:</span> <span class="s2">&quot;product&quot;</span><span class="o">)])</span>
</span><span class='line'>       <span class="kt">def</span> <span class="n">product</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Product</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">assertFalse</span> <span class="n">product</span><span class="o">.</span><span class="na">validate</span><span class="o">()</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="s2">&quot;nullable&quot;</span><span class="o">,</span> <span class="n">product</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="s2">&quot;code&quot;</span><span class="o">]</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="s2">&quot;nullable&quot;</span><span class="o">,</span> <span class="n">product</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="s2">&quot;name&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">product</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="s2">&quot;QWER-0&quot;</span><span class="o">,</span> <span class="nl">name:</span> <span class="s2">&quot;pr&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="n">assertFalse</span> <span class="n">product</span><span class="o">.</span><span class="na">validate</span><span class="o">()</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="s2">&quot;unique&quot;</span><span class="o">,</span> <span class="n">product</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="s2">&quot;code&quot;</span><span class="o">]</span>
</span><span class='line'>       <span class="n">assertEquals</span> <span class="s2">&quot;minSize&quot;</span><span class="o">,</span> <span class="n">product</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="s2">&quot;name&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>       <span class="n">product</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Product</span><span class="o">(</span><span class="nl">code:</span> <span class="s2">&quot;QWER-1&quot;</span><span class="o">,</span> <span class="nl">name:</span> <span class="s2">&quot;product1&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="n">assertTrue</span> <span class="n">product</span><span class="o">.</span><span class="na">validate</span><span class="o">()</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The mockLogging adds a mock "log" property to a class. The property
echoes to the console all of the messages passed to mock logger. By
default, debug and trace messages aren't included, to enable that
messages you should pass true as an optional second argument to
mockLogging().
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductService</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">def</span> <span class="nf">logSomething</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">log</span><span class="o">.</span><span class="na">info</span> <span class="s2">&quot;log text&quot;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">ProductServiceTests</span> <span class="kd">extends</span> <span class="n">GrailsUnitTestCase</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kt">void</span> <span class="nf">testLogging</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">mockLogging</span><span class="o">(</span><span class="n">ProductService</span><span class="o">,</span> <span class="kc">true</span><span class="o">)</span>
</span><span class='line'>       <span class="k">new</span> <span class="nf">ProductService</span><span class="o">().</span><span class="na">logSomething</span><span class="o">()</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The output is:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>INFO <span class="o">(</span>examples.ProductService<span class="o">)</span>: log text
</span></code></pre></td></tr></table></div></figure></p>
<p>The <strong>mockTagLib</strong> was described in my previous post the
<a href="/articles/tag-libraries-grails" target="_blank">
Tag Libraries in Grails</a>.</p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Filtering user access in Grails]]></title><link href="http://www.sysgears.com/articles/filtering-user-access-grails/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/filtering-user-access-grails/</id><content type="html"><![CDATA[<p>Today we’ll talk about the ways to filter user access to some
controllers and actions in the Grails application. There are few
solutions that could be really useful for implementing this task. So
let’s look at a quick overview of them.</p>
<!--more-->
<p>At first, let’s take a look on the solutions that are suggested by
spring security plugin. One of them is an @Secured annotation. You may
use it on the class or action level. Here is an example of using
@Secured on different levels:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@Secured</span><span class="o">([</span><span class="err">â</span><span class="n">ROLE_ADMIN</span><span class="err">â</span><span class="o">,</span> <span class="err">â</span><span class="n">ROLE_SUPER_ADMIN</span><span class="err">â</span><span class="o">])</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">AdminController</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">index</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">render</span> <span class="err">â</span><span class="n">you</span> <span class="n">have</span> <span class="n">admin</span> <span class="n">rights</span><span class="err">â</span>    
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    
</span><span class='line'>    <span class="nd">@Secured</span><span class="o">([</span><span class="err">â</span><span class="n">ROLE_SUPER_ADMIN</span><span class="err">â</span><span class="o">])</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">superAdmin</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">render</span> <span class="err">â</span><span class="n">you</span> <span class="n">have</span> <span class="kd">super</span> <span class="n">admin</span> <span class="n">rights</span><span class="err">â</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In this example users with admin or super admin roles has access to this
controller, and only super admin has access to the superAdmin action. In
some cases there is a lot more convenient to specify a list of
controllers and actions to which specified users has access to. This
could be done by using an intercept URLs map in config.groovy file. Here
is an example of using it.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>import grails.plugins.springsecurity.SecurityConfigType
</span><span class='line'>import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
</span><span class='line'>â¦
</span><span class='line'>//specifying security config type
</span><span class='line'>grails.plugins.springsecurity.securityConfigType=SecurityConfigType.InterceptUrlMap
</span><span class='line'>//defining the user class name
</span><span class='line'>grails.plugins.springsecurity.userLookup.userDomainClassName = &#39;sysgears.User&#39;
</span><span class='line'>//defining authority join class name
</span><span class='line'>// UserSecRole - collection that contains user - security role relation 
</span><span class='line'>grails.plugins.springsecurity.userLookup.authorityJoinClassName = &#39;sysgears.UserSecRole&#39;
</span><span class='line'>//defining security role class name
</span><span class='line'>grails.plugins.springsecurity.authority.className = &#39;sysgears.SecRole&#39;
</span><span class='line'>//map to secure URLs
</span><span class='line'>grails.plugins.springsecurity.interceptUrlMap = [
</span><span class='line'>    &#39;/&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;/login/**&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;/register/**&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;/images/**&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;/css/**&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;/fonts/**&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;/js/**&#39;: [&#39;IS_AUTHENTICATED_ANONYMOUSLY&#39;],
</span><span class='line'>    &#39;admin/superAdmin/**&#39;:[&#39;ROLE_SUPER_ADMIN&#39;],
</span><span class='line'>    &#39;admin/**&#39;:[&#39;ROLE_ADMIN&#39;, &#39;ROLE_SUPER_ADMIN&#39;]
</span><span class='line'>]
</span></code></pre></td></tr></table></div></figure></p>
<p>Please make sure that you specified the right order of mapping, rights
that was specified first has greater priority.<br  />
Sure this is a great solutions, but what would you do if using of
security roles is not enough for you? In this case standard grails
features, such as interceptors and filters could be really useful. At
first let’s talk about interceptors. Interceptor is a nice tool not only
to filter user access to some controllers and actions, with interceptors
you may modify the data that’s being received and sent by actions,
change the view that should be rendered after executing and more. There
are two kinds of interceptors: beforeInterceptor and afterInterceptor.
To define interceptor that will be executed before every action write
the following code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">SampleController</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">beforeInterceptor</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">//do something</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Let's look at the example, that will show how to make interceptor
execute only for specified actions.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">//interceptor will be executed for all the actions except &#39;register&#39; and &#39;login&#39;</span>
</span><span class='line'><span class="c1">//auth is an action that will be executed as interceptor</span>
</span><span class='line'><span class="kt">def</span> <span class="n">beforeInterceptor</span> <span class="o">=</span> <span class="o">[</span><span class="nl">action:</span><span class="k">this</span><span class="o">.&amp;</span><span class="n">auth</span><span class="o">,</span><span class="nl">except:</span><span class="o">[</span><span class="s1">&#39;login&#39;</span><span class="o">,</span> <span class="s1">&#39;register&#39;</span><span class="o">]]</span>
</span><span class='line'><span class="c1">//interceptor will be executed only for &#39;superAdmin&#39; action</span>
</span><span class='line'><span class="kt">def</span> <span class="n">beforeInterceptor</span> <span class="o">=</span> <span class="o">[</span><span class="nl">action:</span><span class="k">this</span><span class="o">.&amp;</span><span class="n">auth</span><span class="o">,</span><span class="nl">only:</span><span class="o">[</span><span class="s1">&#39;superAdmin&#39;</span><span class="o">]]</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>AfterInterceptors are being executed after the action, so they could
modify model and modelAndView objects and could be used as follows:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">afterInterceptor</span> <span class="o">=</span> <span class="o">{</span> <span class="n">model</span><span class="o">,</span> <span class="n">modelAndView</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="k">if</span><span class="o">(</span><span class="n">model</span><span class="o">.</span><span class="na">changeView</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">modelAndView</span><span class="o">.</span><span class="na">viewName</span> <span class="o">=</span> <span class="s2">&quot;/samplecontroller/otherview&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>If we are dealing with application that has really big amount of
controllers using of interceptors is not so convenient, in this case
using of filters could be a better solution. To create a filter, create
a class that ends with the convention Filters in the grails-app/conf
directory. Within this class define a code block called filters that
contains the filter definitions. Within the filters there are three
types of interceptors: before - executed before action, after - executed
after action, afterView - executed after rendering the view. Here is an
example of applying different filters.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">BlockFilters</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">filters</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>       <span class="c1">//applies filter to all the controllers </span>
</span><span class='line'>       <span class="n">allTabsFilter</span><span class="o">(</span><span class="nl">controller:</span> <span class="s1">&#39;*&#39;</span><span class="o">,</span> <span class="nl">action:</span> <span class="s1">&#39;*&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="n">before</span> <span class="o">{</span>
</span><span class='line'>               <span class="c1">//do something</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>       <span class="o">}</span> 
</span><span class='line'> 
</span><span class='line'>        <span class="c1">//applies filter to some controller</span>
</span><span class='line'>        <span class="n">vipFilter</span><span class="o">(</span><span class="nl">controller:</span> <span class="s1">&#39;vip&#39;</span><span class="o">,</span> <span class="nl">action:</span> <span class="s1">&#39;*&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">before</span> <span class="o">{</span>
</span><span class='line'>                <span class="c1">//do something</span>
</span><span class='line'>            <span class="o">}</span>    
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">//applies filter to all controllers except &#39;Login&#39;, &#39;Logout&#39;, </span>
</span><span class='line'>        <span class="c1">//&#39;Register&#39; and &#39;Ban&#39;</span>
</span><span class='line'>        <span class="n">banFilter</span><span class="o">(</span><span class="nl">controller:</span> <span class="s1">&#39;(login|logout|ban|register)&#39;</span><span class="o">,</span>
</span><span class='line'>            <span class="nl">action:</span> <span class="s1">&#39;*&#39;</span><span class="o">,</span> <span class="nl">invert:</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'><span class="n">before</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="na">findByUsername</span><span class="o">(</span><span class="n">applicationContext</span><span class="o">.</span>
</span><span class='line'>                        <span class="n">getBean</span><span class="o">(</span><span class="s2">&quot;springSecurityService&quot;</span><span class="o">).</span><span class="na">authentication</span><span class="o">.</span><span class="na">name</span><span class="o">)</span>
</span><span class='line'>                <span class="k">if</span> <span class="o">(</span><span class="n">user</span> <span class="o">&amp;&amp;</span> <span class="n">user</span><span class="o">.</span><span class="na">isBanned</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>                    <span class="n">redirect</span><span class="o">(</span><span class="nl">controller:</span> <span class="s2">&quot;ban&quot;</span><span class="o">,</span> <span class="nl">action:</span> <span class="s2">&quot;index&quot;</span><span class="o">)</span>
</span><span class='line'>                    <span class="k">return</span> <span class="kc">false</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>    
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Andrey Shevchenko,<br  />
SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Escaping Deadlocks]]></title><link href="http://www.sysgears.com/articles/escaping-deadlocks/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/escaping-deadlocks/</id><content type="html"><![CDATA[<p>Concurrent programs is not a novelty today, almost every modern
application executes in multiple threads. But as concurrency brought us
better resource utilization and throughput, it also introduced a number
of issues nonexistent in serial execution. One of them is deadlocks. A
deadlock is a situation where in two or more competing actions are each
waiting for the other to finish, and thus neither ever does.</p>
<!--more-->
<p>Suppose, as an example, two thread trying to transfer money between
accounts: first one from account A to account B and the second one vice
versa. First thread locks A for debiting. Second thread locks B for the
same reason. Now the first thread asks for B’s lock for crediting, but
the request is denied until the second thread releases it. So do the
second thread will be denied for A’s lock. At this point both threads
are blocked and will remain so forever. Oops, we have a deadlock.</p>
<p>A savvy developer should understand the causes of that liveness hazard
and have a knowledge of how to prevent it. Coffman et al. (1971) showed
that four conditions must hold for there to be a deadlock:</p>
<ol>
<li>Mutual exclusion condition. Each resource is either currently
assigned to exactly one thread or is available.<br  /></li>
<li>No preemption condition. Resources previously granted cannot be
forcibly taken away from a thread. They must be explicitly released by
the thread holding them.<br  /></li>
<li>Hold and wait condition. Thread currently holding resource that were
granted earlier can request new resources.<br  /></li>
<li>Circular wait condition. There must be a circular chain of two or
more threads, each of which is waiting for a resource held by the next
member of the chain.</li>
</ol>
<p>All four of these conditions must be present for a deadlock to occur.
So, to make a program deadlock-free we must eliminate at least one of
these conditions. Let’s see what we can do in a multithreaded program
that protects shared resources with locks.</p>
<p>There is no point in attacking first two conditions, because this is
what locks and synchronized blocks (Java) are all about: only one thread
can hold a lock and it holds the lock until releases.</p>
<p>Hold and wait condition can be eliminated if all required locks can be
obtained together. An immediate problem with this approach is that in
many cases it is impossible to know how many lock-guarded resources will
be needed until the run. Another problem is that resources will not be
used optimally with this approach.</p>
<p>Only one condition remains — the circular wait, — which can be
eliminated in several ways. One way is simply to have a rule saying that
a thread can hold only one lock at any moment. If it needs a second one,
it must release the first one. Of course, this is not always practical,
but if you can get away with it, you are out of troubles.<br  />
Another way to avoid the circular wait is to induce an ordering on the
locks. Now the rule is this: threads can request locks whenever they
want to, but all requests must be made in a predefined order.</p>
<p>Let’s see a lock ordering in action. We will secure our money
transactions example by means of Java. One way to induce an ordering on
objects is to use <tt>System.identityHashCode</tt>, which returns the
value that would be returned by <tt>Object.hashCode</tt>. It involves a
few extra lines of code, but helps us avoid deadlocking.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">tieLock</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Object</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kt">void</span> <span class="nf">transferMoney</span><span class="o">(</span><span class="kd">final</span> <span class="n">Account</span> <span class="n">fromAcct</span><span class="o">,</span>
</span><span class='line'>                          <span class="kd">final</span> <span class="n">Account</span> <span class="n">toAcct</span><span class="o">,</span>
</span><span class='line'>                          <span class="kd">final</span> <span class="n">BigDecimal</span> <span class="n">amount</span><span class="o">)</span>
</span><span class='line'>        <span class="kd">throws</span> <span class="n">InsufficientFundsException</span> <span class="o">{</span>
</span><span class='line'>   <span class="kt">int</span> <span class="n">fromHash</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">identityHashCode</span><span class="o">(</span><span class="n">fromAcct</span><span class="o">);</span>
</span><span class='line'>   <span class="kt">int</span> <span class="n">toHash</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">identityHashCode</span><span class="o">(</span><span class="n">toAcct</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">if</span> <span class="o">(</span><span class="n">fromHash</span> <span class="o">&lt;</span> <span class="n">toHash</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="kd">synchronized</span> <span class="o">(</span><span class="n">fromAcct</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="kd">synchronized</span> <span class="o">(</span><span class="n">toAcct</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>               <span class="k">new</span> <span class="nf">Helper</span><span class="o">().</span><span class="na">transfer</span><span class="o">();</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">fromHash</span> <span class="o">&gt;</span> <span class="n">toHash</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="kd">synchronized</span> <span class="o">(</span><span class="n">toAcct</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="kd">synchronized</span> <span class="o">(</span><span class="n">fromAcct</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>               <span class="k">new</span> <span class="nf">Helper</span><span class="o">().</span><span class="na">transfer</span><span class="o">();</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>       <span class="kd">synchronized</span> <span class="o">(</span><span class="n">tieLock</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="kd">synchronized</span> <span class="o">(</span><span class="n">fromAcct</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>               <span class="kd">synchronized</span> <span class="o">(</span><span class="n">toAcct</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                   <span class="k">new</span> <span class="nf">Helper</span><span class="o">().</span><span class="na">transfer</span><span class="o">();</span>
</span><span class='line'>               <span class="o">}</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">class</span> <span class="nc">Helper</span> <span class="o">{</span>
</span><span class='line'>       <span class="kd">public</span> <span class="kt">void</span> <span class="nf">transfer</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">InsufficientFundsException</span> <span class="o">{</span>
</span><span class='line'>           <span class="k">if</span> <span class="o">(</span><span class="n">fromAcct</span><span class="o">.</span><span class="na">getBalance</span><span class="o">().</span><span class="na">compareTo</span><span class="o">(</span><span class="n">amount</span><span class="o">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>               <span class="k">throw</span> <span class="k">new</span> <span class="nf">InsufficientFundsException</span><span class="o">();</span>
</span><span class='line'>           <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>               <span class="n">fromAcct</span><span class="o">.</span><span class="na">debit</span><span class="o">(</span><span class="n">amount</span><span class="o">);</span>
</span><span class='line'>               <span class="n">toAcct</span><span class="o">.</span><span class="na">credit</span><span class="o">(</span><span class="n">amount</span><span class="o">);</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>We look at hash codes of the objects and lock them in the ascending
order of hash values.<br  />
In the rare case that two objects have the same hash code, we must use
an arbitrary means of ordering the lock acquisitions, as this
reintroduces the possibility of deadlock. To prevent inconsistent lock
ordering in this case, a third "tie breaking" lock is used. By acquiring
the tie-breaking lock before acquiring either <tt>Account</tt> lock, we
ensure that only one thread at a time performs the risky task of
acquiring two locks in an arbitrary order, eliminating the possibility
of deadlock.</p>
<p>So, as a note to keep in mind, if you must acquire multiple locks, lock
ordering must be a part of your design: try to minimize the number of
potential locking interactions, and follow and document a lock-ordering
protocol for locks that may be acquired together.</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Android introduction]]></title><link href="http://www.sysgears.com/articles/android-introduction/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/android-introduction/</id><content type="html"><![CDATA[<p>Android is an operating system for mobile devices such as smartphones,
netbooks and tablet computers. It is developed by the Open Handset
Alliance, a business alliance led by Google to develop open standards
for mobile devices. Android 1.x and 2.x.x releases are phone-oriented,
3.x releases are available for tablet devices and support larger screen,
mulicore processing and hardware graphics acceleration.</p>
<!--more-->
<p>Android stack includes an operating system, middleware and key
applications. Android’s OS kernel is a fork of the Linux kernel with
architecture changes, for example it does not support the full set of
standard GNU libraries and X Window System. The main hardware platform
for Android is the ARM architecture. Applications are usually developed
in the Java language using the Android SDK, but Native DK are also
available for applications or extensions in C or C++.<br  /></p>
<p>Android platform does not have Java Virtual Machine to execute Java byte
code. Java classes are compiled into Dalvik executables and run on
Dalvik, a virtual machine designed specifically for Android. The Dalvik
Executable format is designed for systems that are constrained in terms
of memory and processor speed. Every Android application runs in its own
instance of the Dalvik virtual machine. Thus, each Android application
works in its own security sandbox, the system assigns each application a
unique Linux user ID and sets permissions for all the files, only an
application with this ID can access them. So, the Android guarantee
maximum security by implementing the principle of least privilege.<br  /></p>
<p>The platform architecture is designed to simplify components re-usage,
an application can publish its capabilities, so any other application
may then use them. Underlying all applications is a rich set of
services, including resource manager (access to graphics and layout
files), notification manager (provides alerts displaying in the status
bar) and activity manager (navigation backstack). Android applications
are composed of application components such as activities (a user
interface screens), services, content providers (data access), and
broadcast receivers (system-wide broadcast announcements). Each
component can be activated individually and performs a different role in
the application behavior.</p>
<p>Components usage will be described in the next post.</p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Increasing efficiency in Grails]]></title><link href="http://www.sysgears.com/articles/increasing-efficiency-grails/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/increasing-efficiency-grails/</id><content type="html"><![CDATA[<p>Modern web applications are counting on the big amount of users, so
efficiency is a very important aspect of a web development. Today we’ll
talk about the ways to increase efficiency of the web application,
developed on the Grails platform.</p>
<!--more-->
<p>Let’s imagine that we are developing the web service that helps to sell
a used cars. And we need to write a request that will return the amount
of cars that had been produced between two dates and in the specified
region, i.e. amount of cars that had been produced in Asia between 1990
and 2000 year. This example is written for using mongoDB database and
tested on mongodb Grails plugin, version 1.0.0.M6<br  />
Let’s first take a look on the domain objects that will be used in our
example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">Car</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">ObjectId</span> <span class="n">id</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">brand</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">fullName</span>
</span><span class='line'>   <span class="kt">long</span> <span class="n">productionDate</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">serialNumber</span>
</span><span class='line'>   <span class="n">Country</span> <span class="n">country</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">Country</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">ObjectId</span> <span class="n">id</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">name</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">region</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>First thing that should increase working with a database collection
speed is adding some indexes. Let’s say that unique id for Car
collection is a car serial number<br  />
So you should add index for this field by specifying it this way in a
Car domain class:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">serialNumber</span> <span class="nl">index:</span> <span class="s1">&#39;serial_number_index&#39;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now, let’s take a look on a Country class. Obviously this collection
isn’t the one that will change often. So for this class it will be nice
to use a cache.<br  />
Let’s use EhCache library for our example. So you should specify
following code in a DataSource.groovy file:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">hibernate</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">cache</span><span class="o">.</span><span class="na">use_second_level</span><span class="o">.</span><span class="na">cache</span> <span class="o">=</span> <span class="kc">true</span>
</span><span class='line'>   <span class="n">cache</span><span class="o">.</span><span class="na">use_query_cache</span> <span class="o">=</span> <span class="kc">true</span>
</span><span class='line'>   <span class="n">cache</span><span class="o">.</span><span class="na">provider</span><span class="o">.</span><span class="na">class</span> <span class="o">=</span> <span class="s1">&#39;net.sf.ehcache.hibernate.EhCacheProvider&#39;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>To make request to the Country collection use cache, specify this in
domain class:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">static</span> <span class="n">mapping</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>   <span class="nl">cache:</span> <span class="s2">&quot;read-only&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>“read-only” value should be used only for the static data, otherwise use
“read-write” value. Settings of the EhCache library are placed in the
grails-app/conf/ehcache.xml file.<br  />
Here is a common example of configuring a cache for a domain class:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;cache</span>
</span><span class='line'>   <span class="na">name=</span><span class="s">&quot;com.sysgears.country&quot;</span>  <span class="err">//class</span> <span class="err">to</span> <span class="err">cache</span>
</span><span class='line'>   <span class="na">maxElementsInMemory=</span><span class="s">&quot;1000&quot;</span>
</span><span class='line'>   <span class="na">eternal=</span><span class="s">&quot;false&quot;</span>
</span><span class='line'>   <span class="na">timeToIdleSeconds=</span><span class="s">&quot;3600&quot;</span>
</span><span class='line'>   <span class="na">timeToLiveSeconds=</span><span class="s">&quot;3600&quot;</span> <span class="err">//</span> <span class="err">limit</span> <span class="err">time</span> <span class="err">of</span> <span class="err">caching</span>
</span><span class='line'>   <span class="na">overflowToDisk=</span><span class="s">&quot;false&quot;</span>
</span><span class='line'><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now let’s proceed to writing a request.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="n">List</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;</span> <span class="n">countries</span> <span class="o">=</span> <span class="n">Country</span><span class="o">.</span><span class="na">findAllByRegion</span><span class="o">(</span><span class="n">region</span><span class="o">)</span>
</span><span class='line'><span class="n">Car</span><span class="o">.</span><span class="na">findAll</span><span class="o">().</span><span class="na">each</span> <span class="o">{</span> <span class="n">Car</span> <span class="n">car</span> <span class="o">-&gt;</span>
</span><span class='line'>   <span class="n">countries</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">if</span> <span class="o">(</span><span class="n">car</span><span class="o">.</span><span class="na">country</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">it</span><span class="o">)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>           <span class="o">(</span><span class="n">car</span><span class="o">.</span><span class="na">productionDate</span> <span class="o">&gt;</span> <span class="n">startDate</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>               <span class="n">car</span><span class="o">.</span><span class="na">productionDate</span> <span class="o">&lt;</span> <span class="n">endDate</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>               <span class="n">result</span><span class="o">++</span>
</span><span class='line'>               <span class="k">return</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>  
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now this is a first implementation that may come to your mind. But it
may extremely slow down the work of our service. On my computer (Intel
core i3-2100 processor, 8GB RAM) processing this request took about 12
ms in conditions that Cars collection has 44 records and Country
collection has 66 records. Notice that this solution wasting a memory on
the creating and processing unnecessary objects.<br  />
The main goal of writing the requests is to perform as much as possible
operations within the database. So let’s rewrite the request using the
criteria.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">List</span><span class="o">&lt;</span><span class="n">ObjectId</span><span class="o">&gt;</span> <span class="n">countries</span> <span class="o">=</span> <span class="n">Country</span><span class="o">.</span><span class="na">findAllByRegion</span><span class="o">(</span><span class="n">region</span><span class="o">).</span><span class="na">id</span>
</span><span class='line'><span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">Car</span><span class="o">.</span><span class="na">createCriteria</span><span class="o">().</span><span class="na">count</span> <span class="o">{</span>
</span><span class='line'>   <span class="s1">&#39;in&#39;</span><span class="o">(</span><span class="s1">&#39;country&#39;</span><span class="o">,</span> <span class="n">countries</span><span class="o">)</span>
</span><span class='line'>   <span class="n">between</span><span class="o">(</span><span class="s1">&#39;productionDate&#39;</span><span class="o">,</span> <span class="n">startDate</span><span class="o">,</span> <span class="n">endDate</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now this request is much more effective than the previous one, the time
of processing speaks for itself, it takes about 1-2 ms to process the
request. So building a smart requests using criteria is a great way to
increase Grails application productivity.</p>
<p>Andrey Shevchenko,</p>
<p>SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Effectively Immutable Objects]]></title><link href="http://www.sysgears.com/articles/effectively-immutable-objects/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/effectively-immutable-objects/</id><content type="html"><![CDATA[<p>An immutable object is one whose state cannot be changed after
construction. All the beauty in these objects is that they are simple
and safe. In multi-threaded applications all concurrency issues boil
down to coordinating access to mutable state. The less mutable state,
the easier it is to ensure thread safety. That’s why you should always
consider making your objects immutable whenever it is feasible. Creating
an immutable type is not a complex process, but you should follow a
handful of rules to stay away from pitfalls it definitely implies.</p>
<!--more-->
<p>First and topmost, as the object is intended to be unchangeable after
construction, it must have all fields as finals and not contain any
write methods (this includes property set methods as well as other
methods that alter the state of the instance).</p>
<p>This may seem to be sufficient to create a true immutable object, but it
is no way to be so. As you should remember variables store not objects
themselves but just references to them. Therefore declaring fields as
finals just “freezes” only references, but not the referenced objects’
state. So, if another part of the code possesses the same reference as
we have, this state can easily be changed from outside forcing our cared
object to mute.</p>
<p>To avoid this kind of threat never share references to the stored
objects with the outer world. Instead defensively copy them and give
away (as well as consume) references to the copied objects.</p>
<p>Here’s how an effective immutable type looks like:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">examples</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.awt.*</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Line</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">private</span> <span class="kd">final</span> <span class="n">Point</span> <span class="n">start</span><span class="o">;</span>
</span><span class='line'>   <span class="kd">private</span> <span class="kd">final</span> <span class="n">Point</span> <span class="n">end</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">public</span> <span class="nf">Line</span><span class="o">(</span><span class="kd">final</span> <span class="n">Point</span> <span class="n">start</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Point</span> <span class="n">end</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">this</span><span class="o">.</span><span class="na">start</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="n">start</span><span class="o">);</span>
</span><span class='line'>       <span class="k">this</span><span class="o">.</span><span class="na">end</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="n">end</span><span class="o">);</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   
</span><span class='line'>   <span class="kd">public</span> <span class="kt">void</span> <span class="nf">draw</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="c1">//...</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   
</span><span class='line'>   <span class="kd">public</span> <span class="n">Point</span> <span class="nf">getStart</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">return</span> <span class="k">new</span> <span class="nf">Point</span><span class="o">(</span><span class="n">start</span><span class="o">);</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   
</span><span class='line'>   <span class="kd">public</span> <span class="n">Point</span> <span class="nf">getEnd</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">return</span> <span class="k">new</span> <span class="nf">Point</span><span class="o">(</span><span class="n">end</span><span class="o">);</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Locks in Java]]></title><link href="http://www.sysgears.com/articles/locks-java/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/locks-java/</id><content type="html"><![CDATA[<p>Locks is the one of the mechanisms for thread synchronization.
Synchronization means that only one Java thread can execute synchronized
code at a time and allows threads to wait for resources to become
available. As with synchronized code, only one thread can own a Lock
object at a time, but lock is more flexible than synchronized blocks.</p>
<!--more-->
<p>The one of the main benefits of Lock object is its ability to back out
of an attempt to acquire a lock if the lock is taken by another thread.
For example tryLock method backs out if the lock is not available
immediately.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">private</span> <span class="kd">class</span> <span class="nc">ThreadExample</span> <span class="kd">implements</span> <span class="n">Runnable</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">final</span> <span class="n">Lock</span> <span class="n">lock</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">public</span> <span class="nf">ThreadExample</span><span class="o">(</span><span class="kd">final</span> <span class="n">Lock</span> <span class="n">lock</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">this</span><span class="o">.</span><span class="na">lock</span> <span class="o">=</span> <span class="n">lock</span><span class="o">;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="nd">@Override</span>
</span><span class='line'>   <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">while</span> <span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>               <span class="k">if</span> <span class="o">(</span><span class="n">lock</span><span class="o">.</span><span class="na">tryLock</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="n">TimeUnit</span><span class="o">.</span><span class="na">SECONDS</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>                   <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                       <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Lock was taken &quot;</span> <span class="o">+</span>
</span><span class='line'>                             <span class="n">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">());</span>
</span><span class='line'>                       <span class="n">TimeUnit</span><span class="o">.</span><span class="na">SECONDS</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span>
</span><span class='line'>                   <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>                       <span class="n">lock</span><span class="o">.</span><span class="na">unlock</span><span class="o">();</span>
</span><span class='line'>                       <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Lock was released &quot;</span> <span class="o">+</span>
</span><span class='line'>                             <span class="n">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">());</span>
</span><span class='line'>                   <span class="o">}</span>
</span><span class='line'>                   <span class="k">break</span><span class="o">;</span>
</span><span class='line'>               <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>                   <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Thread &quot;</span> <span class="o">+</span> 
</span><span class='line'>                             <span class="s">&quot;unable to take lock &quot;</span> <span class="o">+</span>
</span><span class='line'>                             <span class="n">Thread</span><span class="o">.</span><span class="na">currentThread</span><span class="o">().</span><span class="na">getName</span><span class="o">());</span>
</span><span class='line'>               <span class="o">}</span>
</span><span class='line'>           <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">ignore</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">final</span> <span class="n">Lock</span> <span class="n">lock</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ReentrantLock</span><span class="o">();</span>
</span><span class='line'><span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="k">new</span> <span class="n">ThreadExample</span><span class="o">(</span><span class="n">lock</span><span class="o">),</span> <span class="s">&quot;thread1&quot;</span><span class="o">).</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'><span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="k">new</span> <span class="n">ThreadExample</span><span class="o">(</span><span class="n">lock</span><span class="o">),</span> <span class="s">&quot;thread2&quot;</span><span class="o">).</span><span class="na">start</span><span class="o">();</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The output is:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Lock was taken thread1
</span><span class='line'>Thread unable to take lock thread2
</span><span class='line'>Lock was released thread1
</span><span class='line'>Lock was taken thread2
</span><span class='line'>Lock was released thread2
</span></code></pre></td></tr></table></div></figure></p>
<p>The reentrant lock. Reentrant means that the same thread can acquire the
lock multiple times, but the lock must be released the same number of
times, otherwise other threads will be unable to acquire the lock. For
example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ReentrantExample</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">Lock</span> <span class="n">lock</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ReentrantLock</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">public</span> <span class="kd">synchronized</span> <span class="kt">void</span> <span class="nf">methodA</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">lock</span><span class="o">.</span><span class="na">lock</span><span class="o">();</span>
</span><span class='line'>       <span class="n">methodB</span><span class="o">();</span>
</span><span class='line'>       <span class="n">lock</span><span class="o">.</span><span class="na">unlock</span><span class="o">();</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="kd">public</span> <span class="kd">synchronized</span> <span class="kt">void</span> <span class="nf">methodB</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">lock</span><span class="o">.</span><span class="na">lock</span><span class="o">();</span>
</span><span class='line'>       <span class="c1">//do something</span>
</span><span class='line'>       <span class="n">lock</span><span class="o">.</span><span class="na">unlock</span><span class="o">();</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Lock fairness. When a lock is fair, threads acquire the lock in the same
order they asked for it, an unfair lock doesn't guarantee this and a
thread can acquire a lock before another thread that asked for lock
first, there is a risk that one of the threads is never granted access.
For example you can specify lock's policy as fair when instantiating a
lock object:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="n">Lock</span> <span class="n">lock</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ReentrantLock</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> <span class="c1">// Fair lock</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Command object in Grails]]></title><link href="http://www.sysgears.com/articles/command-object-grails/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/command-object-grails/</id><content type="html"><![CDATA[<p>Using command objects in Grails is a simple way to perform data binding
and validation when there is no need to create domain object. In this
tutorial I will show you some examples of using it.</p>
<!--more-->
<p>First thing you‘ll need to do is describe your command object. It is
fine to do in the same file that contains controller that will use it.
If command will be used by more than one controller, describe it in
controllers or in groovy source directory.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">RegisterCommand</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">login</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">email</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">password</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">confirmationPassword</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="n">constraints</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">login</span> <span class="nl">size:</span> <span class="mi">1</span><span class="o">..</span><span class="mi">250</span><span class="o">,</span> <span class="nl">blank:</span> <span class="kc">false</span>
</span><span class='line'>        <span class="n">email</span> <span class="nl">size:</span> <span class="mi">1</span><span class="o">..</span><span class="mi">250</span><span class="o">,</span> <span class="nl">email:</span> <span class="kc">true</span><span class="o">,</span> <span class="nl">blank:</span> <span class="kc">false</span>
</span><span class='line'>        <span class="n">password</span> <span class="nl">size:</span> <span class="mi">6</span><span class="o">..</span><span class="mi">20</span><span class="o">,</span> <span class="nl">blank:</span> <span class="kc">false</span>
</span><span class='line'>        <span class="n">confirmationPassword</span> <span class="nl">size:</span> <span class="mi">6</span><span class="o">..</span><span class="mi">20</span><span class="o">,</span> <span class="nl">blank:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">validator:</span> <span class="n">RegisterController</span><span class="o">.</span><span class="na">passwordValidator</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">static</span> <span class="kd">final</span> <span class="kt">def</span> <span class="n">passwordValidator</span> <span class="o">{</span> <span class="n">String</span> <span class="n">value</span><span class="o">,</span> <span class="n">command</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">command</span><span class="o">?.</span><span class="na">password</span> <span class="o">!=</span> <span class="n">command</span><span class="o">?.</span><span class="na">confirmationPassword</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">//returning message code for i18n/messages.properties file</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;registerCommand.confirmationPassword.mismatch&#39;</span>    <span class="o">}</span>
</span><span class='line'>   
</span><span class='line'>    <span class="kc">true</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Next thing you’ll probably want to do, is bind the data, that is being
received by action in your controller to the command object and validate
it.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">registerAction</span> <span class="o">=</span> <span class="o">{</span> <span class="n">RegisterCommand</span> <span class="n">command</span> <span class="o">-&gt;</span> <span class="c1">// data binding and validation</span>
</span><span class='line'>   <span class="c1">//checking errors  </span>
</span><span class='line'>   <span class="k">if</span> <span class="o">(</span><span class="n">command</span><span class="o">.</span><span class="na">hasErrors</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">render</span> <span class="nl">view:</span> <span class="s1">&#39;register&#39;</span><span class="o">,</span> <span class="nl">model:</span> <span class="o">[</span><span class="nl">command:</span> <span class="n">command</span><span class="o">]</span>
</span><span class='line'>   <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>       <span class="c1">//do something</span>
</span><span class='line'>   <span class="o">}</span>  
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>To view errors that may appear during command validation, specify
following code in your .gsp page.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;g:textField</span> <span class="na">name=</span><span class="s">&quot;confirmationPassword&quot;</span> <span class="na">bean=</span><span class="s">&quot;${command}&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;g:hasErrors</span> <span class="na">bean=</span><span class="s">&quot;${command}&quot;</span> <span class="na">field=</span><span class="s">&quot;confirmationPassword&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>   <span class="nt">&lt;s2ui:fieldErrors</span> <span class="na">bean=</span><span class="s">&#39;${command}&#39;</span> <span class="na">field=</span><span class="s">âconfirmationPasswordâ/</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/g:hasErrors&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now this is a pretty common usage of command objects, but you may need
some more functionality.  You can check not only whether there is any
error in command, but also what are these errors, reject error in case
if they may appear during action, check field for the error, clear all
the errors and so on.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="c1">//checking is specified login already exists</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">Account</span><span class="o">.</span><span class="na">findByLogin</span><span class="o">(</span><span class="n">command</span><span class="o">.</span><span class="na">login</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>   <span class="c1">//rejects error for field in command, which validation has failed</span>
</span><span class='line'>   <span class="n">command</span><span class="o">.</span><span class="na">errors</span><span class="o">.</span><span class="na">rejectValue</span><span class="o">(</span><span class="s1">&#39;login&#39;</span><span class="o">,</span> <span class="s1">&#39;registerCommand.login.exists&#39;</span><span class="o">)</span>    
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//checks is specified field contains invalid value</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">command</span><span class="o">.</span><span class="na">errors</span><span class="o">.</span><span class="na">hasFieldErrors</span><span class="o">(</span><span class="s1">&#39;email&#39;</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>   <span class="c1">//do something</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="c1">//shows errors</span>
</span><span class='line'><span class="n">command</span><span class="o">.</span><span class="na">getErrors</span><span class="o">()</span>
</span><span class='line'><span class="c1">//clears errors</span>
</span><span class='line'><span class="n">command</span><span class="o">.</span><span class="na">clearErrors</span><span class="o">()</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Andrey Shevchenko,</p>
<p>SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Log4j properties file configuration]]></title><link href="http://www.sysgears.com/articles/log4j-properties-file-configuration/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/log4j-properties-file-configuration/</id><content type="html"><![CDATA[<p>Log4j is a simple and flexible framework that allows to log
application's debugging messages. With log4j it is possible to manage
logging without modifying the source code by editing a configuration
file. This tutorial shortly discribes how to configure log4j properties
file.</p>
<!--more-->
<p>At first a little about log4j main components. Log4j has loggers,
appenders and layouts. Appenders helps to define output destination of
log messages: console, file or remote log server. Layouts can be usefull
if you need to format log messages.</p>
<p>For example, configuration of console and file loggers:</p>
<pre>
# Log level of root logger is DEBUG and appender is console appender.
log4j.rootLogger=DEBUG, console

# Appender type.
log4j.appender.console=org.apache.log4j.ConsoleAppender
# Appender layout.
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%p %t %c - %m%n
</pre>
<pre>
# Log level of the root logger is DEBUG and appender is file appender.
log4j.rootLogger=DEBUG, file

# Appender type.
log4j.appender.file=org.apache.log4j.FileAppender
# Appender file attribute.
log4j.appender.file.File=test.log
# Appender layout.
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%p %t %c - %m%n</pre>
<p>The root logger is on top of loggers hierarchy, which means that all
loggers will log messages to appender assigned to the root logger.</p>
<p>Also loggers have assigned levels, log levels severity order is TRACE,
DEBUG, INFO, WARN, ERROR, FATAL. If you set the root logger level to
ERROR then only messages with log level ERROR and FATAL will be stored
and the rest will be ignored.</p>
<p>Log to different files. To log debug messages from different packages to
different log files, you need to create two separate FileAppenders and
assign them to each package. For example, application has two packages
service and database:</p>
<pre>
# Service appender. Logs messages in the service.log file.
log4j.appender.service=org.apache.log4j.FileAppender
log4j.appender.service.File=service.log
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%p %t %c - %m%n

# Database appender. Logs messages in the database.log file.
log4j.appender.database=org.apache.log4j.FileAppender
log4j.appender.database.File=database.log
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.srv=INFO,service
log4j.logger.com.db=ERROR,database
</pre>
<p>The service appender is assigned to the srv package and the database
appender is assigned to the db package. This means all log messages from
the srv module will be logged to the service.log file and messages from
db module to the database.log.</p>
<p>Dmitriy Pavlenko,</p>
<p>SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Simply about Spring AOP]]></title><link href="http://www.sysgears.com/articles/simply-about-spring-aop/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/simply-about-spring-aop/</id><content type="html"><![CDATA[<p>This week I would like to talk about  aspect oriented programming.  A
lot of programming paradigms like OOP, modular programming and other,
let to divide functionality into logical parts (functions modules,
classes). But these functional elements may be  marked out into separate
modules. Aspect oriented programming (AOP) has as a target  to provide
separation of  functionality and addition to points where it really
needs.</p>
<!--more-->
<p>Fisrt of all  let's remember an example from last article &ndash; simple
calculator consisting form several beans for calculating and saving
results. These beans were wired by XML file. In a such a way user can
choose correct beans for applying correspond operations (for example
save data to db or to file).</p>
<p>But there is one important problem. If user wants to add logging, huge
amounts of needless code will be added instead of adding several beans
in right place for logging implementation in our project.</p>
<p>The best solution in this case is applying of AOP. This technology can
be described in terms of advices, pointcuts, and joinpoints. There are
basic definitions in  AOP. So let's describe them in detail.</p>
<p>Advice is  some job what we need to do in our application. Strictly
saying advice  defines what and when some job will be done. Answering
the question what is user going to do advice define some functionality
or on another hand in aspect we can define excactly where some job will
be executed before or after method in our code or when some exception
will be thrown.</p>
<p>Joinpoint is some point in execution of application where an aspect can
be plugged in. It defines places where advice will be applied in code or
opportunities to apply advice.</p>
<p>Pointcut defines where advice will be applied to program execution. The
pointcut definition matches one or more joinpoints at which advice
should executed.</p>
<p>For declaration of these rquied instances in Spring AOP user has to put
into XML file several simple elements.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">advisor</span><span class="o">&gt;</span> <span class="n">Defines</span> <span class="n">advisor</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">after</span><span class="o">&gt;</span> <span class="n">Defines</span> <span class="n">applying</span> <span class="n">action</span> <span class="n">after</span> <span class="n">advice</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">after</span><span class="o">-</span><span class="n">returning</span><span class="o">&gt;</span> <span class="n">Defines</span> <span class="n">after</span><span class="o">-</span><span class="n">returning</span> <span class="n">advice</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">after</span><span class="o">-</span><span class="n">throwing</span><span class="o">&gt;</span> <span class="n">Defines</span>  <span class="n">after</span><span class="o">-</span><span class="n">throwing</span> <span class="n">advice</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">around</span><span class="o">&gt;</span> <span class="n">Defines</span> <span class="n">around</span> <span class="n">advice</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">aspect</span><span class="o">&gt;</span> <span class="n">Defines</span> <span class="n">an</span> <span class="n">aspect</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">before</span><span class="o">&gt;</span> <span class="n">Defines</span> <span class="n">before</span> <span class="n">advice</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nl">aop:</span><span class="n">config</span><span class="o">&gt;</span> <span class="n">The</span> <span class="n">top</span><span class="o">-</span><span class="n">level</span> <span class="n">AOP</span> <span class="n">element</span><span class="o">.</span> <span class="n">Most</span>  <span class="o">&lt;</span><span class="nl">aop:</span><span class="o">*&gt;</span> <span class="n">elements</span> <span class="n">must</span>
</span><span class='line'>
</span><span class='line'><span class="n">be</span> <span class="n">contained</span> <span class="n">within</span> <span class="o">&lt;</span><span class="nl">aop:</span><span class="n">config</span><span class="o">&gt;.</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>These elements allow building nice structures for complimenting main
functionality of our program. Like an example let's describe a simple<br  />
Config.XML file.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="o">&lt;</span><span class="n">beans</span> <span class="n">xmlns</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="nl">http:</span><span class="c1">//www.springframework.org/schema/beans&amp;quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nl">xmlns:</span><span class="n">xsi</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="nl">http:</span><span class="c1">//www.w3.org/2001/XMLSchema-instance&amp;quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nl">xmlns:</span><span class="n">aop</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="nl">http:</span><span class="c1">//www.springframework.org/schema/aop&amp;quot; &gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">&lt;</span><span class="n">bean</span> <span class="n">id</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">audience</span><span class="o">&amp;</span><span class="n">quot</span><span class="o">;</span>                                
</span><span class='line'>
</span><span class='line'>      <span class="n">class</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">com</span><span class="o">.</span><span class="na">springinaction</span><span class="o">.</span><span class="na">springidol</span><span class="o">.</span><span class="na">Audience</span><span class="o">&amp;</span><span class="n">quot</span><span class="o">;</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">&lt;</span><span class="nl">aop:</span><span class="n">config</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nl">aop:</span><span class="n">aspect</span> <span class="n">ref</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">someadviser</span><span class="o">&amp;</span><span class="n">quot</span><span class="o">;&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="nl">aop:</span><span class="n">before</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">method</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">toDoBefore</span><span class="o">&amp;</span><span class="n">quot</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">pointcut</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">execution</span><span class="o">(*</span> <span class="o">*.</span><span class="na">methodWhereWeNeedToApply</span> <span class="o">(..))&amp;</span><span class="n">quot</span><span class="o">;</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="nl">aop:</span><span class="n">after</span><span class="o">-</span><span class="n">returning</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">method</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">toDoAfterReturning</span><span class="o">&amp;</span><span class="n">quot</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">pointcut</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">execution</span><span class="o">(*</span> <span class="o">*.</span><span class="na">methodWhereWeNeedToApply</span><span class="o">(..))&amp;</span><span class="n">quot</span><span class="o">;</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="nl">aop:</span><span class="n">after</span><span class="o">-</span><span class="n">throwing</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">method</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">toDoAfterThrowing</span><span class="o">&amp;</span><span class="n">quot</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>          <span class="n">pointcut</span><span class="o">=&amp;</span><span class="n">quot</span><span class="o">;</span><span class="n">execution</span><span class="o">(*</span> <span class="o">*.</span><span class="na">methodWhereWeNeedToApply</span><span class="o">(..))&amp;</span><span class="n">quot</span><span class="o">;</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;/</span><span class="nl">aop:</span><span class="n">aspect</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">&lt;/</span><span class="nl">aop:</span><span class="n">config</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;/</span><span class="n">beans</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>So there are basic information about Spring AOP, but it contains much
more. Next week I'll continue our conversation about AOP. I'll tell
about AspectJ integration with Spring.</p>
<p>Artem Zadorozhniy</p>
<p>SysGears<br  /></p>
]]></content></entry><entry><title type="html"><![CDATA[Use Floats With Prudence]]></title><link href="http://www.sysgears.com/articles/use-floats-prudence/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/use-floats-prudence/</id><content type="html"><![CDATA[<p>In the world of mathematics real numbers have infinite precision and are
therefore continuous and nonlossy. Floating-point numbers, which are
used in computing, are limited with a finite precision and are not
evenly spaced throughout their range. If don't keep this in mind you can
get into many numerical blunders.</p>
<!--more-->
<p>To illustrate, assign the highest 32-bit integer value (2147483647) to a
32-bit float variable (let's call it "x"), and print it. You'll see
2147483648. Now print x-64. Still 2147483648. Now print x-65, and you'll
get 2147483520! Why? Because the spacing between adjacent floats in that
range is 128, and floating-point operations round to the nearest
floating-point number.</p>
<p>Unlike integers, which are stored in the memory as single values and
thus have fixed incremental step (equals 1) throughout their whole
range, floating-point numbers are stored in two separate values:
mantissa and exponent. Here is the bit layout of single-precision float:</p>
<p><img height="75px;" src="https://lh5.googleusercontent.com/qeBAUoFeY3_L7a-PIGTZlWL28C0uHKFyeKKKGgd0mhfmtCS1PL7YEdF6r0IHuKmxKjhMcu5tHqHz5Rqr_zM1rwTB037jhSyv5E1GwPYjCccVrTt8Zak" width="508px;"  /></p>
<p>The sign bit tells whether the number is positive or negative, the
exponent gives its order of magnitude, and the fraction (mantissa)
specifies the actual digits of the number. This is expressed as follows:</p>
<p>mantissa x 2 exponent</p>
<p>In this way floating-point numbers achieve much greater range for the
same storage space but at the cost of precision. A 32-bit float only
offers about 7 digits of precision and can be scaled from ~1.2x10-38 to
~3.4x1038. For the double these values are: 16 digits of precision and
range from ~1.8x10-308 to ~2.2x10308.</p>
<p>Additionally, we're all used to work with numbers in base of 10, but, as
you have noticed, floating-point numbers use base 2 internally. All
these conversions cannot take place without a small loss of precision.
This can lead to confusing results: for example, (int) ((0.1+0.7)*10)
will usually return 7 instead of the expected 8, since the internal
representation will be something like 7.9999999999999991118....</p>
<p>So never trust floating number results to the last digit and never
compare floating point numbers for equality. Also it should go without
saying that you shouldn't use floating-point numbers for financial
applications&mdash;that's what decimal classes in languages like Java
and C# are for. Floating-point numbers are intended for efficient
scientific computation. But efficiency is worthless without accuracy, so
remember the source of rounding errors, and code accordingly!</p>
<p>Max Drobotov,<br  /></p>
<p>SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Authorize.Net CIM With Java SDK: Managing Your Customers' Info]]></title><link href="http://www.sysgears.com/articles/authorizenet-cim-java-sdk-managing-your-customers-info/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/authorizenet-cim-java-sdk-managing-your-customers-info/</id><content type="html"><![CDATA[<p>In the <a href="/articles/authorizenet-cim-java-sdk-how-bill-your-customers">
previous post</a> I’ve told how to bill a customer with a minimal fuss.
But oftentimes returning customers wish to add or change their billing
information or maybe you want to delete the old ones. Let’s dive deeper
and see what’s possible to do with Authorize.Net Customer Information
Manager by remote procedure calls using, as previously, Java SDK.</p>
<!--more-->
<p>To be able to bill a customer you have to create a customer profile. In
the customer profile you can store customer’s billing and shipping
profiles. Each of these profiles you can update, delete or create a new
one. Now let’s see that actions in examples.</p>
<p>First of all, to issue request and transactions to Authorize.Net, you
need to authenticate yourself by creating a merchant object with the API
Login ID and Transaction Key you’ve got from Authorize.Net:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">String</span> <span class="n">apiLoginID</span> <span class="o">=</span> <span class="s">&quot;YOUR_API_LOGIN_ID&quot;</span><span class="o">;</span>
</span><span class='line'><span class="n">String</span> <span class="n">transactionKey</span> <span class="o">=</span> <span class="s">&quot;YOUR_TRANSACTION_KEY&quot;</span><span class="o">;</span>
</span><span class='line'><span class="n">Merchant</span> <span class="n">merchant</span> <span class="o">=</span> <span class="n">Merchant</span><span class="o">.</span><span class="na">createMerchant</span><span class="o">(</span><span class="n">Environment</span><span class="o">.</span><span class="na">SANDBOX</span><span class="o">,</span> <span class="n">apiLoginID</span><span class="o">,</span> <span class="n">transactionKey</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now you’ll issue all requests by invoking Merchant’s
postTransaction(Transaction transaction) method.</p>
<p>You can create solely customer profile (it will store customer’s billing
and shipping information in the future):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">CREATE_CUSTOMER_PROFILE</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">CustomerProfile</span> <span class="n">customerProfile</span> <span class="o">=</span> <span class="n">CustomerProfile</span><span class="o">.</span><span class="na">createCustomerProfile</span><span class="o">();</span>
</span><span class='line'><span class="n">customerProfile</span><span class="o">.</span><span class="na">setMerchantCustomerId</span><span class="o">(</span><span class="s">&quot;Your_Customer_Id&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">customerProfile</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">&quot;Your_Customer_Email&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">customerProfile</span><span class="o">.</span><span class="na">setDescription</span><span class="o">(</span><span class="s">&quot;Your_Customer_Descriptionâ&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfile</span><span class="o">(</span><span class="n">customerProfile</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="na">isOk</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">customerId</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="na">getCustomerProfileId</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Add shipping profile to the existing customer profile:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">CREATE_CUSTOMER_SHIPPING_ADDRESS</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfileId</span><span class="o">(</span><span class="n">customerProfileId</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setShipTo</span><span class="o">(</span><span class="n">Address</span><span class="o">.</span><span class="na">createAddress</span><span class="o">());</span>
</span><span class='line'><span class="n">Address</span> <span class="n">address</span> <span class="o">=</span> <span class="n">Address</span><span class="o">.</span><span class="na">createAddress</span><span class="o">();</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setFirstName</span><span class="o">(</span><span class="s">&quot;FirstName&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setLastName</span><span class="o">(</span><span class="s">&quot;LastName&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setCompany</span><span class="o">(</span><span class="s">&quot;Company&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setAddress</span><span class="o">(</span><span class="s">&quot;Street&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setCity</span><span class="o">(</span><span class="s">&quot;City&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setState</span><span class="o">(</span><span class="s">&quot;State&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setZipPostalCode</span><span class="o">(</span><span class="s">&quot;12345&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">address</span><span class="o">.</span><span class="na">setCountry</span><span class="o">(</span><span class="s">&quot;Country&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="na">isOk</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">shippingId</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="na">getCustomerShippingAddressIdList</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Add payment profile:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">CREATE_CUSTOMER_PAYMENT_PROFILE</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfileId</span><span class="o">(</span><span class="n">customerProfileId</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">CreditCard</span> <span class="n">creditCard</span> <span class="o">=</span> <span class="n">CreditCard</span><span class="o">.</span><span class="na">createCreditCard</span><span class="o">();</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setCreditCardNumber</span><span class="o">(</span><span class="s">&quot;4111 1111 1111 1111&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setExpirationMonth</span><span class="o">(</span><span class="s">&quot;12&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setExpirationYear</span><span class="o">(</span><span class="s">&quot;2020&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">Payment</span> <span class="n">payment</span> <span class="o">=</span> <span class="n">Payment</span><span class="o">.</span><span class="na">createPayment</span><span class="o">(</span><span class="n">creditCard</span><span class="o">);</span>
</span><span class='line'><span class="n">PaymentProfile</span> <span class="n">paymentProfile</span> <span class="o">=</span> <span class="n">PaymentProfile</span><span class="o">.</span><span class="na">createPaymentProfile</span><span class="o">();</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">setCustomerType</span><span class="o">(</span><span class="n">CustomerType</span><span class="o">.</span><span class="na">INDIVIDUAL</span><span class="o">);</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">addPayment</span><span class="o">(</span><span class="n">payment</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">addPaymentProfile</span><span class="o">(</span><span class="n">paymentProfile</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="na">isOk</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">paymentProfileId</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="na">getCustomerPaymentProfileIdList</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Edit payment profile:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">UPDATE_CUSTOMER_PAYMENT_PROFILE</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfileId</span><span class="o">(</span><span class="n">customerProfileId</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">CreditCard</span> <span class="n">creditCard</span> <span class="o">=</span> <span class="n">CreditCard</span><span class="o">.</span><span class="na">createCreditCard</span><span class="o">();</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setCreditCardNumber</span><span class="o">(</span><span class="s">&quot;4111 1111 1111 2222&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setExpirationMonth</span><span class="o">(</span><span class="s">&quot;12&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setExpirationYear</span><span class="o">(</span><span class="s">&quot;2022&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">Payment</span> <span class="n">payment</span> <span class="o">=</span> <span class="n">Payment</span><span class="o">.</span><span class="na">createPayment</span><span class="o">(</span><span class="n">creditCard</span><span class="o">);</span>
</span><span class='line'><span class="n">PaymentProfile</span> <span class="n">paymentProfile</span> <span class="o">=</span> <span class="n">PaymentProfile</span><span class="o">.</span><span class="na">createPaymentProfile</span><span class="o">();</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">setCustomerType</span><span class="o">(</span><span class="n">CustomerType</span><span class="o">.</span><span class="na">INDIVIDUAL</span><span class="o">);</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">addPayment</span><span class="o">(</span><span class="n">payment</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">addPaymentProfile</span><span class="o">(</span><span class="n">paymentProfile</span><span class="o">);</span>
</span><span class='line'><span class="c1">// Add Payment Profile ID you want to update with the new info</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">setCustomerPaymentProfileId</span><span class="o">(</span><span class="n">paymentProfileId</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now, when you’ve set a payment profile, you can post real transactions
or you can verify it beforehand by generating a test transaction:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">VALIDATE_CUSTOMER_PAYMENT_PROFILE</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfileId</span><span class="o">(</span><span class="n">customerProfileId</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerPaymentProfileId</span><span class="o">(</span><span class="n">paymentProfileId</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setValidationMode</span><span class="o">(</span><span class="n">ValidationModeType</span><span class="o">.</span><span class="na">TEST_MODE</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="na">isOk</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">response</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="na">getDirectResponseList</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>After you are done you can delete payment profile, shipping profile or
customer profile with all attached information profiles:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">DELETE_CUSTOMER_PROFILE</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfileId</span><span class="o">(</span><span class="n">customerProfileId</span><span class="o">);</span>
</span><span class='line'><span class="n">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>With these example you’ll be able to issue create, update and delete
requests to all three types of profiles (customer profile, payment
profile and shipping profile) as they are very similar. To have some
reference to rely on, check Authorize.Net
<a href="http://www.authorize.net/support/CIM_SOAP_guide.pdf">SOAP API
Guide.</a> Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Logica OpenSMPP short guide]]></title><link href="http://www.sysgears.com/articles/logica-opensmpp-short-guide/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/logica-opensmpp-short-guide/</id><content type="html"><![CDATA[<p>Short Message Peer to Peer (SMPP) is an open, telecommunications
industry protocol for exchanging text messages (SMS) between short
message service centers (SMSC) and External Short Messaging Entities
(ESMEs). It is often used for connecting third-party services with SMS
centers to send data to mobile devices or to the other applications.</p>
<!--more-->
<p>OpenSMPP is an open source Java library that implements the SMPP
protocol and allows to develop ESMEs and Messaging Gateways. Following
examples show how to use OpenSMPP library.</p>
<p>Binding. Connects your application to SMSC by sending bind request:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">BindRequest</span> <span class="n">request</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BindTransmitter</span><span class="o">();</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setSystemId</span><span class="o">(</span><span class="n">smscUsername</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setPassword</span><span class="o">(</span><span class="n">smscPassword</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setSystemType</span><span class="o">(</span><span class="n">systemType</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setAddressRange</span><span class="o">(</span><span class="n">addressRange</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setInterfaceVersion</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mh">0x34</span><span class="o">);</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">TCPIPConnection</span> <span class="n">connection</span> <span class="o">=</span> 
</span><span class='line'>        <span class="k">new</span> <span class="nf">TCPIPConnection</span><span class="o">(</span><span class="n">smscHost</span><span class="o">,</span> <span class="n">smscPort</span><span class="o">);</span>
</span><span class='line'>    <span class="n">connection</span><span class="o">.</span><span class="na">setReceiveTimeout</span><span class="o">(</span><span class="n">BIND_TIMEOUT</span><span class="o">);</span>
</span><span class='line'>    <span class="n">session</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Session</span><span class="o">(</span><span class="n">connection</span><span class="o">);</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Send bind request...&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">BindResponse</span> <span class="n">response</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="na">bind</span><span class="o">(</span><span class="n">request</span><span class="o">);</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Bind response &quot;</span> <span class="o">+</span> <span class="n">response</span><span class="o">.</span><span class="na">debugString</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>  
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Sending enquire link. It allow to check alive status of other party
application. It can be sent both by SMSC and ESME:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">EnquireLink</span> <span class="n">request</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EnquireLink</span><span class="o">();</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Enquire Link request &quot;</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="na">debugString</span><span class="o">());</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">EnquireLinkResp</span> <span class="n">response</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="na">enquireLink</span><span class="o">(</span><span class="n">request</span><span class="o">);</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Enquire Link response &quot;</span> <span class="o">+</span> <span class="n">response</span><span class="o">.</span><span class="na">debugString</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Sending SMS message to a device:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">SubmitSM</span> <span class="n">request</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SubmitSM</span><span class="o">();</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setServiceType</span><span class="o">(</span><span class="n">serviceType</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setSourceAddr</span><span class="o">(</span><span class="n">createAddress</span><span class="o">(</span><span class="n">senderPhoneNumber</span><span class="o">));</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setDestAddr</span><span class="o">(</span><span class="n">createAddress</span><span class="o">(</span><span class="n">recipientPhoneNumber</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setShortMessage</span><span class="o">(</span><span class="n">messageText</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setScheduleDeliveryTime</span><span class="o">(</span><span class="n">deliveryTime</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setReplaceIfPresentFlag</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setEsmClass</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setProtocolId</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setPriorityFlag</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setRegisteredDelivery</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setDataCoding</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="n">request</span><span class="o">.</span><span class="na">setSmDefaultMsgId</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">SubmitSMResp</span> <span class="n">response</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="na">submit</span><span class="o">(</span><span class="n">request</span><span class="o">);</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Submit response &quot;</span> <span class="o">+</span> <span class="n">response</span><span class="o">.</span><span class="na">debugString</span><span class="o">()</span> <span class="o">+</span> 
</span><span class='line'>        <span class="s">&quot;, message id &quot;</span> <span class="o">+</span> <span class="n">response</span><span class="o">.</span><span class="na">getMessageId</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>   
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="n">Address</span> <span class="nf">createAddress</span><span class="o">(</span><span class="n">String</span> <span class="n">address</span><span class="o">)</span> 
</span><span class='line'>        <span class="kd">throws</span> <span class="n">WrongLengthOfStringException</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Address</span> <span class="n">addressInst</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Address</span><span class="o">();</span>
</span><span class='line'>    <span class="n">addressInst</span><span class="o">.</span><span class="na">setTon</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">1</span><span class="o">);</span> <span class="c1">// national ton</span>
</span><span class='line'>    <span class="n">addressInst</span><span class="o">.</span><span class="na">setNpi</span><span class="o">((</span><span class="kt">byte</span><span class="o">)</span> <span class="mi">1</span><span class="o">);</span> <span class="c1">// numeric plan indicator</span>
</span><span class='line'>    <span class="n">addressInst</span><span class="o">.</span><span class="na">setAddress</span><span class="o">(</span><span class="n">address</span><span class="o">,</span> <span class="n">Data</span><span class="o">.</span><span class="na">SM_ADDR_LEN</span><span class="o">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">addressInst</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Unbinding. Logs out from the SMSC and closes the connection:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Send unbind request...&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="kd">final</span> <span class="n">UnbindResp</span> <span class="n">response</span> <span class="o">=</span> <span class="n">smppSession</span><span class="o">.</span><span class="na">unbind</span><span class="o">();</span>
</span><span class='line'>    <span class="n">log</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Unbind response &quot;</span> <span class="o">+</span> <span class="n">response</span><span class="o">.</span><span class="na">debugString</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>For more details please read SMPP v3.4 specification. Dmitriy Pavlenko,</p>
<p>SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Simply about Spring. Inversion of Control (IoC)]]></title><link href="http://www.sysgears.com/articles/simply-about-spring-inversion-control-ioc/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/simply-about-spring-inversion-control-ioc/</id><content type="html"><![CDATA[<p>This week I'll tell you about inversion of control. This is very useful
thing if you are going to develop dynamic application in compliance with
modern approach to software development.</p>
<!--more-->
<p>Spring framework gives  you flexibility providing dynamical beans
wiring, but for deeper understanding let's consider principle of
inversion of control beyond Spring. Look at this code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Calculator</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">DbWriter</span> <span class="n">dbWriter</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">Calculator</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Class Calculator can&#39;t be used in DbWriter absence.</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">dbWriter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DbWriter</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Some methods in Calculator class</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="n">Integer</span> <span class="nf">opAdd</span><span class="o">(</span><span class="n">Integer</span> <span class="n">a</span><span class="o">,</span> <span class="n">Integer</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="n">Integer</span> <span class="n">number</span><span class="o">){</span>
</span><span class='line'>         <span class="k">return</span> <span class="n">dbWriter</span><span class="o">.</span><span class="na">saveInDb</span><span class="o">(</span><span class="n">number</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DbWriter</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">DbWriter</span><span class="o">(){</span>
</span><span class='line'>        <span class="c1">// code for database initialization</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveInDb</span><span class="o">(</span><span class="n">Integer</span> <span class="n">value</span> <span class="o">){</span>
</span><span class='line'>       <span class="c1">// save value to db</span>
</span><span class='line'>
</span><span class='line'>       <span class="c1">// if save operation is successful return true</span>
</span><span class='line'>        <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This is an example of wrong style in designing programs, because of<br  />
program will lose its flexibility. Class Calculator can’t be used
independently of DBSaver class. So, what will you do if you have to
change code in a short time?</p>
<p>Thus we have to separate classes into two (or much more in real
projects) independent logical blocks called beans. Let’s to create a new
interface contains methods concerned with both classes.</p>
<p>In a such a way we destroy dependencies between two classes and obtain
possibility to choose right way to save data to db in our case.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">IResultSaver</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="n">Integer</span> <span class="n">result</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Calculator</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="n">IResultSaver</span> <span class="n">saver</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">Calculator</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Some methods in Calculator class</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="n">Integer</span> <span class="nf">opAdd</span><span class="o">(</span><span class="n">Integer</span> <span class="n">a</span><span class="o">,</span> <span class="n">Integer</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Here you can put any instance of classes implement IResultSaver</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="kt">void</span> <span class="nf">setSaver</span><span class="o">(</span><span class="n">IResultSaver</span> <span class="n">saver</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// Choose saver</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">saver</span> <span class="o">=</span> <span class="n">saver</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="n">Integer</span> <span class="n">resultToSave</span><span class="o">){</span>
</span><span class='line'>        <span class="n">rerurn</span> <span class="n">saver</span><span class="o">.</span><span class="na">saveResult</span><span class="o">(</span><span class="n">resultToSave</span><span class="o">)</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// DB saver.</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DbWriter</span> <span class="kd">implements</span> <span class="n">IResultSaver</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">DbWriter</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// code for database initialization</span>
</span><span class='line'>        <span class="n">initializeDbConnection</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Override</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="n">Integer</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">saveDbOperation</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">FileWriter</span> <span class="kd">implements</span> <span class="n">IResultSaver</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">FileWriter</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// code for database initialization</span>
</span><span class='line'>        <span class="n">initializeFile</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Override</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="n">Integer</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">saveFileOperation</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Calculator class can use any classes via interface, so we can use them<br  />
in elegant manner. So everything is clear, and we can apply this
principle<br  />
for calculation operations like in last article. This is a nice example
of inversion of control (IoS). Spring framework provides this trick
using containers for<br  />
creation some class instances and dependences between them in XML file.
Take a look at this code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">IOperation</span> <span class="o">{</span>
</span><span class='line'>   <span class="kd">public</span> <span class="n">Integer</span> <span class="nf">operation</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">a</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Integer</span> <span class="n">b</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">IResultSaver</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="n">Integer</span> <span class="n">result</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Calculator</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="n">IResultSaver</span> <span class="n">saver</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="n">IOperation</span> <span class="n">operation</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Spring container automaticaly sets</span>
</span><span class='line'>    <span class="c1">// beans corespond to XML conficuraion file via setters</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setSaver</span><span class="o">(</span><span class="n">IResultSaver</span> <span class="n">saver</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">saver</span> <span class="o">=</span> <span class="n">saver</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setOperation</span><span class="o">(</span><span class="n">AddBean</span> <span class="n">operation</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">operation</span> <span class="o">=</span> <span class="n">operation</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">saver</span><span class="o">.</span><span class="na">saveResult</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="n">Integer</span> <span class="nf">calculate</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">a</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Integer</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">operation</span><span class="o">.</span><span class="na">operation</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">// DB saver.</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DbWriter</span> <span class="kd">implements</span> <span class="n">IResultSaver</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">DbWriter</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">dataSourceName</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// code for database initialization</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Here you can initialize you db connection!&quot;</span>
</span><span class='line'>              <span class="o">+</span> <span class="n">dataSourceName</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// code for saving result</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;This is Db saver!&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">// File saver</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">FileWriter</span> <span class="kd">implements</span> <span class="n">IResultSaver</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">FileWriter</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">filename</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// code for database initialization</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Initializing file writer with parameter:file name&quot;</span> <span class="o">+</span> <span class="n">filename</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">saveResult</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">//code for saving result</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;This is file saver!&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">// Bean for add</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">AddBean</span> <span class="kd">implements</span> <span class="n">IOperation</span><span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="n">Integer</span> <span class="nf">operation</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">a</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Integer</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">// Bean for multiply</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MultiplyBean</span> <span class="kd">implements</span> <span class="n">IOperation</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="n">Integer</span> <span class="nf">operation</span><span class="o">(</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">a</span><span class="o">,</span><span class="kd">final</span> <span class="n">Integer</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="o">(</span><span class="n">Integer</span><span class="o">)</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">main</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">BeanFactory</span> <span class="n">factory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">XmlBeanFactory</span><span class="o">(</span><span class="k">new</span> <span class="n">ClassPathResource</span><span class="o">(</span><span class="s">&quot;spring-config.xml&quot;</span><span class="o">));</span>
</span><span class='line'>        <span class="n">Calculator</span> <span class="n">calculator</span> <span class="o">=</span> <span class="o">(</span><span class="n">Calculator</span><span class="o">)</span> <span class="n">factory</span><span class="o">.</span><span class="na">getBean</span><span class="o">(</span><span class="s">&quot;calculator&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">calculator</span><span class="o">.</span><span class="na">saveResult</span><span class="o">(</span><span class="n">calculator</span><span class="o">.</span><span class="na">calculate</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="mi">2</span><span class="o">));</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This is pretty sample of Inversion of control using Spring framework.
Spring container hides creation of instances of correspond beans, and we
obtain dynamic application.<br  />
Configuration information for container contains XML file and you can
change during execution of your application.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
</span><span class='line'><span class="nt">&lt;beans</span> <span class="na">xmlns=</span><span class="s">&quot;http://www.springframework.org/schema/beans&quot;</span>
</span><span class='line'><span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span>
</span><span class='line'><span class="na">xsi:schemaLocation=</span><span class="s">&quot;</span>
</span><span class='line'><span class="s">http://springframework.org/schema/beans</span>
</span><span class='line'><span class="s">http://springframework.org/schema/beans/spring-beans.xsd&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    
</span><span class='line'>    <span class="c">&lt;!--IOperation beans--&gt;</span>
</span><span class='line'>    <span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">&quot;add&quot;</span> <span class="na">class=</span><span class="s">&quot;InversioOfControl.AddBean&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">&quot;mul&quot;</span> <span class="na">class=</span><span class="s">&quot;InversioOfControl.MultiplyBean&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="c">&lt;!--IResultSaver beans--&gt;</span>
</span><span class='line'>    <span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">&quot;db&quot;</span> <span class="na">class=</span><span class="s">&quot;InversioOfControl.DbWriter&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;constructor-arg</span> <span class="na">value=</span><span class="s">&quot;yourDataSource&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/bean&gt;</span>
</span><span class='line'>    <span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">&quot;file&quot;</span> <span class="na">class=</span><span class="s">&quot;InversioOfControl.FileWriter&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;constructor-arg</span> <span class="na">value=</span><span class="s">&quot;fileForSave.txt&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/bean&gt;</span>
</span><span class='line'>    <span class="c">&lt;!-- Here we describe calculator bean contains two props --&gt;</span>
</span><span class='line'>    <span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">&quot;calculator&quot;</span> <span class="na">class=</span><span class="s">&quot;InversioOfControl.Calculator&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">&quot;saver&quot;</span> <span class="na">ref=</span><span class="s">&quot;db&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>        <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">&quot;operation&quot;</span> <span class="na">ref=</span><span class="s">&quot;add&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/bean&gt;</span>
</span><span class='line'><span class="nt">&lt;/beans&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>So user can choose beans dynamically, during program execution. User has
to change names of beans in property fields. Artem Zadorozhniy,SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Harnessing JIRA's SOAP API with Java]]></title><link href="http://www.sysgears.com/articles/harnessing-jiras-soap-api-java/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/harnessing-jiras-soap-api-java/</id><content type="html"><![CDATA[<p>JIRA is a popular issue tracking and project management software. It can
be used and accessed by lots of different means like IDE, email client
or a web browser. Also there are many plug-ins for all sorts of other
software products. Such an abundance is explained by the fact that JIRA
has open and convenient remote procedure call APIs: REST, XML-RPC and
SOAP.</p>
<p>So, it is possible to make your application communicate with JIRA
through these APIs, too. If correctly integrate a Java API client,
issuing a command to JIRA becomes the same as invoking a local
subroutine. Let’s create such a little Java program and do some
manipulations with an Issue in JIRA.</p>
<!--more-->
<p>SOAP is the preferred method for remote method calls in JIRA and is the
most frequently updated therefore we’ll stick with it. First of all,
ensure that
<a href="http://confluence.atlassian.com/display/JIRADEV/Enabling+the+RPC+plugin">
RPC is enabled</a> in your JIRA. For the client implementation JIRA's
proposing to generate .java files from WSDL description. But there is a
<a href="https://studio.plugins.atlassian.com/wiki/display/JSOAPLIB/JIRA+SOAP+Library">
precompiled library</a> already in a Atlassian Maven repository with all
dependencies needed. Simply put the dependency in your project’s .pom
file:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;repositories&gt;</span>
</span><span class='line'>   <span class="nt">&lt;repository&gt;</span>
</span><span class='line'>       <span class="nt">&lt;id&gt;</span>atlassian-contrib<span class="nt">&lt;/id&gt;</span>
</span><span class='line'>       <span class="nt">&lt;url&gt;</span>https[column]//maven.atlassian.com/contrib/<span class="nt">&lt;/url&gt;</span>
</span><span class='line'>   <span class="nt">&lt;/repository&gt;</span>
</span><span class='line'><span class="nt">&lt;/repositories&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;dependencies&gt;</span>
</span><span class='line'>  <span class="nt">&lt;dependency&gt;</span>
</span><span class='line'>    <span class="nt">&lt;groupId&gt;</span>org.swift.common<span class="nt">&lt;/groupId&gt;</span>
</span><span class='line'>    <span class="nt">&lt;artifactId&gt;</span>jira-soap<span class="nt">&lt;/artifactId&gt;</span>
</span><span class='line'>    <span class="nt">&lt;version&gt;</span>4.4.0<span class="nt">&lt;/version&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/dependency&gt;</span>
</span><span class='line'><span class="nt">&lt;/dependencies&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now you are ready to go. The first thing what you have to do is to log
in:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// Initialize JiraSoapService object, which will be used for all communication with JIRA</span>
</span><span class='line'><span class="n">String</span> <span class="n">ENDPOINT</span> <span class="o">=</span> <span class="s">&quot;/rpc/soap/jirasoapservice-v2&quot;</span><span class="o">;</span>
</span><span class='line'><span class="n">JiraSoapServiceServiceLocator</span> <span class="n">jiraSoapServiceGetter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JiraSoapServiceServiceLocator</span><span class="o">()</span> <span class="o">{{</span>
</span><span class='line'>   <span class="c1">// Provide your JIRA base URL like http://[host]:[port]</span>
</span><span class='line'>   <span class="n">setJirasoapserviceV2EndpointAddress</span><span class="o">(</span><span class="s">&quot;JIRA_BASE_URL&quot;</span> <span class="o">+</span> <span class="n">ENDPOINT</span><span class="o">);</span>
</span><span class='line'>   <span class="n">setMaintainSession</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
</span><span class='line'><span class="o">}};</span>
</span><span class='line'><span class="n">JiraSoapService</span> <span class="n">jiraSoapService</span> <span class="o">=</span> <span class="n">jiraSoapServiceGetter</span><span class="o">.</span><span class="na">getJirasoapserviceV2</span><span class="o">();</span>
</span><span class='line'><span class="c1">// Provide your username and password</span>
</span><span class='line'><span class="n">String</span> <span class="n">token</span> <span class="o">=</span> <span class="n">jiraSoapService</span><span class="o">.</span><span class="na">login</span><span class="o">(</span><span class="s">&quot;username&quot;</span><span class="o">,</span> <span class="s">&quot;password&quot;</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>After calling login on a JiraSoapService with a valid username and
password you will get a token that you will pass to all functions
hereafter.</p>
<p>From the moment you are logged in you can do manipulations. Suppose you
have an open Issue already in your JIRA. You can get available fields
for edition:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// Provide Issue key which you want to modify, like PROJECTNAME-###</span>
</span><span class='line'><span class="n">RemoteField</span><span class="o">[]</span> <span class="n">availableFields</span> <span class="o">=</span> <span class="n">jiraSoapService</span><span class="o">.</span><span class="na">getFieldsForEdit</span><span class="o">(</span><span class="n">token</span><span class="o">,</span> <span class="s">&quot;ISSUE_KEY&quot;</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>You can modify the Issue:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">RemoteFieldValue</span> <span class="n">descriptionField</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RemoteFieldValue</span><span class="o">(</span><span class="s">&quot;description&quot;</span><span class="o">,</span> <span class="k">new</span> <span class="n">String</span><span class="o">[]{</span><span class="s">&quot;new description&quot;</span><span class="o">});</span>
</span><span class='line'><span class="n">RemoteFieldValue</span> <span class="n">assigneeField</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RemoteFieldValue</span><span class="o">(</span><span class="s">&quot;assignee&quot;</span><span class="o">,</span> <span class="k">new</span> <span class="n">String</span><span class="o">[]{</span><span class="s">&quot;savvyAssignee&quot;</span><span class="o">});</span>
</span><span class='line'><span class="n">jiraSoapService</span><span class="o">.</span><span class="na">updateIssue</span><span class="o">(</span><span class="n">token</span><span class="o">,</span> <span class="n">issueKey</span><span class="o">,</span> <span class="k">new</span> <span class="n">RemoteFieldValue</span><span class="o">[]{</span><span class="n">descriptionField</span><span class="o">,</span> <span class="n">assigneeField</span><span class="o">});</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Just post a comment on the Issue:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">RemoteComment</span> <span class="n">remoteComment</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RemoteComment</span><span class="o">()</span> <span class="o">{{</span>
</span><span class='line'>       <span class="n">setBody</span><span class="o">(</span><span class="s">&quot;It was a really easy issue&quot;</span><span class="o">);</span>
</span><span class='line'><span class="o">}};</span>
</span><span class='line'><span class="n">jiraSoapService</span><span class="o">.</span><span class="na">addComment</span><span class="o">(</span><span class="n">token</span><span class="o">,</span> <span class="s">&quot;ISSUE_KEY&quot;</span><span class="o">,</span> <span class="n">remoteComment</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Or resolve the Issue:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">jiraSoapService</span><span class="o">.</span><span class="na">progressWorkflowAction</span><span class="o">(</span><span class="n">token</span><span class="o">,</span> <span class="s">&quot;ISSUE_KEY&quot;</span><span class="o">,</span> <span class="s">&quot;5&quot;</span><span class="o">,</span> <span class="k">new</span> <span class="n">RemoteFieldValue</span><span class="o">[]{});</span>
</span><span class='line'><span class="c1">//&quot;4&quot;--Start progress, &quot;5&quot;--Resolve, &quot;3&quot;--Reopen</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This is just a little example to help you get started, there is a
plethora of stuff to play with. Study
<a href="http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/soap/JiraSoapService.html">
JiraSoapService</a> documentation to know what more you can do with your
JIRA.</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Creating SOAP client from wsdl file]]></title><link href="http://www.sysgears.com/articles/creating-soap-client-wsdl-file/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/creating-soap-client-wsdl-file/</id><content type="html"><![CDATA[<p>Today we’ll talk about writing java client for exchanging data with web
service using SOAP protocol specification. Many of the web services that
supports SOAP have java libraries that can make this task pretty simple
to implement.<br  />
But if there is no such feature, then it becomes a little tricky, but in
this article I will show you that it's not so hard as it seems.</p>
<!--more-->
<p>At first, you should find out the location of wsdl file, which describes
functionality offered by a web service. When it’s done, you can simply
get the java code from it that will be able to send any request
supported by the web service.<br  />
There is a bunch of tools that provide wsdl2java transfer, for example:
Apache CXF, JAX-WS WS import, Apache Axis.</p>
<p>For making the code generating more convenient, I used
<a href="http://www.eviware.com/soapUI/soapui-products-overview.html">
SoapUI</a> application.  There you may generate the code through any of
these tools by using user friendly interface, furthermore, it supports
not only the tools that generate java code, but also tools that generate
.NET 2.0 artifacts, XML beans and so on. Just specify the path to the
folder with tool you want to use in global preferences, select it in the
‘Tools’ tab, specify path to the wsdl file and output directory and here
you go, you have generated your own SOAP library, have fun! Follow the
<a href="http://www.soapui.org/SOAP-and-WSDL/code-generation.html">link
</a> for more details.</p>
<p>Note: while generating code from wsdl, you may get this kind of error:<br  />
‘Rpc/encoded wsdls are not supported with ...’. This means wa has parts
with rpc/encoded style model, that is not supported by WS import, CXF,
Axis 2.<em> and some other tools, if this error appears, use Apache Axis
1.</em></p>
<p>Andrey Shevchenko,<br  />
SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[API Enhancements in Java SE 7. Part 2]]></title><link href="http://www.sysgears.com/articles/api-enhancements-java-se-7-part-2/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/api-enhancements-java-se-7-part-2/</id><content type="html"><![CDATA[<p><strong>Part 2. The try-with-resources statement. Catching multiple exception
types.</strong></p>
<p><strong>The try-with-resources or ARM (Automatic Resource Management).</strong>
Try-with-resources statement is a try that declares one or more
resources which will be closed automatically when the statement
completes. It helps to avoid resource leaks that may occur when used an
ordinary try statement with finally block.</p>
<!--more-->
<p>Each resource must implement AutoCloseable or Closeable interface, for
example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// AutoCloseable implementation</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">Resource</span> <span class="kd">implements</span> <span class="n">AutoCloseable</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">doAction</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">throw</span> <span class="k">new</span> <span class="nf">Exception</span><span class="o">(</span><span class="s">&quot;Resource action exception&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="nd">@Override</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">throw</span> <span class="k">new</span> <span class="nf">Exception</span><span class="o">(</span><span class="s">&quot;Resource close exception&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">try</span> <span class="o">(</span><span class="n">Resource</span> <span class="n">resource</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Resource</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">resource</span><span class="o">.</span><span class="na">doAction</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">throw</span> <span class="n">e</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The resource is automatically closed when doAction() throws an
exception, the close exception are suppressed. To retrieve suppressed
exception, call the Throwable.getSuppressed method from the exception
thrown by the try block.</p>
<p>Consider example of try-with-resources statement with several declared
resources:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// ResourceB implementation is the similar to Resource implementation in the first example</span>
</span><span class='line'><span class="k">try</span> <span class="o">(</span><span class="n">Resource</span> <span class="n">resource</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Resource</span><span class="o">();</span>
</span><span class='line'>     <span class="n">ResourceB</span> <span class="n">resourceB</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ResourceB</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">resource</span><span class="o">.</span><span class="na">doAction</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">throw</span> <span class="n">e</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In that case when doAction() throws the exception, both resources are
automatically closed in the reverse order to which they were created.<br  />
Also try-with-resources statements may contain finally blocks, finally
block is started after all resources have been closed.</p>
<p><strong>Multiple exception types catching.</strong> In Java 7, single catch block can
handle several different exception types which was impossible in prior
Java releases. It allows to reduce code duplication, for example old
try-catch:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">catch</span> <span class="o">(</span><span class="n">ConnectException</span> <span class="n">ex</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>     <span class="c1">// handling code</span>
</span><span class='line'>     <span class="k">throw</span> <span class="n">ex</span><span class="o">;</span>
</span><span class='line'><span class="k">catch</span> <span class="o">(</span><span class="n">DBException</span> <span class="n">ex</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>     <span class="c1">// the came handling code</span>
</span><span class='line'>     <span class="k">throw</span> <span class="n">ex</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now can be replaced with:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="k">catch</span> <span class="o">(</span><span class="n">ConnectException</span> <span class="o">|</span> <span class="n">DBException</span> <span class="n">ex</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// handling code</span>
</span><span class='line'>    <span class="k">throw</span> <span class="n">ex</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>In the first example the handling code is difficult to allocate because
each catch parameter has different type. In the second example, which is
more preferred for the use, all types are specified in single catch and
code has no replication of handlers.</p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Immutable Collections in Java]]></title><link href="http://www.sysgears.com/articles/immutable-collections-java-0/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/immutable-collections-java-0/</id><content type="html"><![CDATA[<p>Occasionally, while programming, one may want to create constant sets
and store them in final variables for public use. Such a desire can lead
to all sorts of problems.</p>
<!--more-->
<p>Consider this example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">examples</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ClassicalElements</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">ELEMENTS</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">ELEMENTS</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
</span><span class='line'>        <span class="n">ELEMENTS</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Earth&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">ELEMENTS</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Water&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">ELEMENTS</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Air&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">ELEMENTS</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Fire&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The goal of this code is to create a class with a Set of final and
static elements. All the purpose of it is to have a Set that can be used
without concerns about possibility of accidentally changing it. The
problem is that this Set isn't final at all! Breaking it is not a big
deal:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">breakMethod</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">elemets</span> <span class="o">=</span> <span class="n">ClassicalElements</span><span class="o">.</span><span class="na">ELEMETS</span><span class="o">;</span>
</span><span class='line'>    <span class="n">elemets</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Metal&quot;</span><span class="o">);</span> <span class="c1">// &lt;= unnoticible logic error</span>
</span><span class='line'>    <span class="c1">//...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The reference to the Set is final, but the Set itself is mutable. To say
short, this constant variable isn't very constant. The point is that
final is not the same as immutable. Let’s firm up this Set with in the
following way:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">.</span><span class="na">examples</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ClassicalElementsBetter</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">ELEMENTS</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">static</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">temp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
</span><span class='line'>        <span class="n">temp</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Earth&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">temp</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Water&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">temp</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Air&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">temp</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Fire&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">ELEMENTS</span> <span class="o">=</span> <span class="n">Collections</span><span class="o">.</span><span class="na">unmodifiableSet</span><span class="o">(</span><span class="n">temp</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This variant of the class is much better. The Set of elements cannot be
modified because it has been turned into an immutable object. The
reference to the Set is final, and the contents of the collection are
locked down.<br  />
Note that it is necessary to use a temporary set to store the elements.
This is because you can set a final variable only once, even in the
static{} initializer. If you try to set it more than once or change the
variable in the initializer, your compiler will give an error message
stating that you cannot change the final variable. Now, with the
strategy to lock down a final Set, let's revisit the logic bug discussed
in the previous example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">breakMethod</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">elemets</span> <span class="o">=</span> <span class="n">ClassicalElementsBetter</span><span class="o">.</span><span class="na">ELEMETS</span><span class="o">;</span>
</span><span class='line'>    <span class="n">elemets</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;Metal&quot;</span><span class="o">);</span> <span class="c1">// &lt;= exception here</span>
</span><span class='line'>    <span class="c1">//...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Now, after locking down the Set, this code results in an exception.
Specifically, the method will throw an UnsupportedOperationException
whenever a user tries to use any write methods on ELEMENTS, as it is now
immutable. Although this is not as prominent as compile time error, it
is definitely better than nothing. You should always use the
java.util.Collections to get unchangable collections and maps when
creating final collections and maps.</p>
<p>Keep in mind that there is no similar way to lock down final array
objects, so be careful when using them.</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Get process list in Unix based systems in Java.]]></title><link href="http://www.sysgears.com/articles/get-process-list-unix-based-systems-java/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/get-process-list-unix-based-systems-java/</id><content type="html"><![CDATA[<p>In this article we’ll talk about how to get process list in Java by
running standard Unix commands.</p>
<!--more-->
<p>Lets check out the example of checking work of the java application. One
of the solution could be the jvmstat. It’s a reliable and powerful tool,
but much simpler and faster solution is to use standard Unix command
'ps': you can execute it like any other command by using exec() method
of java.lang.Runtime class.<br  />
If you want to check the work of java application, run ‘ps’ command with
‘-ef’ options, that will show you not only the command, time and PID of
all the running processes, but also the full listing, which contains
necessary information about the file that is being executed and program
parameters. Otherwise, if the list of PID and commands of running
processes is enough for you, run 'ps -e'.</p>
<p>Here is the code I used in my application, hope it will be helpful.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">String</span> <span class="n">line</span><span class="o">;</span>
</span><span class='line'><span class="c1">//Executable file name of the application to check. </span>
</span><span class='line'><span class="kd">final</span> <span class="n">String</span> <span class="n">applicationToCheck</span> <span class="o">=</span> <span class="s">&quot;application.jar&quot;</span>
</span><span class='line'><span class="kt">boolean</span> <span class="n">applicationIsOk</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
</span><span class='line'><span class="c1">//Running command that will get all the working processes.</span>
</span><span class='line'><span class="n">Process</span> <span class="n">proc</span> <span class="o">=</span> <span class="n">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">().</span><span class="na">exec</span><span class="o">(</span><span class="s">&quot;ps -ef&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">InputStream</span> <span class="n">stream</span> <span class="o">=</span> <span class="n">proc</span><span class="o">.</span><span class="na">getInputStream</span><span class="o">();</span>
</span><span class='line'><span class="n">BufferedReader</span> <span class="n">reader</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BufferedReader</span><span class="o">(</span><span class="k">new</span> <span class="n">InputStreamReader</span><span class="o">(</span><span class="n">stream</span><span class="o">));</span>
</span><span class='line'><span class="c1">//Parsing the input stream.</span>
</span><span class='line'><span class="k">while</span> <span class="o">((</span><span class="n">line</span> <span class="o">=</span> <span class="n">reader</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Pattern</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">Pattern</span><span class="o">.</span><span class="na">compile</span><span class="o">(</span><span class="n">applicationToCheck</span><span class="o">);</span>
</span><span class='line'>    <span class="n">Matcher</span> <span class="n">matcher</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="na">matcher</span><span class="o">(</span><span class="n">line</span><span class="o">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">(</span><span class="n">matcher</span><span class="o">.</span><span class="na">find</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">applicationIsOk</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>        <span class="k">break</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Andrey Shevchenko,</p>
<p>SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[API Enhancements in Java SE 7]]></title><link href="http://www.sysgears.com/articles/api-enhancements-java-se-7/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/api-enhancements-java-se-7/</id><content type="html"><![CDATA[<p>Recently released Java 7 has a lot API enhancements. They are binary
literals, try-with-resources, switch statements with strings, improved
numeric literals and try-catch with multiple exception catching. This
article briefly describes most common use cases of new API features.</p>
<!--more-->
<p><strong>Part 1.</strong> <strong>Underscores in numeric literals. Strings in switch
statements.</strong> <strong>Binary literals.</strong> <strong>Underscores in numeric literals.</strong>
Numeric literal can be separated into groups using any number of
underscore characters. The literal will be invalid if it has underscores
that are placed:</p>
<ul>
<li>before or after a decimal point</li>
<li>before F, f, D, d, ... suffixes</li>
<li>at literal beginning or end
Correct:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kt">int</span> <span class="n">i1</span> <span class="o">=</span> <span class="mi">10</span><span class="n">_103</span><span class="o">;</span>    <span class="c1">// 10103</span>
</span><span class='line'><span class="kt">int</span> <span class="n">i2</span> <span class="o">=</span> <span class="mi">10</span><span class="n">______103</span><span class="o">;</span>    <span class="c1">// 10103</span>
</span><span class='line'><span class="kt">int</span> <span class="n">i3</span> <span class="o">=</span> <span class="mi">0</span><span class="n">_12</span><span class="o">;</span>    <span class="c1">// 012 - octal literal</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<p>Incorrect:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kt">float</span> <span class="n">f</span> <span class="o">=</span> <span class="mi">10</span><span class="n">_</span><span class="o">.</span><span class="mi">3432</span><span class="n">F</span><span class="o">;</span>
</span><span class='line'><span class="kt">long</span> <span class="n">l</span> <span class="o">=</span> <span class="mi">10</span><span class="n">_L</span><span class="o">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">12</span><span class="n">_</span><span class="o">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="n">_x12</span><span class="o">;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Underscores can be used for digits separation to make code more
readable, for example binary or hexadecimal literals can be separated by
bytes:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kt">int</span> <span class="n">i1</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b10010010_10010010_10010010_10010010</span>
</span><span class='line'><span class="kt">int</span> <span class="n">i2</span> <span class="o">=</span> <span class="mh">0x92</span><span class="n">_92_92_92</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><strong>Strings in switch statements.</strong> In Java 7 switch statement was
extended, now it works with String class. Strings comparing is
implemented by equals() method, for example a switch statement with
string:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="n">String</span> <span class="nf">getPlanetSize</span><span class="o">(</span><span class="n">String</span> <span class="n">planet</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">size</span><span class="o">;</span>
</span><span class='line'>   <span class="k">switch</span> <span class="o">(</span><span class="n">planet</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">case</span> <span class="s">&quot;Earth&quot;</span><span class="o">:</span>
</span><span class='line'>           <span class="n">size</span> <span class="o">=</span> <span class="s">&quot;Small&quot;</span><span class="o">;</span>
</span><span class='line'>           <span class="k">break</span><span class="o">;</span>
</span><span class='line'>       <span class="k">case</span> <span class="s">&quot;Jupiter&quot;</span><span class="o">:</span>
</span><span class='line'>       <span class="k">case</span> <span class="s">&quot;Saturn&quot;</span><span class="o">:</span>
</span><span class='line'>           <span class="n">size</span> <span class="o">=</span> <span class="s">&quot;Large&quot;</span><span class="o">;</span>
</span><span class='line'>           <span class="k">break</span><span class="o">;</span>
</span><span class='line'>       <span class="c1">// ---------------</span>
</span><span class='line'>       <span class="k">default</span><span class="o">:</span>
</span><span class='line'>           <span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalArgumentException</span><span class="o">(</span><span class="s">&quot;Invalid pl: &quot;</span> <span class="o">+</span> <span class="n">planet</span><span class="o">);</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="k">return</span> <span class="n">size</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Works like If-then-else chain:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="n">String</span> <span class="nf">getPlanetSize</span><span class="o">(</span><span class="n">String</span> <span class="n">planet</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">String</span> <span class="n">size</span><span class="o">;</span>
</span><span class='line'>   <span class="k">if</span> <span class="o">(</span><span class="n">planet</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;Earth&quot;</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">size</span> <span class="o">=</span> <span class="s">&quot;Small&quot;</span><span class="o">;</span>
</span><span class='line'>   <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">planet</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;Jupiter&quot;</span><span class="o">)</span> <span class="o">||</span> <span class="n">planet</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;Saturn&quot;</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">size</span> <span class="o">=</span> <span class="s">&quot;Large&quot;</span><span class="o">;</span>
</span><span class='line'>   <span class="c1">// --------------</span>
</span><span class='line'>   <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>       <span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalArgumentException</span><span class="o">(</span><span class="s">&quot;Invalid pl: &quot;</span> <span class="o">+</span> <span class="n">planet</span><span class="o">);</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="k">return</span> <span class="n">size</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Switch is more preferred because code generated by Java compiler from a
switch with strings is more efficient than from if-then-else statements.
<strong>Binary literals.</strong> Binary literal must be prefixed by 0b or 0B, for
example:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kt">int</span> <span class="n">i1</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b101</span><span class="o">;</span>
</span><span class='line'><span class="c1">// or</span>
</span><span class='line'><span class="kt">int</span> <span class="n">i2</span> <span class="o">=</span> <span class="mi">0</span><span class="n">B101</span><span class="o">;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>You can use binary literals to express integral types:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kt">byte</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b10010010</span>    <span class="c1">// up to 8 bit</span>
</span><span class='line'><span class="kt">short</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b1001001010010010</span>    <span class="c1">// up to 16 bit</span>
</span><span class='line'><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b10010010100100101001001010010010</span>    <span class="c1">// up to 32 bit</span>
</span><span class='line'><span class="kt">long</span> <span class="n">l</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b1001001010010010100100101001001010010010100100101001001010010010</span>    <span class="c1">// up to 64 bit</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Binary literals are applicable for tasks with bit operations, it’s much
more human readable in bitwise in bitshift operations:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kt">byte</span> <span class="n">hex</span> <span class="o">=</span> <span class="mh">0xA</span> <span class="o">|</span> <span class="mh">0x9</span><span class="o">;</span>
</span><span class='line'><span class="kt">byte</span> <span class="n">binary</span> <span class="o">=</span> <span class="mi">0</span><span class="n">b00001010</span> <span class="o">|</span> <span class="mi">0</span><span class="n">b00001001</span><span class="o">;</span>
</span><span class='line'><span class="k">assert</span> <span class="n">binary</span> <span class="o">==</span> <span class="n">hex</span><span class="o">;</span>
</span><span class='line'><span class="k">assert</span> <span class="n">binary</span> <span class="o">==</span> <span class="o">(</span><span class="kt">byte</span><span class="o">)</span><span class="mh">0xB</span><span class="o">;</span>
</span><span class='line'><span class="k">assert</span> <span class="n">binary</span> <span class="o">==</span> <span class="o">(</span><span class="kt">byte</span><span class="o">)</span><span class="mi">0</span><span class="n">b00001011</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Authorize.Net CIM With Java SDK: How To Bill Your Customers]]></title><link href="http://www.sysgears.com/articles/authorizenet-cim-java-sdk-how-bill-your-customers/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/authorizenet-cim-java-sdk-how-bill-your-customers/</id><content type="html"><![CDATA[<p>Authorize.Net is a popular payment gateway service provider allowing
merchants to accept credit card and electronic check payments.<br  />
Using such a gateway to issue a one-time transactions doesn't raise any
great troubles, but serving returning customers or managing complex
subscriptions requires you either to be compliant with the Payment Card
Industry Data Security Standard (PCI DSS) or to ask your customer to
re-enter his or her billing info every time. Neither is always what you
want. Well, among other Authorize's features there is a Customer
Information Manager (CIM), which targets that particular problem.</p>
<!--more-->
<p>CIM makes it possible to charge returning customers and process
recurring transactions without the need to store sensitive information
in your database. This is achieved by storing customers' payment
information on Authorize’s secure servers and accessing it later by IDs.
For each customer you create a separate customer profile, which can
include up to 10 payment profiles and up to 100 shipping profiles.</p>
<p>All the communication with Authorize.Net occurs through XML calls or
SOAP. Guides devoted to this topic can be downloaded from Authorize's
website. Thankfully you do not have to worry about constructing correct
requests and parsing responses. This routine is done by Java SDK
provided by Authorize. But to the big surprise there is very scant
information on how to work with this SDK. So, I'll try to fill this gap
and begin with an overview of the least effort required to bill a
customer.<br  /></p>
<p>To start working with Authorize CIM first
<a href="https://developer.authorize.net/testaccount">sign up for a test
account</a> to obtain an API Login ID and Transaction Key. These keys
will authenticate requests to the payment gateway.<br  />
Secondly, manually <a href="https://developer.authorize.net/downloads/">
download</a> net.authorize:anet-java-sdk artifact, as it is not
available from any public maven repository, and place it in your local
or corporate maven repository.<br  />
As a code example let’s create a customer and make a test transaction.</p>
<p>Classes we are working with are:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.Environment</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.Merchant</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.cim.Result</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.cim.Transaction</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.cim.TransactionType</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.Order</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.creditcard.CreditCard</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.cim.CustomerProfile</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.cim.PaymentTransaction</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.cim.PaymentProfile</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.xml.CustomerType</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">net.authorize.data.xml.Payment</span><span class="o">;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>First we must create customer profile with an appropriate billing
information:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// Create a merchant object:</span>
</span><span class='line'><span class="n">String</span> <span class="n">apiLoginID</span> <span class="o">=</span> <span class="s">&quot;YOUR_API_LOGIN_ID&quot;</span><span class="o">;</span>
</span><span class='line'><span class="n">String</span> <span class="n">transactionKey</span> <span class="o">=</span> <span class="s">&quot;YOUR_TRANSACTION_KEY&quot;</span><span class="o">;</span>
</span><span class='line'><span class="n">Merchant</span> <span class="n">merchant</span> <span class="o">=</span> <span class="n">Merchant</span><span class="o">.</span><span class="na">createMerchant</span><span class="o">(</span><span class="n">Environment</span><span class="o">.</span><span class="na">SANDBOX</span><span class="o">,</span> <span class="n">apiLoginID</span><span class="o">,</span> <span class="n">transactionKey</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Construct a transaction to create a customer profile along with a customer payment profile. Also a shipping profile if you want</span>
</span><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">CREATE_CUSTOMER_PROFILE</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add customer profile information</span>
</span><span class='line'><span class="n">CustomerProfile</span> <span class="n">customerProfile</span> <span class="o">=</span> <span class="n">CustomerProfile</span><span class="o">.</span><span class="na">createCustomerProfile</span><span class="o">();</span>
</span><span class='line'><span class="n">customerProfile</span><span class="o">.</span><span class="na">setMerchantCustomerId</span><span class="o">(</span><span class="s">&quot;CustomerID&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">customerProfile</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">&quot;customer[at]email.test&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">customerProfile</span><span class="o">.</span><span class="na">setDescription</span><span class="o">(</span><span class="s">&quot;Test account&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfile</span><span class="o">(</span><span class="n">customerProfile</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add customer payment profile information</span>
</span><span class='line'><span class="n">CreditCard</span> <span class="n">creditCard</span> <span class="o">=</span> <span class="n">CreditCard</span><span class="o">.</span><span class="na">createCreditCard</span><span class="o">();</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setCreditCardNumber</span><span class="o">(</span><span class="s">&quot;4111 1111 1111 1111&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setExpirationMonth</span><span class="o">(</span><span class="s">&quot;12&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">creditCard</span><span class="o">.</span><span class="na">setExpirationYear</span><span class="o">(</span><span class="s">&quot;2020&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">Payment</span> <span class="n">payment</span> <span class="o">=</span> <span class="n">Payment</span><span class="o">.</span><span class="na">createPayment</span><span class="o">(</span><span class="n">creditCard</span><span class="o">);</span>
</span><span class='line'><span class="n">PaymentProfile</span> <span class="n">paymentProfile</span> <span class="o">=</span> <span class="n">PaymentProfile</span><span class="o">.</span><span class="na">createPaymentProfile</span><span class="o">();</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">setCustomerType</span><span class="o">(</span><span class="n">CustomerType</span><span class="o">.</span><span class="na">INDIVIDUAL</span><span class="o">);</span>
</span><span class='line'><span class="n">paymentProfile</span><span class="o">.</span><span class="na">addPayment</span><span class="o">(</span><span class="n">payment</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">addPaymentProfile</span><span class="o">(</span><span class="n">paymentProfile</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Send request</span>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Check if the response is positive and signal if it is not</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="na">isOk</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Transaction has succeeded!\n&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Customer profile ID: &quot;</span> <span class="o">+</span> <span class="n">result</span><span class="o">.</span><span class="na">getCustomerProfileId</span><span class="o">()</span> <span class="o">+</span> <span class="s">&quot;\n&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Customer payment profile ID: &quot;</span> <span class="o">+</span> <span class="n">result</span><span class="o">.</span><span class="na">getCustomerPaymentProfileIdList</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;\n&quot;</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Transaction has failed. Reason: &quot;</span> <span class="o">+</span> <span class="n">result</span><span class="o">.</span><span class="na">getMessages</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">getText</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>You should store these retrieved IDs for the future use. Then, when the
need arises, you can charge that customer with his IDs:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// Create payment transaction</span>
</span><span class='line'><span class="n">Transaction</span> <span class="n">transaction</span> <span class="o">=</span> <span class="n">merchant</span><span class="o">.</span><span class="na">createCIMTransaction</span><span class="o">(</span><span class="n">TransactionType</span><span class="o">.</span><span class="na">CREATE_CUSTOMER_PROFILE_TRANSACTION</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Set customer ID and customer&#39;s payment profile ID that you want to be billed</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerProfileId</span><span class="o">(</span><span class="s">&quot;customerProfileId&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setCustomerPaymentProfileId</span><span class="o">(</span><span class="s">&quot;paymentProfileId&quot;</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add information about the transaction</span>
</span><span class='line'><span class="n">PaymentTransaction</span> <span class="n">paymentTransaction</span> <span class="o">=</span> <span class="n">PaymentTransaction</span><span class="o">.</span><span class="na">createPaymentTransaction</span><span class="o">();</span>
</span><span class='line'><span class="n">Order</span> <span class="n">order</span> <span class="o">=</span> <span class="n">Order</span><span class="o">.</span><span class="na">createOrder</span><span class="o">();</span>
</span><span class='line'><span class="n">order</span><span class="o">.</span><span class="na">setTotalAmount</span><span class="o">(</span><span class="k">new</span> <span class="n">BigDecimal</span><span class="o">(</span><span class="mf">9.99</span><span class="o">));</span>
</span><span class='line'><span class="n">order</span><span class="o">.</span><span class="na">setDescription</span><span class="o">(</span><span class="s">&quot;Test charge&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">paymentTransaction</span><span class="o">.</span><span class="na">setOrder</span><span class="o">(</span><span class="n">order</span><span class="o">);</span>
</span><span class='line'><span class="n">paymentTransaction</span><span class="o">.</span><span class="na">setTransactionType</span><span class="o">(</span><span class="n">net</span><span class="o">.</span><span class="na">authorize</span><span class="o">.</span><span class="na">TransactionType</span><span class="o">.</span><span class="na">AUTH_CAPTURE</span><span class="o">);</span>
</span><span class='line'><span class="n">transaction</span><span class="o">.</span><span class="na">setPaymentTransaction</span><span class="o">(</span><span class="n">paymentTransaction</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Send request and check the response</span>
</span><span class='line'><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Transaction</span><span class="o">&gt;)</span> <span class="n">merchant</span><span class="o">.</span><span class="na">postTransaction</span><span class="o">(</span><span class="n">transaction</span><span class="o">);</span>
</span><span class='line'><span class="k">if</span> <span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="na">isOk</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Payment has succeeded!\n&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Transaction ID: &quot;</span> <span class="o">+</span> <span class="n">result</span><span class="o">.</span><span class="na">getDirectResponseList</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">getDirectResponseMap</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="n">ResponseField</span><span class="o">.</span><span class="na">TRANSACTION_ID</span><span class="o">));</span>
</span><span class='line'><span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Payment has failed. Reason: &quot;</span> <span class="o">+</span> <span class="n">result</span><span class="o">.</span><span class="na">getMessages</span><span class="o">().</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">getText</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>After running your code, you can either inspect the response code result
or<a href="https://test.authorize.net/"> go to your transaction report
</a> to verify that the payment transaction succeeded.</p>
<p>Max Drobotov,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Drawing charts in Grails.]]></title><link href="http://www.sysgears.com/articles/drawing-charts-grails-0/"/><updated>2013-06-12T16:42:00+02:00</updated><id>http://www.sysgears.com/articles/drawing-charts-grails-0/</id><content type="html"><![CDATA[<p>Recently, I faced the problem of using charts in Grails web-application.
At first, I was thinking about using well-known java libraries, such as
<a href="http://www.jfree.org/">JFreeChart</a> . JFreeChart has a nice
look, nice written documentation, and pretty simple to use.</p>
<!--more-->
<p>But I was wondering about any Grails plugins that may be a better fit to
the needs of our web-application. And the first plug-in I found, seemed
to be pretty popular, it was a
<a href="http://www.grails.org/Google+Chart+Plugin">Google Chart Plugin
</a>, but what i didn’t found, was a good documentation. Actually, the
thing this plugin do is build an URL that leads to the chart, generated
by google chart service. So if its fine with you to use other external
web service in your application you could use Google Char API. And if<br  />
its not, you should probably use java library, or
<a href="http://www.grails.org/JFreeChart+Eastwood+Plugin">JFreeChart
Eastwood</a> plug-in for Grails , that uses JFreeChart for emulating
look of Google charts.</p>
<p>But the more simple and fast way to build a chart is actually using the
<a href="http://code.google.com/intl/ru-RU/apis/chart/">Google Chart API
</a>.  The way it works is downloading AJAX API and visualization
library, then it process received data and build the chart within the
browser using SVG or VML. You may try it out and check out the examples
at
<a href="http://code.google.com/apis/ajax/playground/?type=visualization">
http://code.google.com/apis/ajax/playground/?type=visualization</a> It
has a lot of different types of charts, pretty flexible and easy to
customize. The only reason why I can’t say that this is the best
solution to use in charts of web-application is the need of downloading
API and library every time the page loads, so it may slow down the work
of the web-application on a really slow connections.</p>
<p>Eventually I decided to use Google Chart API, and here is some code,
which draws an area chart with a date showing on the horizontal axis, it
shows how simple it is to draw a charts with this tool.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;text/javascript&#39;</span><span class="o">&gt;</span>  
</span><span class='line'>  <span class="c1">// Load the Visualization API and the area chart package.  </span>
</span><span class='line'>  <span class="nx">google</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;visualization&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="p">{</span><span class="nx">packages</span><span class="o">:</span><span class="p">[</span><span class="s1">&#39;corechart&#39;</span><span class="p">]});</span>
</span><span class='line'>  <span class="c1">// Set a callback to run when the Google Visualization API is loaded.</span>
</span><span class='line'>  <span class="nx">google</span><span class="p">.</span><span class="nx">setOnLoadCallback</span><span class="p">(</span><span class="nx">drawChart</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Callback that creates and populates a data table,</span>
</span><span class='line'>  <span class="c1">// instantiates the area chart, passes in the data and</span>
</span><span class='line'>  <span class="c1">// draws it.</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">drawChart</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">//Creates data table with the data passed from the Grails controller.</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">google</span><span class="p">.</span><span class="nx">visualization</span><span class="p">.</span><span class="nx">DataTable</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">data</span><span class="p">.</span><span class="nx">addColumn</span><span class="p">(</span><span class="s1">&#39;date&#39;</span><span class="p">,</span> <span class="s1">&#39;Date&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">data</span><span class="p">.</span><span class="nx">addColumn</span><span class="p">(</span><span class="s1">&#39;number&#39;</span><span class="p">,</span> <span class="s1">&#39;Subscribers&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">//List of the values to show.</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">subs</span> <span class="o">=</span> <span class="nx">$</span><span class="p">{</span><span class="nx">subscribers</span><span class="p">};</span>
</span><span class='line'>    <span class="c1">//Start date of chart&#39;s horizontal axis.</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">date</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">$</span><span class="p">{</span><span class="nx">currentMonthDate</span><span class="p">.</span><span class="nx">year</span> <span class="o">+</span> <span class="mi">1900</span><span class="p">},</span> <span class="nx">$</span><span class="p">{</span><span class="nx">currentMonthDate</span><span class="p">.</span><span class="nx">month</span><span class="p">},</span> <span class="nx">$</span><span class="p">{</span><span class="nx">currentMonthDate</span><span class="p">.</span><span class="nx">date</span><span class="p">});</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">subs</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">data</span><span class="p">.</span><span class="nx">addRow</span><span class="p">([</span><span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">date</span><span class="p">.</span><span class="nx">getTime</span><span class="p">()</span> <span class="o">+</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">86400000</span><span class="p">),</span> <span class="nx">subs</span><span class="p">[</span><span class="nx">i</span><span class="p">]])</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="c1">//Instantiate and draw a chart to the &#39;chart_div&#39; div.</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">chart</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">google</span><span class="p">.</span><span class="nx">visualization</span><span class="p">.</span><span class="nx">AreaChart</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;chart_div&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">chart</span><span class="p">.</span><span class="nx">draw</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="p">{</span><span class="nx">width</span><span class="o">:</span> <span class="mi">600</span><span class="p">,</span> <span class="nx">height</span><span class="o">:</span> <span class="mi">300</span><span class="p">,</span> <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;#ffffff&#39;</span><span class="p">,</span> <span class="nx">legend</span><span class="o">:</span> <span class="s1">&#39;top&#39;</span><span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Andrey Shevchenko,</p>
<p>SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[MongoDB audit logging or how to log data changes using MongoDB]]></title><link href="http://www.sysgears.com/articles/mongodb-audit-logging-or-how-log-data-changes-using-mongodb/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/mongodb-audit-logging-or-how-log-data-changes-using-mongodb/</id><content type="html"><![CDATA[<p>Audit logging allows restore easily all changes in case of data
corruption caused by wrong update operation or damage of database files.
The main questions are determining what approach can be used to log
changes and how the change log will be stored.</p>
<!--more-->
<p>There are several mechanisms that can be used to do this right way:</p>
<ul>
<li>create detached audit table that holds copies of all changed
documents, this collection can be single, or we can create one table for
each collection whose changes need to be tracked.</li>
<li>store values of changed columns to single audit collection.</li>
<li>queries log, then we can restore data by executing them the same way.</li>
</ul>
<p>First two approaches work great but they do not applicable for
multi-update queries, because the mongo doesn't support transactions or
atomically update across different collections. Multi-update queries
significantly reduce load on database, if you want to use them the third
case will be your choice definitely. Let's consider it.</p>
<p>To provide queries executing we should not only log changed documents
but also store additional info such as time of modification, delete
flag, etc. Typical schema of the 'audit' collection is:</p>
<ul>
<li>operation - name of update operation</li>
<li>time - time of update</li>
<li>optional fields, these fields may depend on update operation, for
example:<table style="width: 500px;" border="1" cellpadding="1" cellspacing="1">
<tbody><tr><td>Operation</td><td>Object</td><td>Criteria object</td><td>
Sort object</td><td>Update object</td><td>Insert flag</td><td>Multi flag
</td></tr><tr><td>Add</td><td>--</td><td> </td><td> </td><td> </td><td> 
</td><td> </td></tr><tr><td>Remove</td><td> </td><td>--</td><td> </td>
<td> </td><td> </td><td> </td></tr><tr><td>Update</td><td> </td><td>--
</td><td> </td><td>--</td><td>--</td><td>--</td></tr><tr><td>
FetchAndRemove</td><td> </td><td>--</td><td>--</td><td> </td><td> </td>
<td> </td></tr><tr><td>FindAndModify</td><td> </td><td>--</td><td>--
</td><td>--</td><td>--</td><td> </td></tr></tbody></table>
</li>
</ul>
<p>Since all queries will be logged on separate 'audit' collection, we can
place it even into different database to provide highest reliability.
Pros of that approach is the small size of an audit collection and
lowest additional load on database in compare to previous two. The main
problem is that data stored in mongoDB can be changed atomically only on
document level, so we unable to update the data and log changes at the
same time.</p>
<p>Dmitriy Pavlenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Simply about Spring]]></title><link href="http://www.sysgears.com/articles/simply-about-spring/"/><updated>2013-06-12T16:50:00+02:00</updated><id>http://www.sysgears.com/articles/simply-about-spring/</id><content type="html"><![CDATA[<p>This article is devoted to very popular framework Spring. It’s very
necessary theme for beginners in Java, because Spring is widespread
technology.<br  />
First of all let's consider wiring - dynamical  assembling of separated
beans, most important part of Spring framework technology. It's
important to keep in mind, that a good understanding of fundamental
things is a irreplaceable skill for really cool programmer.</p>
<!--more-->
<p>Spring framework works with module based applications, so let's take a
brief  look at simple programm which peform ariphmetic operations.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalcExample</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">CalcExample</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">}</span> 
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">CalcExample</span> <span class="n">calc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CalcExample</span><span class="o">();</span> <span class="n">calc</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">args</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span> 
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">void</span> <span class="nf">printResult</span><span class="o">(</span><span class="n">String</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span> 
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">long</span> <span class="nf">operate</span><span class="o">(</span><span class="kt">long</span> <span class="n">number1</span><span class="o">,</span> <span class="kt">long</span> <span class="n">number2</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">number1</span> <span class="o">+</span> <span class="n">number2</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="n">String</span> <span class="nf">getOpsName</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s">&quot; plus &quot;</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">execute</span><span class="o">(</span><span class="n">String</span> <span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kt">long</span> <span class="n">number1</span> <span class="o">=</span> <span class="n">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">argument</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>        <span class="kt">long</span> <span class="n">number2</span> <span class="o">=</span> <span class="n">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">argument</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
</span><span class='line'>        <span class="n">printResult</span><span class="o">(</span><span class="s">&quot;The result of &quot;</span> <span class="o">+</span> <span class="n">number1</span> <span class="o">+</span> <span class="n">getOpsName</span><span class="o">()</span> <span class="o">+</span> <span class="n">number2</span> <span class="o">+</span>
</span><span class='line'>        <span class="s">&quot; is &quot;</span> <span class="o">+</span> <span class="n">operate</span><span class="o">(</span><span class="n">number1</span><span class="o">,</span> <span class="n">number2</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;!&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Nice code for beginners, but  we have to obtain program contains<br  />
several modules, which can be changed in simple way. It's very useful
method of software development - separating  code into parts you can
change couple of them or add  following to rules complying rules
described in interfaces (or just implement it).</p>
<p>So we need interface in out program, let's do it:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Operation</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">long</span> <span class="nf">operate</span><span class="o">(</span><span class="kt">long</span> <span class="n">op1</span><span class="o">,</span> <span class="kt">long</span> <span class="n">op2</span><span class="o">);</span>
</span><span class='line'>    <span class="n">String</span> <span class="nf">getOpsName</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Addition
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">OpAdd</span> <span class="kd">implements</span> <span class="n">Operation</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">OpAdd</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getOpsName</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s">&quot; plus &quot;</span><span class="o">;</span> 
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">long</span> <span class="nf">operate</span><span class="o">(</span><span class="kt">long</span> <span class="n">number1</span><span class="o">,</span> <span class="kt">long</span> <span class="n">number2</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">number1</span> <span class="o">+</span> <span class="n">number2</span><span class="o">;</span> 
</span><span class='line'>    <span class="o">}</span> 
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Mutiply
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">OpMultiply</span> <span class="kd">implements</span> <span class="n">Operation</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">OpMultiply</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getOpsName</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s">&quot; times &quot;</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">long</span> <span class="nf">operate</span><span class="o">(</span><span class="kt">long</span> <span class="n">number1</span><span class="o">,</span> <span class="kt">long</span> <span class="n">number2</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">number1</span> <span class="o">*</span> <span class="n">number2</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalcExampleBeans</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">Operation</span> <span class="n">ops</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OpAdd</span><span class="o">();</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">ResultWriter</span> <span class="n">wtr</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ScreenWriter</span><span class="o">();</span>
</span><span class='line'>    
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">CalcExampleBeans</span> <span class="n">calc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CalcExampleBeans</span><span class="o">();</span>
</span><span class='line'>        <span class="n">calc</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">args</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">execute</span><span class="o">(</span><span class="n">String</span> <span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kt">long</span> <span class="n">number1</span> <span class="o">=</span> <span class="n">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">argument</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>        <span class="kt">long</span> <span class="n">number2</span> <span class="o">=</span> <span class="n">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">argument</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
</span><span class='line'>        <span class="n">wtr</span><span class="o">.</span><span class="na">showResult</span><span class="o">(</span><span class="s">&quot;The result of &quot;</span> <span class="o">+</span> <span class="n">number1</span> <span class="o">+</span> <span class="n">ops</span><span class="o">.</span><span class="na">getOpsName</span><span class="o">()</span> <span class="o">+</span> <span class="n">number2</span> <span class="o">+</span> 
</span><span class='line'>        <span class="s">&quot; is &quot;</span> <span class="o">+</span> <span class="n">ops</span><span class="o">.</span><span class="na">operate</span><span class="o">(</span><span class="n">number1</span><span class="o">,</span> <span class="n">number2</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;!&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Well, we have two separated beans OpAdd and OpMultiply, they both
implement interface Operation. Everything is clean but, what will we do,
if we need to change bean during program execution?<br  />
Here Spring can help us. Dynamically connecting beans via build.XML
file, Spring undertook to create container for connecting components
with their usage.<br  />
The beauty of this solution is that CalculateSpring  does not works with
instances of Operation or ResultWriter, but delegates this task to
Spring container. Spring container, in turn, reads configuration XML
file and   calls the bean descriptor.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">import</span> <span class="nn">org.springframework.beans.factory.BeanFactory</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.springframework.context.ApplicationContext</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.springframework.context.support.ClassPathXmlApplicationContext</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalculateSpring</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">Operation</span> <span class="n">ops</span><span class="o">;</span> <span class="kd">private</span> <span class="n">ResultWriter</span> <span class="n">wtr</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setOps</span><span class="o">(</span><span class="n">Operation</span> <span class="n">ops</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">ops</span> <span class="o">=</span> <span class="n">ops</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setWriter</span><span class="o">(</span><span class="n">ResultWriter</span> <span class="n">writer</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">wtr</span> <span class="o">=</span> <span class="n">writer</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span> 
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">ApplicationContext</span> <span class="n">context</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ClassPathXmlApplicationContext</span><span class="o">(</span><span class="s">&quot;beans.xml&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">BeanFactory</span> <span class="n">factory</span> <span class="o">=</span> <span class="o">(</span><span class="n">BeanFactory</span><span class="o">)</span> <span class="n">context</span><span class="o">;</span>
</span><span class='line'>        <span class="n">CalculateSpring</span> <span class="n">calc</span> <span class="o">=(</span><span class="n">CalculateSpring</span><span class="o">)</span> <span class="n">factory</span><span class="o">.</span><span class="na">getBean</span><span class="o">(</span><span class="s">&quot;opsbean&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">calc</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">args</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">execute</span><span class="o">(</span><span class="n">String</span> <span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kt">long</span> <span class="n">number1</span> <span class="o">=</span> <span class="n">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">argument</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>        <span class="kt">long</span> <span class="n">number2</span> <span class="o">=</span> <span class="n">Long</span><span class="o">.</span><span class="na">parseLong</span><span class="o">(</span><span class="n">argument</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
</span><span class='line'>        <span class="n">wtr</span><span class="o">.</span><span class="na">showResult</span><span class="o">(</span><span class="s">&quot;The result of &quot;</span> <span class="o">+</span> <span class="n">number1</span> <span class="o">+</span> <span class="n">ops</span><span class="o">.</span><span class="na">getOpsName</span><span class="o">()</span> <span class="o">+</span> <span class="n">number2</span> <span class="o">+</span> <span class="s">&quot; is &quot;</span> <span class="o">+</span> <span class="n">ops</span><span class="o">.</span><span class="na">operate</span><span class="o">(</span><span class="n">number1</span><span class="o">,</span> <span class="n">number2</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;!&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>So we create context, factory and via factory we can get bean.
ApplicationContext in Spring is a type BeanFactory. BeanFactory takes
ability of access to initialized JavaBeans, connected and managed by
Spring contailner. Although there are other classes in the BeanFactory
Spring, ApplicationContext class is much more commonly used because it
provides us with several valuable features - the inclusion of support
for internationalization, resource loading, integration with external
hierarchies contest  and much more.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
</span><span class='line'><span class="nt">&lt;beans</span> <span class="na">xmlns=</span><span class="s">&quot;http://www.springframework.org/schema/beans&quot;</span>
</span><span class='line'> <span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span>
</span><span class='line'> <span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://www.springframework.org/schema/beans</span>
</span><span class='line'><span class="s"> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">&quot;screen&quot;</span> <span class="na">class=</span><span class="s">&quot;com.wrox.begspring.ScreenWriter&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">&quot;multiply&quot;</span> <span class="na">class=</span><span class="s">&quot;com.wrox.begspring.OpMultiply&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">&quot;add&quot;</span> <span class="na">class=</span><span class="s">&quot;com.wrox.begspring.OpAdd&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">&quot;opsbean&quot;</span> <span class="na">class=</span><span class="s">&quot;com.wrox.begspring.CalculateSpring&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">&quot;ops&quot;</span> <span class="na">ref=</span><span class="s">&quot;multiply&quot;</span> <span class="nt">/&gt;</span> <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">&quot;writer&quot;</span> <span class="na">ref=</span><span class="s">&quot;screen&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/bean&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/beans&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The article will be continued next week, we'll talk about Inversion of
Control (IoS) in  Spring.</p>
<p>Artem Zadorozhniy,</p>
<p>SysGears.</p>
]]></content></entry><entry><title type="html"><![CDATA[Speedup of JSON parsing in Grails]]></title><link href="http://www.sysgears.com/articles/speedup-json-parsing-grails/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/articles/speedup-json-parsing-grails/</id><content type="html"><![CDATA[<p>Optimizing Web application request processing time is an important stage
of quality product development. While doing this part of the work on one
of our products we noticed that the huge bottleneck was buried inside
built-in JSON support in Grails. The problem was that built-in JSON
parser that comes with Grails is surprisingly slow. Thats why we
considered switching to using Java-based JSON parser instead.</p>
<!--more-->
<p>Jackson is considered to be one of the fastest (if not the fastest)
Java-based parsers. To use it inside grails project one should do the
following:</p>
<p>Add the jackson dependencies into BuildConfig.grooovy file:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">dependencies</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">compile</span> <span class="err">&#39;</span><span class="n">org</span><span class="o">.</span><span class="na">codehaus</span><span class="o">.</span><span class="na">jackson</span><span class="o">:</span><span class="n">jackson</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="nl">asl:</span><span class="mf">1.8</span><span class="o">.</span><span class="mi">3</span><span class="err">&#39;</span>
</span><span class='line'>    <span class="n">compile</span> <span class="err">&#39;</span><span class="n">org</span><span class="o">.</span><span class="na">codehaus</span><span class="o">.</span><span class="na">jackson</span><span class="o">:</span><span class="n">jackson</span><span class="o">-</span><span class="n">mapper</span><span class="o">-</span><span class="nl">asl:</span><span class="mf">1.8</span><span class="o">.</span><span class="mi">3</span><span class="err">&#39;</span>
</span><span class='line'>   <span class="c1">// ...</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Parsing JSON objects using Jackson is very similar to the build-in
grails parser, for example to parse the array of JSON objects one should
use the code like that using built-in grails parser:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">String</span> <span class="n">jsonString</span> <span class="o">=</span> <span class="o">...</span>
</span><span class='line'><span class="n">JSONArray</span> <span class="n">array</span> <span class="o">=</span> <span class="n">JSON</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">jsonString</span><span class="o">)</span>
</span><span class='line'><span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">array</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">JSONObject</span> <span class="n">map</span> <span class="o">=</span> <span class="n">array</span><span class="o">.</span><span class="na">getJSONObject</span><span class="o">(</span><span class="n">i</span><span class="o">)</span>
</span><span class='line'>    <span class="n">println</span> <span class="n">map</span>
</span><span class='line'>    <span class="c1">// The JSON object is parsed using grails into usual property -&gt; value map</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>To do the same using Jackson you should write the following code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">String</span> <span class="n">jsonString</span> <span class="o">=</span> <span class="o">...</span>
</span><span class='line'><span class="n">ObjectMapper</span> <span class="n">mapper</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObjectMapper</span><span class="o">()</span>
</span><span class='line'><span class="n">List</span><span class="o">&lt;</span><span class="n">Object</span><span class="o">&gt;</span> <span class="n">array</span> <span class="o">=</span> <span class="n">mapper</span><span class="o">.</span><span class="na">readValue</span> <span class="n">mapper</span><span class="o">.</span><span class="na">readValue</span><span class="o">(</span><span class="n">jsonString</span><span class="o">,</span> <span class="n">List</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
</span><span class='line'><span class="k">for</span> <span class="o">(</span><span class="n">Map</span> <span class="n">map</span> <span class="o">:</span> <span class="n">array</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">println</span> <span class="n">map</span>
</span><span class='line'>    <span class="c1">// The JSON object is parsed using Jackson into usual property -&gt; value map</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Writing JSON is also simple using Jackson:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Map</span> <span class="n">jsonObject</span> <span class="o">=</span> <span class="o">...</span>
</span><span class='line'><span class="n">ObjectMapper</span> <span class="n">mapper</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObjectMapper</span><span class="o">()</span>
</span><span class='line'><span class="n">String</span> <span class="n">jsonString</span> <span class="o">=</span> <span class="n">mapper</span><span class="o">.</span><span class="na">writeValueAsString</span><span class="o">(</span><span class="n">jsonObject</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>As a result of switching to Jackson to parse and write JSON we've got
10x time improvement of our request processing latency.</p>
<p>Victor Vlasenko,<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[MongoDB java driver. Builder for update operations.]]></title><link href="http://www.sysgears.com/articles/mongodb-java-driver-builder-update-operations/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/mongodb-java-driver-builder-update-operations/</id><content type="html"><![CDATA[<p>First, a little about MongoDB QueryBuilder. QueryBuilder is an utility
for creating DBObject queries. It's a simplest way to set search
criteria and much better to use for MongoDB's document-based query
language than BasicDBObjectBuilder.</p>
<!--more-->
<p>The following code shows QueryBuilder usage:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">DBCollection</span> <span class="n">collection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Mongo</span><span class="o">(</span><span class="s">&quot;localhost&quot;</span><span class="o">,</span> <span class="mi">27017</span><span class="o">)</span>
</span><span class='line'>        <span class="o">.</span><span class="na">getDB</span><span class="o">(</span><span class="s">&quot;test&quot;</span><span class="o">).</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;users&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">criteria</span> <span class="o">=</span> <span class="k">new</span> <span class="n">QueryBuilder</span><span class="o">().</span><span class="na">put</span><span class="o">(</span><span class="s">&quot;name&quot;</span><span class="o">)</span>
</span><span class='line'>        <span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;Perry&quot;</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="s">&quot;age&quot;</span><span class="o">).</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">20</span><span class="o">).</span><span class="na">get</span><span class="o">();</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">doc</span> <span class="o">=</span> <span class="n">collection</span><span class="o">.</span><span class="na">findOne</span><span class="o">(</span><span class="n">criteria</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>This code fetch one document from collection "users", where field name
is Perry and age is greater then 20.</p>
<p>What about updating queries? Unfortunately Java API for MongoDB does not
provide utility to help building update queries. If you want to create
query to update or increment doc field value you must use BasicDBObject
or BasicDBObjectBuilder. This approach is intuitive but queries built
that way is hard to update. So, we need an utility similar to
QueryBuilder. This code example shows simple Builder for update
operations:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Utility for creating DBObject updating queries.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Builder</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * DBObject query.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">DBObject</span> <span class="n">query</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Initialize updating builder.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">Builder</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">query</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicDBObject</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Sets not null value to field. All datatypes are</span>
</span><span class='line'><span class="cm">     * supported.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param key    field name</span>
</span><span class='line'><span class="cm">     * @param object value to set</span>
</span><span class='line'><span class="cm">     * @return current Builder with an appended operand</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">set</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">key</span><span class="o">,</span>
</span><span class='line'>                             <span class="kd">final</span> <span class="n">Object</span> <span class="n">object</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">addToQuery</span><span class="o">(</span><span class="n">Operators</span><span class="o">.</span><span class="na">SET</span><span class="o">,</span> <span class="n">key</span><span class="o">,</span> <span class="n">object</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Increments field by the number value if field</span>
</span><span class='line'><span class="cm">     * is present in the object, otherwise sets field</span>
</span><span class='line'><span class="cm">     * to the number value.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param key   field name</span>
</span><span class='line'><span class="cm">     * @param value number value</span>
</span><span class='line'><span class="cm">     * @return current Builder with an appended operand</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">inc</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">key</span><span class="o">,</span>
</span><span class='line'>                             <span class="kd">final</span> <span class="kt">int</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">addToQuery</span><span class="o">(</span><span class="n">Operators</span><span class="o">.</span><span class="na">INC</span><span class="o">,</span> <span class="n">key</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Deletes a given field.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param key field name</span>
</span><span class='line'><span class="cm">     * @return current Builder with an appended operand</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">unset</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">key</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">addToQuery</span><span class="o">(</span><span class="n">Operators</span><span class="o">.</span><span class="na">UNSET</span><span class="o">,</span> <span class="n">key</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Returns true if current Builder is empty.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @return true if current Builder is empty.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isEmpty</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="na">keySet</span><span class="o">().</span><span class="na">isEmpty</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Creates a DBObject query to be used for the driver&#39;s</span>
</span><span class='line'><span class="cm">     * update operations.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @return DBObject query instance</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="n">DBObject</span> <span class="nf">get</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">query</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Adds key-value to query.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param operator update operator</span>
</span><span class='line'><span class="cm">     * @param key      param to update</span>
</span><span class='line'><span class="cm">     * @param object   value to set</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">void</span> <span class="nf">addToQuery</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">operator</span><span class="o">,</span>
</span><span class='line'>                            <span class="kd">final</span> <span class="n">String</span> <span class="n">key</span><span class="o">,</span>
</span><span class='line'>                            <span class="kd">final</span> <span class="n">Object</span> <span class="n">object</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">BasicDBObject</span> <span class="n">subQuery</span> <span class="o">=</span>
</span><span class='line'>                <span class="n">query</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">operator</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span>
</span><span class='line'>                        <span class="o">(</span><span class="n">BasicDBObject</span><span class="o">)</span> <span class="n">query</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">operator</span><span class="o">)</span> <span class="o">:</span>
</span><span class='line'>                        <span class="k">new</span> <span class="nf">BasicDBObject</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">query</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">operator</span><span class="o">,</span> <span class="n">subQuery</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="n">object</span><span class="o">));</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * MongoDB keywords for various updating query operations.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Operators</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">SET</span> <span class="o">=</span> <span class="s">&quot;$set&quot;</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">INC</span> <span class="o">=</span> <span class="s">&quot;$inc&quot;</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">UNSET</span> <span class="o">=</span> <span class="s">&quot;$unset&quot;</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Builder usage:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">DBCollection</span> <span class="n">collection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Mongo</span><span class="o">(</span><span class="s">&quot;localhost&quot;</span><span class="o">,</span> <span class="mi">27017</span><span class="o">)</span>
</span><span class='line'>        <span class="o">.</span><span class="na">getDB</span><span class="o">(</span><span class="s">&quot;test&quot;</span><span class="o">).</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;users&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">criteria</span> <span class="o">=</span> <span class="k">new</span> <span class="n">QueryBuilder</span><span class="o">().</span><span class="na">put</span><span class="o">(</span><span class="s">&quot;name&quot;</span><span class="o">)</span>
</span><span class='line'>        <span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;Perry&quot;</span><span class="o">).</span><span class="na">get</span><span class="o">();</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">update</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Builder</span><span class="o">().</span><span class="na">inc</span><span class="o">(</span><span class="s">&quot;age&quot;</span><span class="o">,</span> <span class="mi">1</span><span class="o">).</span><span class="na">get</span><span class="o">();</span>
</span><span class='line'><span class="n">collection</span><span class="o">.</span><span class="na">update</span><span class="o">(</span><span class="n">criteria</span><span class="o">,</span> <span class="n">update</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>As a result field age will be incremented by one.</p>
<p>This article was written when last stable version of Java driver for
MongoDB was 2.4.</p>
]]></content></entry><entry><title type="html"><![CDATA[Lightweight fast persistent queue in Java using Berkley DB]]></title><link href="http://www.sysgears.com/articles/lightweight-fast-persistent-queue-in-java-using-berkley-db/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/articles/lightweight-fast-persistent-queue-in-java-using-berkley-db/</id><content type="html"><![CDATA[<p>Recently I had a task to develop the application which will have large
work queue and which need to survive the restarts. The application need
to be lightweight. After trying several different persistent engines for
Java I''ve chosen to stick with Berkley DB Java edition. This persistent
engine is pretty lightweight it is fast, optimized for multi-threaded
usage and have no problems with reclaiming free space.</p>
<p>As I needed the fast persistent queue at a cost of possible data loss on
system crash I've chosen non-transactional API for Berkley DB. With
non-transactional API the great speed can be achieved for persistent
queue at a price of loss of some data at system crash. The more data you
allow to be lost the greater speed of the queue you will have. Though
you can opt to sync to disk each operation on the queue and in that case
your data loss will be minimal.</p>
<!--more-->
<p>Berkley DB keeps data sorted by key in B-Tree. By default keys are
sorted lexicographically byte by byte. But you can override sorting
order by providing your own comparator. In this implementation of the
queue keys are just big integers and sorted in ascending order.</p>
<p>The DB allows row locking model, this is great for doing multi-threaded
polling of the queue. But for multi-threaded pushing you either need to
keep key counter in separate database or synchronize the push method.
I've decided to choose later route.</p>
<p>So, here is the code of the queue with described choices:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
<span class='line-number'>182</span>
<span class='line-number'>183</span>
<span class='line-number'>184</span>
<span class='line-number'>185</span>
<span class='line-number'>186</span>
<span class='line-number'>187</span>
<span class='line-number'>188</span>
<span class='line-number'>189</span>
<span class='line-number'>190</span>
<span class='line-number'>191</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">com.sleepycat.je.*</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.Serializable</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.math.BigInteger</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.util.Comparator</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Key comparator for DB keys</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">KeyComparator</span> <span class="kd">implements</span> <span class="n">Comparator</span><span class="o">,</span> <span class="n">Serializable</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Compares two DB keys.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param key1 first key</span>
</span><span class='line'><span class="cm">     * @param key2 second key</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @return comparison result</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compare</span><span class="o">(</span><span class="kt">byte</span><span class="o">[]</span> <span class="n">key1</span><span class="o">,</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">key2</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">BigInteger</span><span class="o">(</span><span class="n">key1</span><span class="o">).</span><span class="na">compareTo</span><span class="o">(</span><span class="k">new</span> <span class="n">BigInteger</span><span class="o">(</span><span class="n">key2</span><span class="o">));</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Fast queue implementation on top of Berkley DB Java Edition.</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'>
</span><span class='line'><span class="cm"> * This class is thread-safe.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Queue</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Berkley DB environment</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">Environment</span> <span class="n">dbEnv</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Berkley DB instance for the queue</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">Database</span> <span class="n">queueDatabase</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Queue cache size - number of element operations it is allowed to loose in case of system crash.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">cacheSize</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * This queue name.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">queueName</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Queue operation counter, which is used to sync the queue database to disk periodically.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">int</span> <span class="n">opsCounter</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Creates instance of persistent queue.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param queueEnvPath   queue database environment directory path</span>
</span><span class='line'><span class="cm">     * @param queueName      descriptive queue name</span>
</span><span class='line'><span class="cm">     * @param cacheSize      how often to sync the queue to disk</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">Queue</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">queueEnvPath</span><span class="o">,</span>
</span><span class='line'>                 <span class="kd">final</span> <span class="n">String</span> <span class="n">queueName</span><span class="o">,</span>
</span><span class='line'>                 <span class="kd">final</span> <span class="kt">int</span> <span class="n">cacheSize</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// Create parent dirs for queue environment directory</span>
</span><span class='line'>        <span class="k">new</span> <span class="nf">File</span><span class="o">(</span><span class="n">queueEnvPath</span><span class="o">).</span><span class="na">mkdirs</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Setup database environment</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">EnvironmentConfig</span> <span class="n">dbEnvConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EnvironmentConfig</span><span class="o">();</span>
</span><span class='line'>        <span class="n">dbEnvConfig</span><span class="o">.</span><span class="na">setTransactional</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
</span><span class='line'>        <span class="n">dbEnvConfig</span><span class="o">.</span><span class="na">setAllowCreate</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">dbEnv</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Environment</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">queueEnvPath</span><span class="o">),</span>
</span><span class='line'>                                  <span class="n">dbEnvConfig</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Setup non-transactional deferred-write queue database</span>
</span><span class='line'>        <span class="n">DatabaseConfig</span> <span class="n">dbConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseConfig</span><span class="o">();</span>
</span><span class='line'>        <span class="n">dbConfig</span><span class="o">.</span><span class="na">setTransactional</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
</span><span class='line'>        <span class="n">dbConfig</span><span class="o">.</span><span class="na">setAllowCreate</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
</span><span class='line'>        <span class="n">dbConfig</span><span class="o">.</span><span class="na">setDeferredWrite</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
</span><span class='line'>        <span class="n">dbConfig</span><span class="o">.</span><span class="na">setBtreeComparator</span><span class="o">(</span><span class="k">new</span> <span class="n">KeyComparator</span><span class="o">());</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">queueDatabase</span> <span class="o">=</span> <span class="n">dbEnv</span><span class="o">.</span><span class="na">openDatabase</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span>
</span><span class='line'>            <span class="n">queueName</span><span class="o">,</span>
</span><span class='line'>            <span class="n">dbConfig</span><span class="o">);</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">queueName</span> <span class="o">=</span> <span class="n">queueName</span><span class="o">;</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">cacheSize</span> <span class="o">=</span> <span class="n">cacheSize</span><span class="o">;</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">opsCounter</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Retrieves and returns element from the head of this queue.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @return element from the head of the queue or null if queue is empty</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @throws IOException in case of disk IO failure</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="n">String</span> <span class="nf">poll</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">DatabaseEntry</span> <span class="n">key</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseEntry</span><span class="o">();</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">DatabaseEntry</span> <span class="n">data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseEntry</span><span class="o">();</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">Cursor</span> <span class="n">cursor</span> <span class="o">=</span> <span class="n">queueDatabase</span><span class="o">.</span><span class="na">openCursor</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">cursor</span><span class="o">.</span><span class="na">getFirst</span><span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="n">data</span><span class="o">,</span> <span class="n">LockMode</span><span class="o">.</span><span class="na">RMW</span><span class="o">);</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">data</span><span class="o">.</span><span class="na">getData</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span>
</span><span class='line'>                <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>            <span class="kd">final</span> <span class="n">String</span> <span class="n">res</span> <span class="o">=</span> <span class="k">new</span> <span class="n">String</span><span class="o">(</span><span class="n">data</span><span class="o">.</span><span class="na">getData</span><span class="o">(),</span> <span class="s">&quot;UTF-8&quot;</span><span class="o">);</span>
</span><span class='line'>            <span class="n">cursor</span><span class="o">.</span><span class="na">delete</span><span class="o">();</span>
</span><span class='line'>            <span class="n">opsCounter</span><span class="o">++;</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">opsCounter</span> <span class="o">&gt;=</span> <span class="n">cacheSize</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">queueDatabase</span><span class="o">.</span><span class="na">sync</span><span class="o">();</span>
</span><span class='line'>                <span class="n">opsCounter</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">res</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">cursor</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Pushes element to the tail of this queue.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param element element</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @throws IOException in case of disk IO failure</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">synchronized</span> <span class="kt">void</span> <span class="nf">push</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">element</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">DatabaseEntry</span> <span class="n">key</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseEntry</span><span class="o">();</span>
</span><span class='line'>        <span class="n">DatabaseEntry</span> <span class="n">data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseEntry</span><span class="o">();</span>
</span><span class='line'>        <span class="n">Cursor</span> <span class="n">cursor</span> <span class="o">=</span> <span class="n">queueDatabase</span><span class="o">.</span><span class="na">openCursor</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">cursor</span><span class="o">.</span><span class="na">getLast</span><span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="n">data</span><span class="o">,</span> <span class="n">LockMode</span><span class="o">.</span><span class="na">RMW</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">BigInteger</span> <span class="n">prevKeyValue</span><span class="o">;</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">key</span><span class="o">.</span><span class="na">getData</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">prevKeyValue</span> <span class="o">=</span> <span class="n">BigInteger</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(-</span><span class="mi">1</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">prevKeyValue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BigInteger</span><span class="o">(</span><span class="n">key</span><span class="o">.</span><span class="na">getData</span><span class="o">());</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">BigInteger</span> <span class="n">newKeyValue</span> <span class="o">=</span> <span class="n">prevKeyValue</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">BigInteger</span><span class="o">.</span><span class="na">ONE</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                <span class="kd">final</span> <span class="n">DatabaseEntry</span> <span class="n">newKey</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseEntry</span><span class="o">(</span>
</span><span class='line'>                        <span class="n">newKeyValue</span><span class="o">.</span><span class="na">toByteArray</span><span class="o">());</span>
</span><span class='line'>                <span class="kd">final</span> <span class="n">DatabaseEntry</span> <span class="n">newData</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DatabaseEntry</span><span class="o">(</span>
</span><span class='line'>                        <span class="n">element</span><span class="o">.</span><span class="na">getBytes</span><span class="o">(</span><span class="s">&quot;UTF-8&quot;</span><span class="o">));</span>
</span><span class='line'>                <span class="n">queueDatabase</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="n">newKey</span><span class="o">,</span> <span class="n">newData</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>                <span class="n">opsCounter</span><span class="o">++;</span>
</span><span class='line'>                <span class="k">if</span> <span class="o">(</span><span class="n">opsCounter</span> <span class="o">&gt;=</span> <span class="n">cacheSize</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="n">queueDatabase</span><span class="o">.</span><span class="na">sync</span><span class="o">();</span>
</span><span class='line'>                    <span class="n">opsCounter</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>            <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">cursor</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Returns the size of this queue.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @return the size of the queue</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">long</span> <span class="nf">size</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">queueDatabase</span><span class="o">.</span><span class="na">count</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Returns this queue name.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @return this queue name</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getQueueName</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">queueName</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Closes this queue and frees up all resources associated to it.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">queueDatabase</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="n">dbEnv</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The unit tests for the queue:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.testng.annotations.Test</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.util.concurrent.CountDownLatch</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.util.concurrent.TimeUnit</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@Test</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UTestQueue</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testCreateQueue</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">assert</span> <span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">listFiles</span><span class="o">()).</span><span class="na">contains</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">queueDir</span><span class="o">,</span> <span class="s">&quot;00000000.jdb&quot;</span><span class="o">));</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span> <span class="kd">public</span> <span class="kt">void</span> <span class="n">testPush</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Throwable</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="s">&quot;1&quot;</span><span class="o">);</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="s">&quot;2&quot;</span><span class="o">);</span>
</span><span class='line'>            <span class="n">String</span> <span class="n">head</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">assert</span> <span class="n">head</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;1&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span> <span class="kd">public</span> <span class="kt">void</span> <span class="n">testQueueSurviveReopen</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Throwable</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="s">&quot;5&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">String</span> <span class="n">head</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">assert</span> <span class="n">head</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;5&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span> <span class="kd">public</span> <span class="kt">void</span> <span class="n">testQueuePushOrder</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Throwable</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">1000</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">i</span><span class="o">));</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">String</span> <span class="n">element</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
</span><span class='line'>                <span class="k">if</span> <span class="o">(!</span><span class="n">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="n">element</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>                    <span class="k">throw</span> <span class="k">new</span> <span class="nf">AssertionError</span><span class="o">(</span><span class="s">&quot;Expected element &quot;</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="s">&quot;, but got &quot;</span> <span class="o">+</span> <span class="n">element</span><span class="o">);</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span> <span class="kd">public</span> <span class="kt">void</span> <span class="n">testMultiThreadedPoll</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Throwable</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="kt">int</span> <span class="n">threadCount</span> <span class="o">=</span> <span class="mi">20</span><span class="o">;</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">threadCount</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span>
</span><span class='line'>                <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">i</span><span class="o">));</span>
</span><span class='line'>
</span><span class='line'>            <span class="kd">final</span> <span class="n">Set</span> <span class="n">set</span> <span class="o">=</span> <span class="n">Collections</span><span class="o">.</span><span class="na">synchronizedSet</span><span class="o">(</span><span class="k">new</span> <span class="n">HashSet</span><span class="o">());</span>
</span><span class='line'>            <span class="kd">final</span> <span class="n">CountDownLatch</span> <span class="n">startLatch</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CountDownLatch</span><span class="o">(</span><span class="n">threadCount</span><span class="o">);</span>
</span><span class='line'>            <span class="kd">final</span> <span class="n">CountDownLatch</span> <span class="n">latch</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CountDownLatch</span><span class="o">(</span><span class="n">threadCount</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">threadCount</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="k">new</span> <span class="nf">Thread</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>                    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>                        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                            <span class="n">startLatch</span><span class="o">.</span><span class="na">countDown</span><span class="o">();</span>
</span><span class='line'>                            <span class="n">startLatch</span><span class="o">.</span><span class="na">await</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>                            <span class="n">String</span> <span class="n">val</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
</span><span class='line'>                            <span class="k">if</span> <span class="o">(</span><span class="n">val</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                                <span class="n">set</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">val</span><span class="o">);</span>
</span><span class='line'>                            <span class="o">}</span>
</span><span class='line'>                            <span class="n">latch</span><span class="o">.</span><span class="na">countDown</span><span class="o">();</span>
</span><span class='line'>                        <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                            <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>                        <span class="o">}</span>
</span><span class='line'>                    <span class="o">}</span>
</span><span class='line'>                <span class="o">}.</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">latch</span><span class="o">.</span><span class="na">await</span><span class="o">(</span><span class="mi">5</span><span class="o">,</span> <span class="n">TimeUnit</span><span class="o">.</span><span class="na">SECONDS</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">assert</span> <span class="n">set</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="n">threadCount</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span> <span class="kd">public</span> <span class="kt">void</span> <span class="n">testMultiThreadedPush</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Throwable</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="kt">int</span> <span class="n">threadCount</span> <span class="o">=</span> <span class="mi">20</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="kd">final</span> <span class="n">CountDownLatch</span> <span class="n">startLatch</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CountDownLatch</span><span class="o">(</span><span class="n">threadCount</span><span class="o">);</span>
</span><span class='line'>            <span class="kd">final</span> <span class="n">CountDownLatch</span> <span class="n">latch</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CountDownLatch</span><span class="o">(</span><span class="n">threadCount</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">threadCount</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">i</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>                    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>                        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                            <span class="n">startLatch</span><span class="o">.</span><span class="na">countDown</span><span class="o">();</span>
</span><span class='line'>                            <span class="n">startLatch</span><span class="o">.</span><span class="na">await</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>                            <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">getName</span><span class="o">());</span>
</span><span class='line'>                            <span class="n">latch</span><span class="o">.</span><span class="na">countDown</span><span class="o">();</span>
</span><span class='line'>                        <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                            <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>                        <span class="o">}</span>
</span><span class='line'>                    <span class="o">}</span>
</span><span class='line'>                <span class="o">}.</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">latch</span><span class="o">.</span><span class="na">await</span><span class="o">(</span><span class="mi">5</span><span class="o">,</span> <span class="n">TimeUnit</span><span class="o">.</span><span class="na">SECONDS</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">assert</span> <span class="n">queue</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="n">threadCount</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And here is a main class which measures the queue performance:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">sysgears</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Throwable</span> <span class="o">{</span>
</span><span class='line'>        <span class="kt">int</span> <span class="n">elementCount</span> <span class="o">=</span> <span class="mi">10000</span><span class="o">;</span>
</span><span class='line'>        <span class="n">File</span> <span class="n">queueDir</span> <span class="o">=</span> <span class="n">TestUtils</span><span class="o">.</span><span class="na">createTempSubdir</span><span class="o">(</span><span class="s">&quot;test-queue&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="kd">final</span> <span class="n">Queue</span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Queue</span><span class="o">(</span><span class="n">queueDir</span><span class="o">.</span><span class="na">getPath</span><span class="o">(),</span> <span class="s">&quot;test-queue&quot;</span><span class="o">,</span> <span class="mi">1000</span><span class="o">);</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="kt">long</span> <span class="n">pushStart</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">();</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">elementCount</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">queue</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">i</span><span class="o">));</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="kt">long</span> <span class="n">pushEnd</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">();</span>
</span><span class='line'>            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Time to push &quot;</span> <span class="o">+</span> <span class="n">elementCount</span> <span class="o">+</span> <span class="s">&quot; records: &quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">pushEnd</span> <span class="o">-</span> <span class="n">pushStart</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot; ms&quot;</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="kt">long</span> <span class="n">pollStart</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">();</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">elementCount</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">String</span> <span class="n">element</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
</span><span class='line'>                <span class="k">if</span> <span class="o">(!</span><span class="n">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="n">element</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>                    <span class="k">throw</span> <span class="k">new</span> <span class="nf">AssertionError</span><span class="o">(</span><span class="s">&quot;Expected element &quot;</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="s">&quot;, but got &quot;</span> <span class="o">+</span> <span class="n">element</span><span class="o">);</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="kt">long</span> <span class="n">pollEnd</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">();</span>
</span><span class='line'>            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Time to poll &quot;</span> <span class="o">+</span> <span class="n">elementCount</span> <span class="o">+</span> <span class="s">&quot; records: &quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">pollEnd</span> <span class="o">-</span> <span class="n">pollStart</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot; ms&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">queue</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Output of running main on my PC:</p>
<pre>

Time to push 10000 records: 2633 ms
Time to poll 10000 records: 7764 ms</pre>
<p>Hope this helps,<br  /></p>
<p>Victor</p>
]]></content></entry><entry><title type="html"><![CDATA[Creating secure Grails application powered by MongoDB]]></title><link href="http://www.sysgears.com/articles/creating-secure-grails-application-powered-by-mongodb/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/articles/creating-secure-grails-application-powered-by-mongodb/</id><content type="html"><![CDATA[<p>There is some twist to use more specific data storage engines than
RDBMS. The mongodb is a modern feature-rich non-RDBMS database. It can
be used with grails quite well, though some special care should be
taken. In this post we will create base secure grails application
powered by mongodb.</p>
<!--more-->
<p>Lets start with creating basic secure grails application using hibernate
and then adopt it to using mongo db. This is very easy task which can be
accomplished using the following steps:</p>
<ol>
<li><p>Create basic grails application:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>grails create-app mongo-security
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Install Spring Security Core plugin:<br  />
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>grails install-plugin spring-security-core
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Generate User and Role domain classes:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>grails s2-quickstart com.example User Role
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Add code to create user on grails application startup:<br  />
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>// BootStrap.groovy
</span><span class='line'>import com.example.User
</span><span class='line'>
</span><span class='line'>class BootStrap {
</span><span class='line'>    def init = { servletContext -&gt;
</span><span class='line'>        def admin = User.findByUsername(&quot;admin&quot;) ?:
</span><span class='line'>            new User(username: &quot;admin&quot;,
</span><span class='line'>                    password: &quot;admin&quot;,
</span><span class='line'>                    enabled: true, accountLocked: false,
</span><span class='line'>                    accountExpired: false, passwordExpired: false).save(flush: true)
</span><span class='line'>
</span><span class='line'>        if (admin.hasErrors()) {
</span><span class='line'>            admin.errors.each { println it }
</span><span class='line'>        }
</span><span class='line'>    }
</span><span class='line'>
</span><span class='line'>    def destroy = {
</span><span class='line'>    }
</span><span class='line'>}
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Add code snippet to index.gsp right before controller-list div for
showing whether user is logged in or not:<br  />
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;sec:ifLoggedIn&gt;</span>  
</span><span class='line'>Logged in as <span class="nt">&lt;sec:username/&gt;</span>  
</span><span class='line'><span class="nt">&lt;/sec:ifLoggedIn&gt;</span>  
</span><span class='line'><span class="nt">&lt;sec:ifNotLoggedIn&gt;</span>  
</span><span class='line'>Please login  
</span><span class='line'><span class="nt">&lt;/sec:ifNotLoggedIn&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>Start grails application and try to login with admin/admin and logout
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>grails run-app
</span></code></pre></td></tr></table></div></figure></p>
</li>
</ol>
<p><br />
Now lets try to make this application work on top of mongodb instead of
hibernate memory database.</p>
<ol>
<li><p>For this we will need mongodb grails plugin, lets install it:<br  />
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>grails install-plugin mongodb
</span></code></pre></td></tr></table></div></figure></p>
</li>
<li><p>We also need to specify that our domain classes should be persisted
into MongoDB, add the following line inside each domain class:<br  />
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>static mapWith = &quot;mongo&quot;
</span></code></pre></td></tr></table></div></figure></p>
</li>
</ol>
<p>And after that you can check that you are able to login with admin again
and that mongo database is created with document for admin user in user
collection.</p>
<p>Victor Vlasenko<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[Fixing support of replica set by Grails mongo plugin]]></title><link href="http://www.sysgears.com/articles/fixing-support-of-replica-set-by-grails-mongo-plugin/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/articles/fixing-support-of-replica-set-by-grails-mongo-plugin/</id><content type="html"><![CDATA[<p>If you are going to use mongodb for production grails application you
might stuck with the issue that replica set is really not supported by
current version 1.0.0.M1 of mongodb plugin.</p>
<p>It is quite surprising because mongo java driver supports replica set
configuration quite fine.</p>
<p>The problem is that GORM plugin is built on top of version 0.5.1 of
gmongo library which doesn't support replica set. Only current
development version 0.7 of gmongo library supports this feature.</p>
<!--more-->
<p>So, the basic method of hacking grails to support this feature is to
rebuild GORM mongo plugin with gmongo 0.7 and use right GMongo
constuctor in grails-datastore-gorm-mongo by changing one line of its
source code. Then you will have to hack around a bit to rebuild
everything successfully because snapshots of used modules are very
unstable and you will have to do minor hacks everywhere.</p>
<p>At the end you will have something that is attached to this post - e.g.
binary replacements for jars for grails .ivy2 repository. You can just
unpack with overwrite the attached file into root of your home folder
and enjoy replica set support of hacked mongo GORM plugin 1.0.0.M1.</p>
<p>Victor Vlasenko<br  />
SysGears</p>
]]></content></entry><entry><title type="html"><![CDATA[How to redirect stdout and stderr writing to a log4j appender]]></title><link href="http://www.sysgears.com/articles/how-to-redirect-stdout-and-stderr-writing-to-a-log4j-appender/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/how-to-redirect-stdout-and-stderr-writing-to-a-log4j-appender/</id><content type="html"><![CDATA[<p>Log4j doesn't support stdout and stderr logging by default. So what we
need to do if we use third party in our java application? We use log4j
as logging framework and need to log messages that third party flushes
to std. The way to solve the problem is to use LoggingOutputStream
class. You can find it in log4j source code contribs/JimMoore directory.</p>
<!--more-->
<p>This class provides flushing output stream to the log. That's exactly
what we need. There is only one issue: the LoggingOutputStream uses
org.apache.log4j.Category and org.apache.log4j.Priority but in newer
log4j versions the Category class and some Priority functionality are
deprecated. So here is modified LoggingOutputStream, it uses no
deprecated classes:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">LoggingOutputStream</span> <span class="kd">extends</span> <span class="n">OutputStream</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Default number of bytes in the buffer.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">DEFAULT_BUFFER_LENGTH</span> <span class="o">=</span> <span class="mi">2048</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Indicates stream state.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">boolean</span> <span class="n">hasBeenClosed</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Internal buffer where data is stored.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">buf</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Number of valid bytes in the buffer.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">int</span> <span class="n">count</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Remembers the size of the buffer.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">int</span> <span class="n">curBufLength</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * The logger to write to.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">Logger</span> <span class="n">log</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * The log level.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">Level</span> <span class="n">level</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Creates the Logging instance to flush to the given logger.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param log         the Logger to write to</span>
</span><span class='line'><span class="cm">     * @param level       the log level</span>
</span><span class='line'><span class="cm">     * @throws IllegalArgumentException in case if one of arguments</span>
</span><span class='line'><span class="cm">     *                                  is  null.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">LoggingOutputStream</span><span class="o">(</span><span class="kd">final</span> <span class="n">Logger</span> <span class="n">log</span><span class="o">,</span>
</span><span class='line'>                               <span class="kd">final</span> <span class="n">Level</span> <span class="n">level</span><span class="o">)</span>
</span><span class='line'>            <span class="kd">throws</span> <span class="n">IllegalArgumentException</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">log</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">level</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalArgumentException</span><span class="o">(</span>
</span><span class='line'>                    <span class="s">&quot;Logger or log level must be not null&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">log</span> <span class="o">=</span> <span class="n">log</span><span class="o">;</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">level</span> <span class="o">=</span> <span class="n">level</span><span class="o">;</span>
</span><span class='line'>        <span class="n">curBufLength</span> <span class="o">=</span> <span class="n">DEFAULT_BUFFER_LENGTH</span><span class="o">;</span>
</span><span class='line'>        <span class="n">buf</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="o">[</span><span class="n">curBufLength</span><span class="o">];</span>
</span><span class='line'>        <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Writes the specified byte to this output stream.</span>
</span><span class='line'><span class="cm">     *</span>
</span><span class='line'><span class="cm">     * @param b the byte to write</span>
</span><span class='line'><span class="cm">     * @throws IOException if an I/O error occurs.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">write</span><span class="o">(</span><span class="kd">final</span> <span class="kt">int</span> <span class="n">b</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">hasBeenClosed</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">IOException</span><span class="o">(</span><span class="s">&quot;The stream has been closed.&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="c1">// don&#39;t log nulls</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">b</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">return</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="c1">// would this be writing past the buffer?</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">count</span> <span class="o">==</span> <span class="n">curBufLength</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="c1">// grow the buffer</span>
</span><span class='line'>            <span class="kd">final</span> <span class="kt">int</span> <span class="n">newBufLength</span> <span class="o">=</span> <span class="n">curBufLength</span> <span class="o">+</span>
</span><span class='line'>                    <span class="n">DEFAULT_BUFFER_LENGTH</span><span class="o">;</span>
</span><span class='line'>            <span class="kd">final</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">newBuf</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="o">[</span><span class="n">newBufLength</span><span class="o">];</span>
</span><span class='line'>            <span class="n">System</span><span class="o">.</span><span class="na">arraycopy</span><span class="o">(</span><span class="n">buf</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">newBuf</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">curBufLength</span><span class="o">);</span>
</span><span class='line'>            <span class="n">buf</span> <span class="o">=</span> <span class="n">newBuf</span><span class="o">;</span>
</span><span class='line'>            <span class="n">curBufLength</span> <span class="o">=</span> <span class="n">newBufLength</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">buf</span><span class="o">[</span><span class="n">count</span><span class="o">]</span> <span class="o">=</span> <span class="o">(</span><span class="kt">byte</span><span class="o">)</span> <span class="n">b</span><span class="o">;</span>
</span><span class='line'>        <span class="n">count</span><span class="o">++;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Flushes this output stream and forces any buffered output</span>
</span><span class='line'><span class="cm">     * bytes to be written out.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">flush</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">(</span><span class="n">count</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">return</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="kd">final</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">bytes</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="o">[</span><span class="n">count</span><span class="o">];</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">arraycopy</span><span class="o">(</span><span class="n">buf</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">bytes</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">count</span><span class="o">);</span>
</span><span class='line'>        <span class="n">String</span> <span class="n">str</span> <span class="o">=</span> <span class="k">new</span> <span class="n">String</span><span class="o">(</span><span class="n">bytes</span><span class="o">);</span>
</span><span class='line'>        <span class="n">log</span><span class="o">.</span><span class="na">log</span><span class="o">(</span><span class="n">level</span><span class="o">,</span> <span class="n">str</span><span class="o">);</span>
</span><span class='line'>        <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Closes this output stream and releases any system resources</span>
</span><span class='line'><span class="cm">     * associated with this stream.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">flush</span><span class="o">();</span>
</span><span class='line'>        <span class="n">hasBeenClosed</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>To use this class write:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">System</span><span class="o">.</span><span class="na">setErr</span><span class="o">(</span><span class="k">new</span> <span class="n">PrintStream</span><span class="o">(</span><span class="k">new</span> <span class="n">LoggingOutputStream</span><span class="o">(</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">,</span> <span class="n">Logger</span><span class="o">.</span><span class="na">getLogger</span><span class="o">(</span><span class="s">&quot;outLog&quot;</span><span class="o">),</span> <span class="n">Level</span><span class="o">.</span><span class="na">ERROR</span><span class="o">)));</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And reconfigure log4j.properties:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">log4j</span><span class="o">.</span><span class="na">logger</span><span class="o">.</span><span class="na">outLog</span><span class="o">=</span><span class="n">error</span><span class="o">,</span> <span class="n">out_log</span>
</span><span class='line'>
</span><span class='line'><span class="n">log4j</span><span class="o">.</span><span class="na">appender</span><span class="o">.</span><span class="na">out_log</span><span class="o">=</span><span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">log4j</span><span class="o">.</span><span class="na">RollingFileAppender</span>
</span><span class='line'><span class="n">log4j</span><span class="o">.</span><span class="na">appender</span><span class="o">.</span><span class="na">out_log</span><span class="o">.</span><span class="na">file</span><span class="o">=/</span><span class="n">logs</span><span class="o">/</span><span class="n">error</span><span class="o">.</span><span class="na">log</span>
</span><span class='line'><span class="n">log4j</span><span class="o">.</span><span class="na">appender</span><span class="o">.</span><span class="na">out_log</span><span class="o">.</span><span class="na">MaxFileSize</span><span class="o">=</span><span class="mi">10</span><span class="n">MB</span>
</span><span class='line'><span class="n">log4j</span><span class="o">.</span><span class="na">appender</span><span class="o">.</span><span class="na">out_log</span><span class="o">.</span><span class="na">threshold</span><span class="o">=</span><span class="n">error</span>
</span></code></pre></td></tr></table></div></figure></p>
]]></content></entry><entry><title type="html"><![CDATA[Atomic increment in MongoDB using Java driver]]></title><link href="http://www.sysgears.com/articles/atomic-value-increment-in-mongodb-using-java-driver/"/><updated>2013-06-12T16:40:00+02:00</updated><id>http://www.sysgears.com/articles/atomic-value-increment-in-mongodb-using-java-driver/</id><content type="html"><![CDATA[<p>Here is a simple way to increment a value atomically in MongoDB using
Java driver.</p>
<!--more-->
<p>Incrementing a value by certain number is easy but how to do it
atomically? You may find the following code on the offcial MongoDB site:</p>
<pre>
{ $inc : { field : value } }
</pre>
<p>Ok, now code it using java driver:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="c1">// connect to MongoDB server.</span>
</span><span class='line'><span class="n">Mongo</span> <span class="n">mongo</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Mongo</span><span class="o">(</span><span class="s">&quot;localhost&quot;</span><span class="o">,</span> <span class="mi">27017</span><span class="o">);</span>
</span><span class='line'><span class="n">DB</span> <span class="n">database</span> <span class="o">=</span> <span class="n">mongo</span><span class="o">.</span><span class="na">getDB</span><span class="o">(</span><span class="s">&quot;mydb&quot;</span><span class="o">);</span>
</span><span class='line'><span class="n">DBCollection</span> <span class="n">collection</span> <span class="o">=</span> <span class="n">database</span><span class="o">.</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;testCollection&quot;</span><span class="o">);</span>
</span><span class='line'><span class="c1">// create a simple db object where counter value is 0</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">temp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicDBObject</span><span class="o">(</span><span class="s">&quot;name&quot;</span><span class="o">,</span> <span class="s">&quot;someName&quot;</span><span class="o">).</span><span class="na">append</span><span class="o">(</span><span class="s">&quot;counter&quot;</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'><span class="c1">// insert it into the collection</span>
</span><span class='line'><span class="n">collection</span><span class="o">.</span><span class="na">insert</span><span class="o">(</span><span class="n">temp</span><span class="o">);</span>
</span><span class='line'><span class="c1">// create an increment query</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">modifier</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicDBObject</span><span class="o">(</span><span class="s">&quot;counter&quot;</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">incQuery</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicDBObject</span><span class="o">(</span><span class="s">&quot;$inc&quot;</span><span class="o">,</span> <span class="n">modifier</span><span class="o">);</span>
</span><span class='line'><span class="c1">// create a search query</span>
</span><span class='line'><span class="n">DBObject</span> <span class="n">searchQuery</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicDBObject</span><span class="o">(</span><span class="s">&quot;name&quot;</span><span class="o">,</span> <span class="s">&quot;someName&quot;</span><span class="o">);</span>
</span><span class='line'><span class="c1">// increment a counter value atomically</span>
</span><span class='line'><span class="n">WriteResult</span> <span class="n">upRes</span> <span class="o">=</span> <span class="n">collection</span><span class="o">.</span><span class="na">update</span><span class="o">(</span><span class="n">searchQuery</span><span class="o">,</span> <span class="n">incQuery</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>And check the result from shell:</p>
<pre>
> db.testCollection.find();
{ "_id" : ObjectId("4d00d43b171d2d4c374d7762"), "name" : "someName", "counter" : 1 }
</pre>
]]></content></entry><entry><title type="html"><![CDATA[Load balancing work between Java threads using ZeroMQ]]></title><link href="http://www.sysgears.com/articles/load-balancing-work-between-java-threads-using-zeromq/"/><updated>2013-06-12T15:30:00+02:00</updated><id>http://www.sysgears.com/articles/load-balancing-work-between-java-threads-using-zeromq/</id><content type="html"><![CDATA[<p>If you ever wrote production multi-threaded server in Java you know how
it is difficult to implement load balancing between worker threads. You
need to fight many issues to have good load balancer:</p>
<ol>
<li>You need to limit somehow the number of worker threads, because with
unlimited thread pool you can have memory exhausted.</li>
<li>You need to implement sophisticated procedure for clean worker
shutdown.</li>
<li>If you are using Executors you might now that they are not provide
out of the box solution. You need to run into some tricks to have
Executors do the load balancing job right.</li>
<li>And for multi-threaded code you have to use those painful
synchronized and locks that make your application lock up and/or degrade
performance. And the debugging lock issues is a real pain.</li>
</ol>
<p>ZeroMQ might tremendously help you with solving all these problems and
much more. ZeroMQ is a high-performance asynchronous messaging library.
It is native, but it has bindings for many languages and to be fair it
is worth the hassle of dealing with native code.</p>
<!--more-->
<p>So, let me show you how to implement load balancing in Java using
ZeroMQ.</p>
<p>If you are on linux zeromq might be already available for your linux
distribution in its repository otherwise you have to download it from
here, build and install:<br  />
<a href="http://www.zeromq.org/">http://www.zeromq.org</a></p>
<p>After that you will need Java bindings from here, again grab the source,
build and install:<br  />
<a href="https://github.com/zeromq/jzmq">https://github.com/zeromq/jzmq
</a><br  />
After installing you will have zmq.jar in /usr/share/java</p>
<p>If you are on a Windows the procedure of setting up ZeroMQ is a bit
different, but the idea is the same - you need to have two DLLs built -
ZeroMQ itself and ZeroMQ JNI and zmq.jar for Java-part of Java bindings,
DLLs should be accessible from the PATH.</p>
<p>Create project in your favorite IDE and add zmq.jar into CLASSPATH. Now
you are ready to use ZeroMQ.</p>
<p>ZeroMQ has several message sending patterns, we will use PUSH/PULL
pattern. In this pattern message "pushed" to endpoint is "pulled" by one
of the peers connected to this endpoint. Our main thread will bind to
endpoint and our worker threads will be peers connected to the endpoint.
Main thread will "push" work to endpoint and workers will "pull" the
work from the endpoint at a rate they can.</p>
<p>Our main thread will have the following code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="c1">// Create ZeroMQ context</span>
</span><span class='line'>            <span class="n">ZMQ</span><span class="o">.</span><span class="na">Context</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">ZMQ</span><span class="o">.</span><span class="na">context</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
</span><span class='line'>            <span class="c1">// Create PUSH socket</span>
</span><span class='line'>            <span class="n">ZMQ</span><span class="o">.</span><span class="na">Socket</span> <span class="n">socket</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">socket</span><span class="o">(</span><span class="n">ZMQ</span><span class="o">.</span><span class="na">PUSH</span><span class="o">);</span>
</span><span class='line'>            <span class="c1">// Bind socket to in-process endpoint</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="na">bind</span><span class="o">(</span><span class="s">&quot;inproc://workers&quot;</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Create worker threads pool</span>
</span><span class='line'>            <span class="n">Thread</span> <span class="n">threads</span><span class="o">[]</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">[</span><span class="mi">10</span><span class="o">];</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">threads</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">threads</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="n">WorkerThread</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">ctx</span><span class="o">);</span>
</span><span class='line'>                <span class="n">threads</span><span class="o">[</span><span class="n">i</span><span class="o">].</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// &quot;Send&quot; the work to workers</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">100</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Sending work piece &quot;</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span>
</span><span class='line'>                <span class="kt">byte</span><span class="o">[]</span> <span class="n">msg</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span>
</span><span class='line'>                <span class="n">msg</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="o">(</span><span class="kt">byte</span><span class="o">)</span><span class="n">i</span><span class="o">;</span>
</span><span class='line'>                <span class="n">socket</span><span class="o">.</span><span class="na">send</span><span class="o">(</span><span class="n">msg</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Terminate ZeroMQ context</span>
</span><span class='line'>            <span class="n">ctx</span><span class="o">.</span><span class="na">term</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Total handled &quot;</span> <span class="o">+</span> <span class="n">totalHandled</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">t</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Main thread creates workers pool and just sends all work pieces to the
endpoint, where they are fetched by one of the free worker thread.</p>
<p>The worker thread has the following code:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">WorkerThread</span> <span class="kd">extends</span> <span class="n">Thread</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">private</span> <span class="n">ZMQ</span><span class="o">.</span><span class="na">Context</span> <span class="n">ctx</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">int</span> <span class="n">handled</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">int</span> <span class="n">threadNo</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">WorkerThread</span><span class="o">(</span><span class="kt">int</span> <span class="n">threadNo</span><span class="o">,</span> <span class="n">ZMQ</span><span class="o">.</span><span class="na">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">super</span><span class="o">(</span><span class="s">&quot;Worker-&quot;</span> <span class="o">+</span> <span class="n">threadNo</span><span class="o">);</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">threadNo</span> <span class="o">=</span> <span class="n">threadNo</span><span class="o">;</span>
</span><span class='line'>        <span class="k">this</span><span class="o">.</span><span class="na">ctx</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="c1">// Create PULL socket</span>
</span><span class='line'>            <span class="n">ZMQ</span><span class="o">.</span><span class="na">Socket</span> <span class="n">socket</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">socket</span><span class="o">(</span><span class="n">ZMQ</span><span class="o">.</span><span class="na">PULL</span><span class="o">);</span>
</span><span class='line'>            <span class="c1">// Set high water mark to 2,</span>
</span><span class='line'>            <span class="c1">// so that when this peer had 2 messages</span>
</span><span class='line'>            <span class="c1">// in its buffer, ZeroMQ skipped to next workers</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="na">setHWM</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span>
</span><span class='line'>            <span class="c1">// Connect to in-process endpoint</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="na">connect</span><span class="o">(</span><span class="s">&quot;inproc://workers&quot;</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">while</span> <span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="kt">byte</span><span class="o">[]</span> <span class="n">msg</span><span class="o">;</span>
</span><span class='line'>                <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                    <span class="c1">// Get work piece</span>
</span><span class='line'>                    <span class="n">msg</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="na">recv</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'>                <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="c1">// ZeroMQ throws exception when</span>
</span><span class='line'>                    <span class="c1">// the context is terminated</span>
</span><span class='line'>                    <span class="n">socket</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>                    <span class="k">break</span><span class="o">;</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>                <span class="n">handled</span><span class="o">++;</span>
</span><span class='line'>                <span class="n">totalHandled</span><span class="o">++;</span>
</span><span class='line'>                <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">getName</span><span class="o">()</span>
</span><span class='line'>                        <span class="o">+</span> <span class="s">&quot; handled work piece &quot;</span> <span class="o">+</span> <span class="n">msg</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>                <span class="kt">int</span> <span class="n">sleepTime</span> <span class="o">=</span> <span class="o">(</span><span class="n">threadNo</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">?</span> <span class="mi">100</span> <span class="o">:</span> <span class="mi">200</span><span class="o">;</span>
</span><span class='line'>                <span class="c1">// Handle work, by sleeping for some time</span>
</span><span class='line'>                <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="n">sleepTime</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">getName</span><span class="o">()</span>
</span><span class='line'>                        <span class="o">+</span> <span class="s">&quot; handled count &quot;</span> <span class="o">+</span> <span class="n">handled</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">t</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>Our worker threads have varying speed of doing the work, some threads
are faster and some are slower. Faster threads get more work done then
slower ones. But how it is achieved?<br  />
When messages are pushed into the PUSH socket they get load balanced in
round robin fashion among all the connected PULL peers. But if some PULL
peer has its pipe full because of hitting the high water mark, ZeroMQ
skips this peer temporarily when it does round robin. Thats why faster
workers get more work thrown into them.</p>
<p>The additional benefit of this code is that it is essentially supports
distributed computing. You can simply change the protocol to
tcp://server:port and have this code perfectly working in distributed
environment where each worker will be launched at different server of a
LAN for example. ZeroMQ will does all the buffering, connection
establishment/reestablishment, work nodes appearing/disappearing for you
automatically. Isn't this just great?</p>
<p>Full code of Balancer.java application:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">import</span> <span class="nn">org.zeromq.ZMQ</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Balancer</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">volatile</span> <span class="kt">int</span> <span class="n">totalHandled</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">class</span> <span class="nc">WorkerThread</span> <span class="kd">extends</span> <span class="n">Thread</span> <span class="o">{</span>
</span><span class='line'>        <span class="kd">private</span> <span class="n">ZMQ</span><span class="o">.</span><span class="na">Context</span> <span class="n">ctx</span><span class="o">;</span>
</span><span class='line'>        <span class="kd">private</span> <span class="kt">int</span> <span class="n">handled</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>        <span class="kd">private</span> <span class="kt">int</span> <span class="n">threadNo</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">public</span> <span class="nf">WorkerThread</span><span class="o">(</span><span class="kt">int</span> <span class="n">threadNo</span><span class="o">,</span> <span class="n">ZMQ</span><span class="o">.</span><span class="na">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="kd">super</span><span class="o">(</span><span class="s">&quot;Worker-&quot;</span> <span class="o">+</span> <span class="n">threadNo</span><span class="o">);</span>
</span><span class='line'>            <span class="k">this</span><span class="o">.</span><span class="na">threadNo</span> <span class="o">=</span> <span class="n">threadNo</span><span class="o">;</span>
</span><span class='line'>            <span class="k">this</span><span class="o">.</span><span class="na">ctx</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                <span class="c1">// Create PULL socket</span>
</span><span class='line'>                <span class="n">ZMQ</span><span class="o">.</span><span class="na">Socket</span> <span class="n">socket</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">socket</span><span class="o">(</span><span class="n">ZMQ</span><span class="o">.</span><span class="na">PULL</span><span class="o">);</span>
</span><span class='line'>                <span class="c1">// Set high water mark to 2,</span>
</span><span class='line'>                <span class="c1">// so that when this peer</span>
</span><span class='line'>                <span class="c1">// had 2 messages in its buffer,</span>
</span><span class='line'>                <span class="c1">// ZeroMQ skipped to next workers</span>
</span><span class='line'>                <span class="n">socket</span><span class="o">.</span><span class="na">setHWM</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span>
</span><span class='line'>                <span class="c1">// Connect to in-process endpoint</span>
</span><span class='line'>                <span class="n">socket</span><span class="o">.</span><span class="na">connect</span><span class="o">(</span><span class="s">&quot;inproc://workers&quot;</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">while</span> <span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="kt">byte</span><span class="o">[]</span> <span class="n">msg</span><span class="o">;</span>
</span><span class='line'>                    <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                        <span class="c1">// Get work piece</span>
</span><span class='line'>                        <span class="n">msg</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="na">recv</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'>                    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                        <span class="c1">// ZeroMQ throws exception</span>
</span><span class='line'>                        <span class="c1">//when context is terminated</span>
</span><span class='line'>                        <span class="n">socket</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>                        <span class="k">break</span><span class="o">;</span>
</span><span class='line'>                    <span class="o">}</span>
</span><span class='line'>                    <span class="n">handled</span><span class="o">++;</span>
</span><span class='line'>                    <span class="n">totalHandled</span><span class="o">++;</span>
</span><span class='line'>                    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">getName</span><span class="o">()</span>
</span><span class='line'>                              <span class="o">+</span> <span class="s">&quot; handled work piece &quot;</span> <span class="o">+</span> <span class="n">msg</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>                    <span class="kt">int</span> <span class="n">sleepTime</span> <span class="o">=</span> <span class="o">(</span><span class="n">threadNo</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">?</span> <span class="mi">100</span> <span class="o">:</span> <span class="mi">200</span><span class="o">;</span>
</span><span class='line'>                    <span class="c1">// Handle work, by sleeping for some time</span>
</span><span class='line'>                    <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="n">sleepTime</span><span class="o">);</span>
</span><span class='line'>                <span class="o">}</span>
</span><span class='line'>                <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">getName</span><span class="o">()</span>
</span><span class='line'>                              <span class="o">+</span> <span class="s">&quot; handled count &quot;</span> <span class="o">+</span> <span class="n">handled</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">t</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="c1">// Create ZeroMQ context</span>
</span><span class='line'>            <span class="n">ZMQ</span><span class="o">.</span><span class="na">Context</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">ZMQ</span><span class="o">.</span><span class="na">context</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
</span><span class='line'>            <span class="c1">// Create PUSH socket</span>
</span><span class='line'>            <span class="n">ZMQ</span><span class="o">.</span><span class="na">Socket</span> <span class="n">socket</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">socket</span><span class="o">(</span><span class="n">ZMQ</span><span class="o">.</span><span class="na">PUSH</span><span class="o">);</span>
</span><span class='line'>            <span class="c1">// Bind socket to in-process endpoint</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="na">bind</span><span class="o">(</span><span class="s">&quot;inproc://workers&quot;</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Create worker threads pool</span>
</span><span class='line'>            <span class="n">Thread</span> <span class="n">threads</span><span class="o">[]</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">[</span><span class="mi">10</span><span class="o">];</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">threads</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">threads</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="n">WorkerThread</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">ctx</span><span class="o">);</span>
</span><span class='line'>                <span class="n">threads</span><span class="o">[</span><span class="n">i</span><span class="o">].</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// &quot;Send&quot; the work to workers</span>
</span><span class='line'>            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">100</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Sending work piece &quot;</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span>
</span><span class='line'>                <span class="kt">byte</span><span class="o">[]</span> <span class="n">msg</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span>
</span><span class='line'>                <span class="n">msg</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="o">(</span><span class="kt">byte</span><span class="o">)</span><span class="n">i</span><span class="o">;</span>
</span><span class='line'>                <span class="n">socket</span><span class="o">.</span><span class="na">send</span><span class="o">(</span><span class="n">msg</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Terminate ZeroMQ context</span>
</span><span class='line'>            <span class="n">ctx</span><span class="o">.</span><span class="na">term</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Total handled &quot;</span> <span class="o">+</span> <span class="n">totalHandled</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">t</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">Balancer</span> <span class="n">balancer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Balancer</span><span class="o">();</span>
</span><span class='line'>        <span class="n">balancer</span><span class="o">.</span><span class="na">run</span><span class="o">();</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></p>
<p>The output of this application is:</p>
<pre>
Sending work piece 0
Sending work piece 1
Sending work piece 2
Sending work piece 3
Sending work piece 4
Sending work piece 5
Sending work piece 6
Sending work piece 7
Sending work piece 8
Sending work piece 9
Sending work piece 10
Sending work piece 11
Sending work piece 12
Sending work piece 13
Sending work piece 14
Sending work piece 15
Sending work piece 16
Sending work piece 17
Sending work piece 18
worker-0 handled work piece 0
worker-1 handled work piece 1
worker-2 handled work piece 2
worker-3 handled work piece 3
worker-4 handled work piece 4
worker-5 handled work piece 5
worker-6 handled work piece 6
worker-7 handled work piece 7
worker-8 handled work piece 8
Sending work piece 19
Sending work piece 20
Sending work piece 21
Sending work piece 22
Sending work piece 23
Sending work piece 24
Sending work piece 25
Sending work piece 26
Sending work piece 27
Sending work piece 28
Sending work piece 29
Sending work piece 30
worker-9 handled work piece 27
worker-0 handled work piece 9
worker-2 handled work piece 11
Sending work piece 31
worker-4 handled work piece 13
worker-6 handled work piece 15
Sending work piece 32
Sending work piece 33
Sending work piece 34
worker-8 handled work piece 17
Sending work piece 35
worker-1 handled work piece 10
Sending work piece 36
Sending work piece 37
worker-3 handled work piece 12
worker-6 handled work piece 24
worker-2 handled work piece 20
worker-4 handled work piece 22
worker-7 handled work piece 16
worker-5 handled work piece 14
worker-0 handled work piece 18
worker-8 handled work piece 26
Sending work piece 38
Sending work piece 39
Sending work piece 40
Sending work piece 41
Sending work piece 42
Sending work piece 43
Sending work piece 44
worker-9 handled work piece 28
Sending work piece 45
Sending work piece 46
Sending work piece 47
worker-4 handled work piece 31
worker-2 handled work piece 32
worker-6 handled work piece 33
Sending work piece 48
worker-0 handled work piece 30
Sending work piece 49
Sending work piece 50
worker-8 handled work piece 34
worker-1 handled work piece 19
Sending work piece 51
worker-3 handled work piece 21
Sending work piece 52
worker-7 handled work piece 25
worker-5 handled work piece 23
worker-4 handled work piece 41
worker-2 handled work piece 36
worker-6 handled work piece 38
worker-0 handled work piece 39
Sending work piece 53
Sending work piece 54
Sending work piece 55
Sending work piece 56
Sending work piece 57
Sending work piece 58
worker-9 handled work piece 29
Sending work piece 59
worker-8 handled work piece 43
Sending work piece 60
worker-4 handled work piece 47
worker-0 handled work piece 48
worker-6 handled work piece 45
worker-2 handled work piece 46
Sending work piece 61
Sending work piece 62
Sending work piece 63
Sending work piece 64
worker-8 handled work piece 49
Sending work piece 65
Sending work piece 66
worker-1 handled work piece 35
Sending work piece 67
worker-3 handled work piece 37
worker-7 handled work piece 42
worker-5 handled work piece 40
Sending work piece 68
Sending work piece 69
worker-4 handled work piece 54
worker-0 handled work piece 57
worker-6 handled work piece 56
Sending work piece 70
Sending work piece 71
Sending work piece 72
Sending work piece 73
worker-9 handled work piece 44
worker-2 handled work piece 55
Sending work piece 74
worker-8 handled work piece 59
Sending work piece 75
worker-4 handled work piece 60
worker-0 handled work piece 62
worker-6 handled work piece 63
Sending work piece 76
Sending work piece 77
Sending work piece 78
Sending work piece 79
worker-2 handled work piece 61
worker-8 handled work piece 64
Sending work piece 80
Sending work piece 81
worker-3 handled work piece 51
worker-1 handled work piece 50
Sending work piece 82
worker-7 handled work piece 52
worker-5 handled work piece 53
Sending work piece 83
Sending work piece 84
worker-4 handled work piece 69
worker-0 handled work piece 70
Sending work piece 85
worker-6 handled work piece 71
worker-9 handled work piece 58
Sending work piece 86
Sending work piece 87
Sending work piece 88
worker-2 handled work piece 72
Sending work piece 89
Sending work piece 90
worker-8 handled work piece 74
worker-4 handled work piece 75
worker-6 handled work piece 77
Sending work piece 91
Sending work piece 92
Sending work piece 93
worker-0 handled work piece 76
worker-2 handled work piece 78
Sending work piece 94
worker-8 handled work piece 79
Sending work piece 95
Sending work piece 96
worker-1 handled work piece 65
worker-7 handled work piece 67
Sending work piece 97
Sending work piece 98
Sending work piece 99
worker-3 handled work piece 66
worker-5 handled work piece 68
worker-4 handled work piece 84
worker-6 handled work piece 86
worker-9 handled work piece 73
worker-0 handled work piece 85
worker-2 handled work piece 88
worker-8 handled work piece 89
worker-4 handled work piece 90
worker-6 handled work piece 91
worker-0 handled work piece 92
worker-2 handled work piece 93
worker-8 handled work piece 94
worker-1 handled work piece 80
worker-7 handled work piece 82
worker-3 handled work piece 81
worker-5 handled work piece 83
worker-9 handled work piece 87
worker-4 handled work piece 99
worker-1 handled work piece 96
worker-7 handled work piece 97
worker-5 handled work piece 98
worker-3 handled work piece 95
Total handled 100
worker-0 handled count 12
worker-5 handled count 8
worker-1 handled count 8
worker-7 handled count 8
worker-8 handled count 12
worker-3 handled count 8
worker-6 handled count 12
worker-4 handled count 13
worker-2 handled count 12
worker-9 handled count 7
</pre>
<p>Update: code was fixed to close sockets and work with latest ZeroMQ
2.1.0 version, thanks for comment from Helpful, who pointed out ZeroMQ
API changes in latest version that affect code of this example.</p>
<p>Victor Vlasenko<br  />
SysGears</p>
]]></content></entry></feed>