<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Christian Oestreich]]></title>
  <link href="http://www.christianoestreich.com/atom.xml" rel="self"/>
  <link href="http://www.christianoestreich.com/"/>
  <updated>2013-12-13T20:45:33+00:00</updated>
  <id>http://www.christianoestreich.com/</id>
  <author>
    <name><![CDATA[Christian Oestreich]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Knockout Validation Rules Engine]]></title>
    <link href="http://www.christianoestreich.com/2013/12/knockout-validation-rules-engine/"/>
    <updated>2013-12-13T10:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2013/12/knockout-validation-rules-engine</id>
    <content type="html"><![CDATA[<p>We have recently begun working with <a href="http://knockoutjs.com/" title="Knockout JS">Knockout.js</a> and needed a way to run validation on the models.  We found the amazing plugin <a href="https://github.com/Knockout-Contrib/Knockout-Validation" title="Knockout Validation">Knockout.Validation</a>.  This plugin did an awesome job and we were able to port over all our jQuery Validation rules fairly easy.  As I was working with the plugin, my model grew and additional models were being created it became tedious having to append every rule to every model property and not remember which rules applied to which model properties across model contexts.  Thus the concept of the <a href="https://github.com/ctoestreich/knockout-validation-rule-engine" title="Knockout Validation Rule Engine">Knockout Validation Rule Engine</a> was born.  A working example can be found via <a href="http://ctoestreich.github.io/knockout-validation-rule-engine/" title="Running Example">github pages</a></p>

<!-- more -->


<h2>Getting Started</h2>

<p>Download the latest <a href="https://github.com/ctoestreich/knockout-validation-rule-engine/tree/master/build" title="Knockout Validation Rule Engine Dist">knockout-rule-engine</a> file.</p>

<p>Define a rule set that uses the parent key as the name of the model property you want to map to.  If you wanted to set an email rule for a model with a property of userEmail, you would provide the following rule set.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s1">&#39;knockout&#39;</span><span class="p">,</span> <span class="s1">&#39;knockout-rule-engine&#39;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">ko</span><span class="p">,</span> <span class="nx">RuleEngine</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleSet</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">userEmail</span><span class="o">:</span> <span class="p">{</span> <span class="nx">email</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleEngine</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">RuleEngine</span><span class="p">(</span><span class="nx">ruleSet</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">userEmail</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">ruleEngine</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">ko</span><span class="p">.</span><span class="nx">applyBindings</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This would be equivalent to the following code.</p>

<figure class='code'><figcaption><span></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='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s1">&#39;knockout&#39;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">ko</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">userEmail</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">).</span><span class="nx">extend</span><span class="p">({</span><span class="nx">email</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">ko</span><span class="p">.</span><span class="nx">applyBindings</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Override Knockout Validation Options</h2>

<p>You can pass in the options you want to use for the knockout.validation library as the optional second param in the constructor.  For example if you wanted to disable the validation plugin from auto inserting messages you would use the following.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s1">&#39;knockout&#39;</span><span class="p">,</span> <span class="s1">&#39;knockout-rule-engine&#39;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">ko</span><span class="p">,</span> <span class="nx">RuleEngine</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleSet</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">userEmail</span><span class="o">:</span> <span class="p">{</span> <span class="nx">email</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleEngine</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">RuleEngine</span><span class="p">(</span><span class="nx">ruleSet</span><span class="p">,</span> <span class="p">{</span><span class="nx">insertMessages</span><span class="o">:</span> <span class="kc">false</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">userEmail</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">ruleEngine</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">ko</span><span class="p">.</span><span class="nx">applyBindings</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>See <a href="https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Configuration" title="Knockout Validation Configuration">Configuration Options</a> for details on all the Knockout.Validation options.</p>

<h2>Deep Mapping</h2>

<p>By default the plugin will attempt to recurse your model tree and look at all properties and try and match rules against them.  If you only want to apply rules to the first level object simply pass a flag with deep set to false in the options param.</p>

<figure class='code'><figcaption><span></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='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s2">&quot;knockout&quot;</span><span class="p">,</span> <span class="s2">&quot;knockout-rule-engine&quot;</span><span class="p">,</span> <span class="s2">&quot;rules/address/rules&quot;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">ko</span><span class="p">,</span> <span class="nx">RuleEngine</span><span class="p">,</span> <span class="nx">personRules</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleEngine</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">RuleEngine</span><span class="p">(</span><span class="nx">personRules</span><span class="p">,</span> <span class="p">{</span><span class="nx">deep</span><span class="o">:</span> <span class="kc">false</span><span class="p">});</span>
</span><span class='line'>    <span class="p">...</span> <span class="k">do</span> <span class="nx">work</span> <span class="p">...</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Reusing rules</h2>

<p>If you store your rules in a common directory and include them via require into your models you will ensure you have a common experience across your site.  See <a href="https://github.com/ctoestreich/knockout-validation-rule-engine/blob/master/app/js/main.js" title="Knockout Validation Rule Engine Main.js">main.js</a> for more detailed examples.</p>

<figure class='code'><figcaption><span></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>
<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='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s1">&#39;filters/filters&#39;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">filters</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">address1</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">noSpecialChars</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">filter</span><span class="o">:</span> <span class="p">[</span><span class="nx">filters</span><span class="p">.</span><span class="nx">noSpecialChars</span><span class="p">,</span> <span class="nx">filters</span><span class="p">.</span><span class="nx">ltrim</span><span class="p">]</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">address2</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">noSpecialChars</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">filter</span><span class="o">:</span> <span class="p">[</span><span class="nx">filters</span><span class="p">.</span><span class="nx">noSpecialChars</span><span class="p">,</span> <span class="nx">filters</span><span class="p">.</span><span class="nx">ltrim</span><span class="p">]</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">city</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">noSpecialChars</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">filter</span><span class="o">:</span> <span class="p">[</span><span class="nx">filters</span><span class="p">.</span><span class="nx">noSpecialChars</span><span class="p">,</span> <span class="nx">filters</span><span class="p">.</span><span class="nx">ltrim</span><span class="p">]</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">state</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">validSelectValue</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;Please select a state.&#39;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">zipCode</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">validDigitLength</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">params</span><span class="o">:</span> <span class="mi">5</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;Please enter a valid zip code (XXXXX).&#39;</span>
</span><span class='line'>            <span class="p">},</span>
</span><span class='line'>            <span class="nx">filter</span><span class="o">:</span> <span class="nx">filters</span><span class="p">.</span><span class="nx">onlyDigits</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">phone</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">pattern</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;Invalid phone number. (XXX-XXX-XXXX)&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">params</span><span class="o">:</span> <span class="sr">/^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$/</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then you can include this module named rules/address/rules.js into any model that has address or nested address properties that match the keys above (address1, address2, etc).</p>

<figure class='code'><figcaption><span></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>
<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='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s2">&quot;knockout&quot;</span><span class="p">,</span> <span class="s2">&quot;knockout-rule-engine&quot;</span><span class="p">,</span> <span class="s2">&quot;rules/address/rules&quot;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">ko</span><span class="p">,</span> <span class="nx">RuleEngine</span><span class="p">,</span> <span class="nx">personRules</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// set deep to false if you do not want to traverse child properties on the model</span>
</span><span class='line'>    <span class="c1">// var ruleEngine = new RuleEngine(personRules, {deep: false});</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleEngine</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">RuleEngine</span><span class="p">(</span><span class="nx">personRules</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">PhoneModel</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">phone</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">AddressModel</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">address1</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>            <span class="nx">address2</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>            <span class="nx">city</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>            <span class="nx">state</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>            <span class="nx">zipCode</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>            <span class="nx">phone</span><span class="o">:</span> <span class="k">new</span> <span class="nx">PhoneModel</span><span class="p">()</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">personModel</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">firstName</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">lastName</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">middleName</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">address</span><span class="o">:</span> <span class="k">new</span> <span class="nx">AddressModel</span><span class="p">()</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// example of wiring a field at apply time</span>
</span><span class='line'>    <span class="nx">ruleEngine</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">personModel</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">ko</span><span class="p">.</span><span class="nx">applyBindings</span><span class="p">(</span><span class="nx">personModel</span><span class="p">,</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Adding Validation Rules At Runtime</h2>

<p>If you have already instantiated the RuleEngine and need to add a rule later at runtime you can do so via the addRule method.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">ruleEngine</span><span class="p">.</span><span class="nx">addRule</span><span class="p">(</span><span class="s1">&#39;nameNotTom&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">validator</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">val</span> <span class="o">!==</span> <span class="s1">&#39;Tom&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;Your name can not be Tom!&#39;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Adding Rule Sets At Runtime</h2>

<p>You can add additional rule sets to your model via the following code.</p>

<figure class='code'><figcaption><span></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='javascript'><span class='line'><span class="nx">ruleEngine</span><span class="p">.</span><span class="nx">addRuleSet</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">nameNotTom</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is extremely handy if you make use of the onlyIf clause in knockout.validation that depends on other model data.  You can add these rules later and not have to inject your model into your rule definitions and keep the them clean.</p>

<figure class='code'><figcaption><span></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='javascript'><span class='line'><span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">firstName</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">foo</span><span class="o">:</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">observable</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//do other work</span>
</span><span class='line'>
</span><span class='line'><span class="nx">ruleEngine</span><span class="p">.</span><span class="nx">addRuleSet</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">nameNotTom</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">onlyIf</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">model</span><span class="p">.</span><span class="nx">foo</span><span class="p">()</span> <span class="o">===</span> <span class="s1">&#39;bar&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Using The Filter Extender</h2>

<p>It is pretty common that you must also filter the input of data on the knockout model via a form.  This is an example filter extender that can be used in conjunction with the rules definitions as in the above example.</p>

<figure class='code'><figcaption><span></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>
<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='javascript'><span class='line'><span class="nx">ko</span><span class="p">.</span><span class="nx">extenders</span><span class="p">.</span><span class="nx">filter</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="nx">filter</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">writeFilter</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">newValue</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">newValueAdjusted</span> <span class="o">=</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">filter</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="nx">filter</span><span class="p">(</span><span class="nx">newValue</span><span class="p">)</span> <span class="o">:</span> <span class="nx">newValue</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">filter</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">filter</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">o</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">newValueAdjusted</span> <span class="o">=</span> <span class="nx">o</span><span class="p">(</span><span class="nx">newValueAdjusted</span><span class="p">);</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">currentValue</span> <span class="o">=</span> <span class="nx">target</span><span class="p">();</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">newValueAdjusted</span> <span class="o">!==</span> <span class="nx">currentValue</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">target</span><span class="p">(</span><span class="nx">newValueAdjusted</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">newValue</span> <span class="o">!==</span> <span class="nx">currentValue</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">target</span><span class="p">.</span><span class="nx">notifySubscribers</span><span class="p">(</span><span class="nx">newValueAdjusted</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">computed</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">read</span><span class="o">:</span> <span class="nx">target</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">write</span><span class="o">:</span> <span class="nx">writeFilter</span>
</span><span class='line'>    <span class="p">}).</span><span class="nx">extend</span><span class="p">({</span> <span class="nx">notify</span><span class="o">:</span> <span class="s1">&#39;always&#39;</span><span class="p">,</span> <span class="nx">throttle</span><span class="o">:</span> <span class="mi">1</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">result</span><span class="p">(</span><span class="nx">target</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">target</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="nx">writeFilter</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">target</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Global filters can be setup to be reused via something similar to the following.  See <a href="https://github.com/ctoestreich/knockout-validation-rule-engine/blob/master/app/js/filters/filters.js" title="Knockout Validation Rule Engine Filters">Filters</a> for more information.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">ltrim</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="nx">value</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^\s+/</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">:</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">onlyDigits</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="nx">value</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[^0-9]/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">:</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">onlyAlpha</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="nx">value</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[^A-Za-z _\-&#39;]/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">:</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">noSpecialChars</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="nx">value</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[^\/A-Za-z0-9 &#39;\.,#\-]*$/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">:</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Without RequireJS</h2>

<p>You can still include the plugin without require js.  The plugin adds a global ko.RuleEngine singleton that you can instantiate.  This is done in the <a href="https://github.com/ctoestreich/knockout-validation-rule-engine/blob/master/test/inline.html" title="Knockout Validation Rule Engine Tests">Inline Tests</a>.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;../app/js/knockout-rule-engine.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleSet</span> <span class="o">=</span> <span class="p">{</span><span class="nx">firstName</span><span class="o">:</span> <span class="p">{</span><span class="nx">required</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">validName</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">filter</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){}}};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ruleEngine</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ko</span><span class="p">.</span><span class="nx">RuleEngine</span><span class="p">(</span><span class="nx">ruleSet</span><span class="p">);</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Plugin Template Override]]></title>
    <link href="http://www.christianoestreich.com/2013/07/grails-plugin-template-override/"/>
    <updated>2013-07-02T10:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2013/07/grails-plugin-template-override</id>
    <content type="html"><![CDATA[<p>Recently in the <a href="http://grails.org/plugin/filterpane" title="Grails Filterpane Plugin">Grails Filterpane Plugin</a> I had to figure out a way to allow users to selectively override the bundled template files that were rendered in the filterpane taglib.  I was able to achieve this through a bit of simple code that may be helpful to plugin authors in the future.</p>

<!-- more -->


<h2>The Code</h2>

<p>The bit of magic in the code below is the line <code>groovyPageLocator.findTemplateInBinding(path, pageScope)</code>.  This equates to is asking grails to find a template for the path in the project scope.  I then check if the result of the call is null and append the filterpane plugin to the resulting map causing the render to use the plugin vs the local template.  This works well because apparently you can specify <code>plugin: null</code> in the render block which is the same as saying &ldquo;use the current project scope&rdquo;.</p>

<figure class='code'><figcaption><span>FilterPaneTagLib.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'> <span class="kt">def</span> <span class="n">filterButton</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="c1">//do some work here</span>
</span><span class='line'>    <span class="c1">//...</span>
</span><span class='line'>    <span class="c1">//...</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Map</span> <span class="n">template</span> <span class="o">=</span> <span class="n">getTemplatePath</span><span class="o">(</span><span class="s1">&#39;filterButton&#39;</span><span class="o">);</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="n">template</span><span class="o">.</span><span class="na">path</span><span class="o">,</span> <span class="nl">plugin:</span> <span class="n">template</span><span class="o">.</span><span class="na">plugin</span><span class="o">,</span> <span class="nl">model:</span> <span class="n">renderModel</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">LinkedHashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">getTemplatePath</span><span class="o">(</span><span class="n">String</span> <span class="n">templateName</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">path</span> <span class="o">=</span> <span class="n">appendPiecesForUri</span><span class="o">(</span><span class="s2">&quot;/_filterpane&quot;</span><span class="o">,</span> <span class="n">templateName</span><span class="o">)</span> <span class="c1">//create the url path</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">template</span> <span class="o">=</span> <span class="o">[</span><span class="nl">path:</span> <span class="n">path</span><span class="o">]</span> <span class="c1">//add it to the map</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">override</span> <span class="o">=</span> <span class="n">groovyPageLocator</span><span class="o">.</span><span class="na">findTemplateInBinding</span><span class="o">(</span><span class="n">path</span><span class="o">,</span> <span class="n">pageScope</span><span class="o">)</span> <span class="c1">//check if template exists in project scope</span>
</span><span class='line'>    <span class="k">if</span><span class="o">(!</span><span class="n">override</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">template</span><span class="o">.</span><span class="na">plugin</span> <span class="o">=</span> <span class="s1">&#39;filterpane&#39;</span> <span class="c1">//looks like no, so use default plugin version instead</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="n">template</span>  <span class="c1">//return map</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Travis CI & Grails GVM]]></title>
    <link href="http://www.christianoestreich.com/2013/05/travis-ci-grails-gvm/"/>
    <updated>2013-05-09T10:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2013/05/travis-ci-grails-gvm</id>
    <content type="html"><![CDATA[<p>For quite a while I have been stuck using grails 2.2.0 on a <a href="https://travis-ci.org" title="Travis CI">Travis CI</a> build server due to any later version not being added to the groovy ppa on ubuntu.  This was done because of the move to the <a href="http://gvmtool.net/" title="the Groovy enVironment Manager">GVM</a> tool.  I was able to cobble together a travis script and <a href="http://gvmtool.net/" title="the Groovy enVironment Manager">GVM</a> hack to get this working.  This is great because now I can use Grails 2.2.1, 2.2.2, etc.</p>

<!-- more -->


<h2>The Hack</h2>

<p>When setting up the script I noticed that it was failing due to a return code of 1.  I forked and inspected the <a href="http://gvmtool.net/" title="the Groovy enVironment Manager">GVM</a> code and identified a fix.  It needed to return a 0 after it does the install.</p>

<p>I have submitted a <a href="https://github.com/gvmtool/gvm/pull/167" title="Pull Request">pull request</a> to fix the return issue in the gvm-install.sh script, but in the meantime you will need to keep the bit in the before-install block where it grabs my file and replaces the current one as seen in the script below.</p>

<h2>The Setup</h2>

<p>Travis appears to come with a package called GVM already on the box for Go language management.  We have to remove that first via <code>rm -rf ~/.gvm</code>.  We are then free to install <a href="http://gvmtool.net/" title="the Groovy enVironment Manager">GVM</a> as it will not fail the check for the ~/.gvm directory.</p>

<p>Travis doesn&rsquo;t like you to pipe commands back to bash as suggested in the GVM docs via <code>curl -s get.gvmtool.net | bash</code> so we have to get the install script and stick it into local file to execute.  We do this via this code block.</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=''><span class='line'>curl -s get.gvmtool.net &gt; ~/install_gvm.sh
</span><span class='line'>chmod 775 ~/install_gvm.sh
</span><span class='line'>~/install_gvm.sh</span></code></pre></td></tr></table></div></figure>


<p>We then have to tell <a href="http://gvmtool.net/" title="the Groovy enVironment Manager">GVM</a> to not prompt us defaults during install by appending to the config <code>echo "gvm_auto_answer=true" &gt; ~/.gvm/etc/config</code>.</p>

<p>Then we hack the install with my pull (which can hopefully be removed later) via <code>curl -s https://raw.github.com/ctoestreich/gvm/master/src/main/bash/gvm-install.sh &gt; ~/.gvm/src/gvm-install.sh</code></p>

<p>After that we are golden to set up the source and install any version of grails we need.</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=''><span class='line'>source ~/.gvm/bin/gvm-init.sh
</span><span class='line'>gvm install grails 2.2.1
</span><span class='line'>gvm use grails 2.2.1</span></code></pre></td></tr></table></div></figure>


<p>The rest of the build file is pretty vanilla.</p>

<h2>The Script</h2>

<p>Here is the .travis.yml script that you will need for your project and a link to a <a href="https://github.com/Grails-Plugin-Consortium/grails-filterpane-demo/blob/master/.travis.yml" title="Working Example">working example</a>.</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=''><span class='line'>language: groovy
</span><span class='line'>
</span><span class='line'>jdk:
</span><span class='line'>- oraclejdk6
</span><span class='line'>
</span><span class='line'>before_install:
</span><span class='line'>- rm -rf ~/.gvm
</span><span class='line'>- curl -s get.gvmtool.net &gt; ~/install_gvm.sh
</span><span class='line'>- chmod 775 ~/install_gvm.sh
</span><span class='line'>- ~/install_gvm.sh
</span><span class='line'>- echo "gvm_auto_answer=true" &gt; ~/.gvm/etc/config
</span><span class='line'>- curl -s https://raw.github.com/ctoestreich/gvm/master/src/main/bash/gvm-install.sh &gt; ~/.gvm/src/gvm-install.sh
</span><span class='line'>- source ~/.gvm/bin/gvm-init.sh
</span><span class='line'>- gvm install grails 2.2.1
</span><span class='line'>- gvm use grails 2.2.1
</span><span class='line'>
</span><span class='line'>branches:
</span><span class='line'>  only:
</span><span class='line'>    - master
</span><span class='line'>
</span><span class='line'>script: grails test-app --non-interactive</span></code></pre></td></tr></table></div></figure>


<p>Once the pull request is complete you will be able to remove the line:</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=''><span class='line'>- curl -s https://raw.github.com/ctoestreich/gvm/master/src/main/bash/gvm-install.sh &gt; ~/.gvm/src/gvm-install.sh</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[WSS4J Simple Security Using Groovy WSLite]]></title>
    <link href="http://www.christianoestreich.com/2013/01/wss4j-simple-security-using-wslite/"/>
    <updated>2013-01-17T10:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2013/01/wss4j-simple-security-using-wslite</id>
    <content type="html"><![CDATA[<p>Recently I ran into an issue where using the builtin <code>HTTPBasicAuthorization</code> provided by <a href="https://github.com/jwagenleitner/groovy-wslite" title="wslite github">wslite</a> did not meet the needs of using a simple plain text username and password in the soap header of a soap service request.</p>

<!-- more -->


<p>I tried at first to use the basic authorization through <code>HTTPBasicAuthorization</code> realizing that I didn&rsquo;t need http security, but a soap header.  I was able to manually add this header to <a href="https://github.com/jwagenleitner/groovy-wslite" title="wslite github">wslite</a> in my test case by adding a header closure with the <code>Security</code> and <code>UsernameToken</code> attributes and children.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="n">username</span> <span class="o">=</span> <span class="s2">&quot;wsuser&quot;</span>
</span><span class='line'><span class="kt">def</span> <span class="n">password</span> <span class="o">=</span> <span class="s2">&quot;secret&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">SOAPResponse</span> <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">send</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">envelopeAttributes</span> <span class="s2">&quot;xmlns:test&quot;</span><span class="o">:</span> <span class="s1">&#39;http://test.cxf.grails.org/&#39;</span><span class="o">,</span> <span class="s2">&quot;xmlns:soapenv&quot;</span><span class="o">:</span><span class="s2">&quot;soapenv&quot;</span>
</span><span class='line'>    <span class="n">version</span> <span class="n">SOAPVersion</span><span class="o">.</span><span class="na">V1_1</span>
</span><span class='line'>    <span class="n">header</span> <span class="o">{</span>
</span><span class='line'>        <span class="s1">&#39;wsse:Security&#39;</span><span class="o">(</span><span class="s1">&#39;soapenv:mustUnderstand&#39;</span><span class="o">:</span> <span class="s2">&quot;1&quot;</span><span class="o">,</span> <span class="s1">&#39;xmlns:wsse&#39;</span><span class="o">:</span> <span class="s1">&#39;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&#39;</span><span class="o">,</span> <span class="s1">&#39;xmlns:wsu&#39;</span><span class="o">:</span> <span class="s1">&#39;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="s1">&#39;wsse:UsernameToken&#39;</span><span class="o">(</span><span class="s1">&#39;wsu:Id&#39;</span><span class="o">:</span><span class="s2">&quot;UsernameToken-13&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="s1">&#39;wsse:Username&#39;</span><span class="o">(</span><span class="n">username</span><span class="o">)</span>
</span><span class='line'>                <span class="s1">&#39;wsse:Password&#39;</span><span class="o">(</span><span class="s1">&#39;Type&#39;</span><span class="o">:</span><span class="s1">&#39;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText&#39;</span><span class="o">,</span><span class="n">password</span><span class="o">)</span>
</span><span class='line'>                <span class="s1">&#39;wsse:Nonce&#39;</span><span class="o">(</span><span class="s1">&#39;EncodingType&#39;</span><span class="o">:</span><span class="s1">&#39;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary&#39;</span><span class="o">,</span><span class="k">new</span> <span class="n">String</span><span class="o">(</span><span class="n">password</span><span class="o">.</span><span class="na">bytes</span><span class="o">.</span><span class="na">encodeBase64</span><span class="o">().</span><span class="na">toString</span><span class="o">()))</span>
</span><span class='line'>                <span class="s1">&#39;wsu:Created&#39;</span><span class="o">(</span><span class="s1">&#39;2013-01-18T16:19:17.950Z&#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><span class='line'>    <span class="n">body</span> <span class="o">{</span>
</span><span class='line'>        <span class="s1">&#39;test:simpleMethod&#39;</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">param</span><span class="o">(</span><span class="s1">&#39;HELLO WORLD&#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>For more details you can see my usage in the <a href="https://github.com/thorstadt/grails-cxf#custom-security-interceptors" title="cxf plugin documentation">documentation</a> for the cxf plugin or in the <a href="https://github.com/thorstadt/grails-cxf/blob/master/test/functional/org/grails/cxf/test/AnnotatedSecureServiceSpec.groovy" title="wslite security test">spock test directly</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CoffeeScript Ant Task Updated]]></title>
    <link href="http://www.christianoestreich.com/2012/12/coffeescript-ant-task-updated/"/>
    <updated>2012-12-07T10:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/12/coffeescript-ant-task-updated</id>
    <content type="html"><![CDATA[<p>In one of our projects at work I really wanted to use CoffeeScript as a tool to create better scoped and JSLint friendly JavaScript.  The problem I ran into was that we are using Apache Ant and getting the .coffee to .js was a bit of a chore.</p>

<!-- more -->


<p>I played around with using the coffee.exe from <a href="https://github.com/alisey/CoffeeScript-Compiler-for-Windows" title="windows coffescript compiler executable">github</a>.  This approach worked, but as our conversion of files and lines grew so did the compile time.  We needed something smarter that could inspect files and skip unmodified files.</p>

<p>I found the CoffeeScript compiling ant task project out on <a href="https://github.com/pmuellr/CoffeeScriptAntTasks" title="CoffeeScriptAntTasks fork">github</a>.  This worked well, but was on an older version of CoffeeScript 0.9.0 and would output all the .js files under a single destination directory.  Meaning all the cs/<em>*/</em>.coffee files would output to one single directory.  We really wanted to inherit the directory structure and keep the compiled JavaScripts neatly tucked into their respective directory structures.</p>

<p>I decided to <a href="https://github.com/ctoestreich/CoffeeScriptAntTasks" title="CoffeeScriptAntTasks fork">fork and update the project</a>.  In doing so I also learned a bit about creating custom ant tasks.  Hopefully anyone else out there who is using ant and wants to use CoffeeScript finds this helpful.  A huge thanks to <a href="https://github.com/pmuellr" title="Patrick Meuller">Patrick Mueller</a> for creating this project.  With a few small tweaks it has become essential in our JS->CS migration.</p>

<p>Here is the 0.1.6 Change Log:</p>

<p><strong>0.1.6 &ndash; 2012/11/26</strong></p>

<ul>
<li>Updated to CoffeeScript 1.4.0</li>
<li>Changed Task for <code>CoffeeScriptC</code> to inherit <code>Task</code> instead of <code>MatchingTask</code> so we can add a boolean flag to optionally inherit directory nesting. The new flag is called <code>nesting</code>.</li>
<li>Changed <code>noWrap</code> to the new <code>bare</code> param for coffee-script compiler.</li>
<li>Added download directory containing versioned jars.</li>
</ul>


<p>You can get more details at <a href="https://github.com/ctoestreich/CoffeeScriptAntTasks" title="CoffeeScriptAntTasks fork">https://github.com/ctoestreich/CoffeeScriptAntTasks</a>.  The latest 0.1.6 jar can be found in the <a href="https://github.com/ctoestreich/CoffeeScriptAntTasks/tree/master/downloads" title="0.1.6 download">downloads</a> directory of the project or the <a href="https://github.com/ctoestreich/CoffeeScriptAntTasks/downloads" title="0.1.6 download">downloads</a> section of github.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails CXF Plugin Version 1.x Released]]></title>
    <link href="http://www.christianoestreich.com/2012/11/grails-cxf-plugin-version-one-released/"/>
    <updated>2012-11-10T10:52:02+00:00</updated>
    <id>http://www.christianoestreich.com/2012/11/grails-cxf-plugin-version-one-released</id>
    <content type="html"><![CDATA[<p>The <a href="http://grails.org/plugin/cxf" title="grails cxf plugin">Grails Cxf Plugin</a> makes exposing classes (services and endpoints) as SOAP web services easy and painless.  Since version 1.0.0, it has been rewritten and enhanced to support more features including the migration to grails 2.x.</p>

<p>The current cxf version is <a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310511&amp;styleName=Html&amp;Create=Create&amp;version=12321668">2.6.2</a></p>

<p>Some new things as of version 1.x are as follows:</p>

<ul>
<li>The plugin will autowire configured classes in the grails-app\endpoints*<em> AND the grails-app\services*</em> directories</li>
<li>Endpoint creation scripts create-endpoint and create-endpoint-simple will create cxf artefacts in grails-app\endpoints</li>
<li>Service creation scripts create-cxf-service and create-cxf-service-simple will create cxf artefacts in grails-app\services</li>
<li>The suggested pattern to isolate cxf endpoints is to have endpoints live in grails-app/endpoints directory (or you can use grails-app/services for overlapping and shared services)</li>
<li>Built in support for simple Map response type handling via <code>@XmlJavaTypeAdapter(GrailsCxfMapAdapter.class)</code> method annotation has been included to use or to kick start your own map adapter creation</li>
<li>Many new examples to help with configuration can be found in the source via functional specs and test classes at <a href="https://github.com/Grails-Plugin-Consortium/grails-cxf">https://github.com/Grails-Plugin-Consortium/grails-cxf</a></li>
<li>Default plugin configuration is provided via <code>DefaultCxfConfig.groovy</code>.  Although usually not necessary, you can override in your project&rsquo;s Config.groovy</li>
<li>The default url for wsdl viewing remains <code>http://.../[app name if not root]/services</code> as it was in previous versions.  Multiple cxf servlet endpoints can be configured or the default changed via Config.goovy</li>
<li>Wsdl First services are now available to use</li>
<li>Plugin should be <em>mostly</em> backwards compatible and work in grails 1.3.x</li>
</ul>


<p>You can get more details at <a href="https://github.com/Grails-Plugin-Consortium/grails-cxf" title="grails cxf plugin">https://github.com/Grails-Plugin-Consortium/grails-cxf</a></p>

<p>There is also a demo project if you do not want to run the cxf plugin code inline at <a href="https://github.com/Grails-Plugin-Consortium/grails-cxf-demo" title="grails cxf test project">https://github.com/Grails-Plugin-Consortium/grails-cxf-demo</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Testing Domain Constraints Using Grails 2.x & Spock 0.7]]></title>
    <link href="http://www.christianoestreich.com/2012/11/domain-constraints-grails-spock-updated/"/>
    <updated>2012-11-10T10:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/11/domain-constraints-grails-spock-updated</id>
    <content type="html"><![CDATA[<p>We were migrating some existing Java code to Grails 2.0 and we were looking
for a good solution to test domain constraints as we were migrating from an
existing schema. We already use and love Spock for most of our testing needs.
We came up with a relatively easy and reusable solution for testing
constraints that I wanted to share. As we make improvements or changes I will
update the post.</p>

<p><em>Update</em> I have updated the project and samples to work with Grails 2.1.1 and Spock 0.7.</p>

<p>All files for this demonstration can be found at my <a href="https://github.com/ctoestreich/grails-spock-constraints">grails-spock-constraints</a> GitHub repository.</p>

<!-- more -->


<h3>Setting Up A Domain Object</h3>

<p>I set up an arbitrary Person object with some constraints defined on it that
will help demonstrate how to test a wide variety of constraints using spock.
The latest <a href="https://github.com/ctoestreich/grails-spock-constraints/blob/master/grails-app/domain/com/tgid/data/Person.groovy">Person</a> class can be found on github, but here the file at the
time I published this post.</p>

<figure class='code'><figcaption><span></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>
<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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">Person</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">children:</span> <span class="n">Person</span><span class="o">]</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">firstName</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">middleName</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">lastName</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">email</span>
</span><span class='line'>    <span class="n">Integer</span> <span class="n">age</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">ssn</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">amex</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">gender</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">login</span>
</span><span class='line'>    <span class="n">Date</span> <span class="n">birthDate</span>
</span><span class='line'>    <span class="n">Float</span> <span class="n">wage</span>
</span><span class='line'>    <span class="n">Integer</span> <span class="n">fingers</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">homePage</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">username</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">firstName</span> <span class="nl">size:</span> <span class="mi">1</span><span class="o">..</span><span class="mi">50</span>
</span><span class='line'>        <span class="n">middleName</span> <span class="nl">size:</span> <span class="mi">0</span><span class="o">..</span><span class="mi">50</span>
</span><span class='line'>        <span class="n">lastName</span> <span class="nl">size:</span> <span class="mi">1</span><span class="o">..</span><span class="mi">50</span>
</span><span class='line'>        <span class="n">email</span> <span class="nl">email:</span> <span class="kc">true</span><span class="o">,</span> <span class="nl">notEqual:</span> <span class="s2">&quot;bill@microsoft.com&quot;</span>
</span><span class='line'>        <span class="n">age</span> <span class="nl">nullable:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">range:</span> <span class="mi">0</span><span class="o">..</span><span class="mi">150</span>
</span><span class='line'>        <span class="n">ssn</span> <span class="nl">unique:</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">amex</span> <span class="nl">creditCard:</span> <span class="kc">true</span>
</span><span class='line'>        <span class="n">gender</span> <span class="nl">inList:</span> <span class="o">[</span><span class="s2">&quot;Male&quot;</span><span class="o">,</span> <span class="s2">&quot;Female&quot;</span><span class="o">]</span>
</span><span class='line'>        <span class="n">login</span> <span class="nl">matches:</span> <span class="s2">&quot;[a-zA-Z]+&quot;</span>
</span><span class='line'>        <span class="n">birthDate</span> <span class="nl">max:</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span>
</span><span class='line'>        <span class="n">wage</span> <span class="nl">min:</span> <span class="mi">0</span><span class="n">F</span><span class="o">,</span> <span class="nl">scale:</span> <span class="mi">2</span>
</span><span class='line'>        <span class="n">children</span> <span class="nl">maxSize:</span> <span class="mi">10</span><span class="o">,</span> <span class="nl">minSize:</span> <span class="mi">2</span>
</span><span class='line'>        <span class="n">fingers</span> <span class="nl">nullable:</span> <span class="kc">true</span>
</span><span class='line'>        <span class="n">homePage</span> <span class="nl">url:</span> <span class="kc">true</span>
</span><span class='line'>        <span class="n">username</span> <span class="nl">validator:</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">if</span><span class="o">(!</span><span class="n">it</span><span class="o">.</span><span class="na">startsWith</span><span class="o">(</span><span class="s1">&#39;boba&#39;</span><span class="o">))</span> <span class="k">return</span> <span class="o">[</span><span class="s1">&#39;invalid.bountyhunter&#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>As you can see there are variety of constraints defined for this object. Some
of these might be nonsensical, but I wanted to demonstrate testing a wide
variety of scenarios. To get the invalid.bountyhunter message working I simply
added the following to the bottom of my message.properties file:</p>

<figure class='code'><figcaption><span></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">person</span><span class="o">.</span><span class="na">username</span><span class="o">.</span><span class="na">invalid</span><span class="o">.</span><span class="na">bountyhunter</span><span class="o">=</span><span class="n">Invalid</span> <span class="n">bounty</span> <span class="n">hunter</span> <span class="o">({</span><span class="mi">2</span><span class="o">})</span> <span class="n">tried</span> <span class="n">to</span>
</span></code></pre></td></tr></table></div></figure>


<p>log in.</p>

<h3>Grails Constraints</h3>

<p>The following are a list of available constraints to define on your domain
classes.</p>

<ul>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/attributes.html">attributes</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/blank.html">blank</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/creditCard.html">creditCard</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/email.html">email</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/inList.html">inList</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/matches.html">matches</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/max.html">max</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/maxSize.html">maxSize</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/min.html">min</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/minSize.html">minSize</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/notEqual.html">notEqual</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/nullable.html">nullable</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/range.html">range</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/scale.html">scale</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/blank.html">size</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/unique.html">unique</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/url.html">url</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/validator.html">validator</a></li>
<li><a href="http://grails.org/doc/2.0.x/ref/Constraints/widget.html">widget</a></li>
</ul>


<p>I will let the reader check the documentation for the specifics of each
constraint, but I do want to mention a few Gotchas that I ran into:</p>

<h4>Gottchas</h4>

<ul>
<li>Setting an inList constraint will not throw an error when passing a blank
&lsquo;&rsquo; string. I had assumed that using inList: [&lsquo;one&rsquo;,&lsquo;two&rsquo;] would require the
value to be not null and a valid value in list. <strong>Not True</strong></li>
<li>Setting a field as url type will allow blank and null values are valid
urls unless you explicitly define blank or nullable as a constraint. (This
seems to be fixed to not allow null by default in final 2.0.0)</li>
<li>Setting column length for String type should be done using <em>field: size
0..50</em> for a string that can be empty to 50 length. And would be set to
<em>field: size: 1..100</em> for a field that can not be empty and has a max length
of 100. MaxSize and minSize are NOT valid for this.</li>
</ul>


<p>I will add to that list as I run across items that are unexpected.</p>

<h3>Spock Basics</h3>

<p>If you aren&rsquo;t familiar with <a href="http://code.google.com/p/spock/">Spock</a> and it&rsquo;s feature set, read up on it
and start using it. It brings very rich and powerful tooling to testing your
Grails application. The important pieces to be familiar with for these tests
are the use of the <a href="http://code.google.com/p/spock/wiki/Parameterizations">where clause, parameterizations and the @Unroll
features</a>.</p>

<p>It is due to some Spock magic that these tests are able to do so much with
such little code. You will see the line in the tests like the one below of:</p>

<figure class='code'><figcaption><span></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="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Spock will replace both the <em>field</em> and <em>val</em> with data from the configured
<em>where</em> table. I had to put the field in quotes and treat it as a gstring so
Spock would replace that correctly as simply using the new Person(field: val)
would correctly replace the val, but treat the field as an actual object
property named field instead of being replaced with a valid field name from
the <em>where</em> table.</p>

<h3>Other Possible Techniques</h3>

<p>We also really like the <a href="http://www.grails.org/plugin/build-test-data">build test data plugin</a> and started off writing
these as integration tests with buildWithoutSave giving us fully hydrated live
domain objects and simply changing the fields we wanted to invalidate. But
with Grails&#8217; ability to mock for constraints in unit tests we can run these
tests even faster and earlier in the test cycle if we use unit tests instead.
This is import to us as we can run the test-app -unit in a few seconds during
development. Our machines are not the fastest and running -integration takes
several tens of seconds to run.</p>

<p>Having the objects built with the <a href="http://www.grails.org/plugin/build-test-data">build test data plugin</a> is another good
option that some people may opt for since you can mix a richer set of tests
together since you are in a headless app during integration. I will leave that
decision up the readers which method they prefer.</p>

<h3>Testing Constraints</h3>

<p>I first created a simple abstract helper class that can build some of our data
for us with reusable methods. This class also holds the function that checks
for the error message to exist on a field after the validate is called. It is
called ConstraintUnitSpec.</p>

<figure class='code'><figcaption><span></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>
<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="kn">import</span> <span class="nn">spock.lang.Specification</span>
</span><span class='line'>
</span><span class='line'><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">ConstraintUnitSpec</span> <span class="kd">extends</span> <span class="n">Specification</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">String</span> <span class="nf">getLongString</span><span class="o">(</span><span class="n">Integer</span> <span class="n">length</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="s1">&#39;a&#39;</span> <span class="o">*</span> <span class="n">length</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">String</span> <span class="nf">getEmail</span><span class="o">(</span><span class="n">Boolean</span> <span class="n">valid</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">valid</span> <span class="o">?</span> <span class="s2">&quot;dexter@miamipd.gov&quot;</span> <span class="o">:</span> <span class="s2">&quot;dexterm@m&quot;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">String</span> <span class="nf">getUrl</span><span class="o">(</span><span class="n">Boolean</span> <span class="n">valid</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">valid</span> <span class="o">?</span> <span class="s2">&quot;http://www.google.com&quot;</span> <span class="o">:</span> <span class="s2">&quot;http:/ww.helloworld.com&quot;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">String</span> <span class="nf">getCreditCard</span><span class="o">(</span><span class="n">Boolean</span> <span class="n">valid</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">valid</span> <span class="o">?</span> <span class="s2">&quot;4111111111111111&quot;</span> <span class="o">:</span> <span class="s2">&quot;41014&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">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="kt">def</span> <span class="n">validated</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="na">validate</span><span class="o">()</span>
</span><span class='line'>       <span class="k">if</span> <span class="o">(</span><span class="n">error</span> <span class="o">&amp;&amp;</span> <span class="n">error</span> <span class="o">!=</span> <span class="s1">&#39;valid&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="k">assert</span> <span class="o">!</span><span class="n">validated</span>
</span><span class='line'>           <span class="k">assert</span> <span class="n">obj</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="n">field</span><span class="o">]</span>
</span><span class='line'>           <span class="k">assert</span> <span class="n">error</span> <span class="o">==</span> <span class="n">obj</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="n">field</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="k">assert</span> <span class="o">!</span><span class="n">obj</span><span class="o">.</span><span class="na">errors</span><span class="o">[</span><span class="n">field</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>We then create our constraint tests and extend this class. We also use the
<a href="http://grails.org/doc/2.0.x/guide/testing.html#unitTesting">new Grails 2.0 @TestFor annotation</a> to inject some test helper methods
such as mockForConstraintsTests since we are in the unit test phase.</p>

<figure class='code'><figcaption><span></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">@TestFor</span><span class="o">(</span><span class="n">Person</span><span class="o">)</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">PersonSpec</span> <span class="kd">extends</span> <span class="n">ConstraintUnitSpec</span> <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>We want to set up the test and tell Grails that we are mocking the person
object so it will add the validate method and we can also add an existing
person to test unique constraints against. We do this by adding the following.</p>

<figure class='code'><figcaption><span></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="nd">@TestFor</span><span class="o">(</span><span class="n">Person</span><span class="o">)</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">PersonSpec</span> <span class="kd">extends</span> <span class="n">ConstraintUnitSpec</span> <span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="nf">setup</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">//mock a person with some data (put unique violations in here so they can be tested, the others aren&#39;t needed)</span>
</span><span class='line'>        <span class="n">mockForConstraintsTests</span><span class="o">(</span><span class="n">Person</span><span class="o">,</span> <span class="o">[</span><span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="nl">ssn:</span> <span class="s1">&#39;123456789&#39;</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>After this is done we can start adding some test blocks. The first test I
always add is the test for the standard constraint bounds. This will help with
any refactoring that you you do later to change field definitions such as
changing the size/length of a string. If you had size: 1..50 and your test
checks for 0 and 51 and then change the field constraint to size: 0..50, this
will cause your test to now fail and hopefully save you some headaches later
so you can double check your new change against the domain model and data.
Here is the comprehensive test for the Person class.</p>

<figure class='code'><figcaption><span></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>
<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='groovy'><span class='line'><span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;test person all constraints #field is #error&quot;</span><span class="o">)</span>
</span><span class='line'><span class="kt">def</span> <span class="s2">&quot;test person all constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nl">when:</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nl">then:</span>
</span><span class='line'>    <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nl">where:</span>
</span><span class='line'>    <span class="n">error</span>                  <span class="o">|</span> <span class="n">field</span>        <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>    <span class="s1">&#39;size&#39;</span>                 <span class="o">|</span> <span class="s1">&#39;firstName&#39;</span>  <span class="o">|</span> <span class="n">getLongString</span><span class="o">(</span><span class="mi">51</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;firstName&#39;</span>  <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>    <span class="s1">&#39;size&#39;</span>                 <span class="o">|</span> <span class="s1">&#39;middleName&#39;</span> <span class="o">|</span> <span class="n">getLongString</span><span class="o">(</span><span class="mi">51</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;middleName&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>    <span class="s1">&#39;size&#39;</span>                 <span class="o">|</span> <span class="s1">&#39;lastName&#39;</span>   <span class="o">|</span> <span class="n">getLongString</span><span class="o">(</span><span class="mi">51</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;lastName&#39;</span>   <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>    <span class="s1">&#39;notEqual&#39;</span>             <span class="o">|</span> <span class="s1">&#39;email&#39;</span>      <span class="o">|</span> <span class="s1">&#39;bill@microsoft.com&#39;</span>
</span><span class='line'>    <span class="s1">&#39;email&#39;</span>                <span class="o">|</span> <span class="s1">&#39;email&#39;</span>      <span class="o">|</span> <span class="n">getEmail</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;range&#39;</span>                <span class="o">|</span> <span class="s1">&#39;age&#39;</span>        <span class="o">|</span> <span class="mi">151</span>
</span><span class='line'>    <span class="s1">&#39;range&#39;</span>                <span class="o">|</span> <span class="s1">&#39;age&#39;</span>        <span class="o">|</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>    <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;age&#39;</span>        <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>    <span class="s1">&#39;blank&#39;</span>                <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span>        <span class="o">|</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>    <span class="s1">&#39;unique&#39;</span>               <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span>        <span class="o">|</span> <span class="s1">&#39;123456789&#39;</span>
</span><span class='line'>    <span class="s1">&#39;creditCard&#39;</span>           <span class="o">|</span> <span class="s1">&#39;amex&#39;</span>       <span class="o">|</span> <span class="n">getCreditCard</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;inList&#39;</span>               <span class="o">|</span> <span class="s1">&#39;gender&#39;</span>     <span class="o">|</span> <span class="s1">&#39;Unknown&#39;</span>
</span><span class='line'>    <span class="s1">&#39;matches&#39;</span>              <span class="o">|</span> <span class="s1">&#39;login&#39;</span>      <span class="o">|</span> <span class="s1">&#39;ABC123&#39;</span>
</span><span class='line'>    <span class="s1">&#39;max&#39;</span>                  <span class="o">|</span> <span class="s1">&#39;birthDate&#39;</span>  <span class="o">|</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>    <span class="s1">&#39;min&#39;</span>                  <span class="o">|</span> <span class="s1">&#39;wage&#39;</span>       <span class="o">|</span> <span class="o">-</span><span class="mi">1</span><span class="n">F</span>
</span><span class='line'>    <span class="s1">&#39;maxSize&#39;</span>              <span class="o">|</span> <span class="s1">&#39;children&#39;</span>   <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">11</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;minSize&#39;</span>              <span class="o">|</span> <span class="s1">&#39;children&#39;</span>   <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;url&#39;</span>                  <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span>   <span class="o">|</span> <span class="n">getUrl</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>    <span class="s1">&#39;invalid.bountyhunter&#39;</span> <span class="o">|</span> <span class="s1">&#39;username&#39;</span>   <span class="o">|</span> <span class="s1">&#39;buba&#39;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using Spock, these tests become very concise and easy to read in the where
clause. I set it up so that the <em>field</em> when using <em>val</em> will cause the
<em>error</em> constraint to be violated.</p>

<p>One of the reasons we like this method to test constraints is other constraint
tests simply test for errors to exist on a field, but not the specific type of
constraint violation. While the test for general field errors is still valid,
it isn&rsquo;t quite as fine grained as checking the actual type of constraint
violation expected. An example of a generic constraint testing can be found in
a couple places, but OPI published <a href="http://www.objectpartners.com/2011/02/10/grails-testing-domain-constraints/">an article here</a> on this style of
constraint testing. This is a good starting point if you don&rsquo;t need as fine
grained control as I offer here.</p>

<p>As a side note, every time the test checks for a constraint violation there
will be many fields violated, but we only care about and check for one
specific field and constraint to be violated for each row in the where table
as a time. It might be possible to mix multiple checks together, but we like
testing each scenario and constraint individually.</p>

<h3>Adding Valid Tests</h3>

<p>We can also add additional tests that check for valid values. I added some
logic in the validateConstraints method that will expect the field to pass
validation if you use the value in the error column of &lsquo;valid&rsquo; or just a null.
Using the actual word &lsquo;valid&rsquo; instead of null will help the test names be more
concise when Spock unrolls them. In the following age tests we are checking
for both failure and valid criteria. Since age is defined as:</p>

<figure class='code'><figcaption><span></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">age</span> <span class="nl">nullable:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">range:</span> <span class="mi">0</span><span class="o">..</span><span class="mi">150</span>
</span></code></pre></td></tr></table></div></figure>


<p>We will be checking for values that fall at the limits, outside and inside the
range as well as passing a null value.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'><span class="kt">def</span> <span class="s2">&quot;test person age constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nl">when:</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nl">then:</span>
</span><span class='line'>    <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nl">where:</span>
</span><span class='line'>    <span class="n">error</span>      <span class="o">|</span> <span class="n">field</span> <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>    <span class="s1">&#39;range&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">151</span>
</span><span class='line'>    <span class="s1">&#39;range&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>    <span class="s1">&#39;nullable&#39;</span> <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>    <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">100</span>
</span><span class='line'>    <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">150</span>
</span><span class='line'>    <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">0</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is the full PersonSpec</p>

<figure class='code'><figcaption><span></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>
<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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'>   <span class="kn">import</span> <span class="nn">grails.test.mixin.TestFor</span>
</span><span class='line'>   <span class="kn">import</span> <span class="nn">spock.lang.Unroll</span>
</span><span class='line'>
</span><span class='line'>   <span class="nd">@TestFor</span><span class="o">(</span><span class="n">Person</span><span class="o">)</span>
</span><span class='line'>   <span class="kd">class</span> <span class="nc">PersonSpec</span> <span class="kd">extends</span> <span class="n">ConstraintUnitSpec</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>       <span class="kt">def</span> <span class="nf">setup</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="c1">//mock a person with some data (put unique violations in here so they can be tested, the others aren&#39;t needed)</span>
</span><span class='line'>           <span class="n">mockForConstraintsTests</span><span class="o">(</span><span class="n">Person</span><span class="o">,</span> <span class="o">[</span><span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="nl">ssn:</span> <span class="s1">&#39;123456789&#39;</span><span class="o">)])</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;test person all constraints #field is #error&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person all constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>                  <span class="o">|</span> <span class="n">field</span>        <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;size&#39;</span>                 <span class="o">|</span> <span class="s1">&#39;firstName&#39;</span>  <span class="o">|</span> <span class="n">getLongString</span><span class="o">(</span><span class="mi">51</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;firstName&#39;</span>  <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;size&#39;</span>                 <span class="o">|</span> <span class="s1">&#39;middleName&#39;</span> <span class="o">|</span> <span class="n">getLongString</span><span class="o">(</span><span class="mi">51</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;middleName&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;size&#39;</span>                 <span class="o">|</span> <span class="s1">&#39;lastName&#39;</span>   <span class="o">|</span> <span class="n">getLongString</span><span class="o">(</span><span class="mi">51</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;lastName&#39;</span>   <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;notEqual&#39;</span>             <span class="o">|</span> <span class="s1">&#39;email&#39;</span>      <span class="o">|</span> <span class="s1">&#39;bill@microsoft.com&#39;</span>
</span><span class='line'>           <span class="s1">&#39;email&#39;</span>                <span class="o">|</span> <span class="s1">&#39;email&#39;</span>      <span class="o">|</span> <span class="n">getEmail</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;range&#39;</span>                <span class="o">|</span> <span class="s1">&#39;age&#39;</span>        <span class="o">|</span> <span class="mi">151</span>
</span><span class='line'>           <span class="s1">&#39;range&#39;</span>                <span class="o">|</span> <span class="s1">&#39;age&#39;</span>        <span class="o">|</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;age&#39;</span>        <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;blank&#39;</span>                <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span>        <span class="o">|</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>           <span class="s1">&#39;unique&#39;</span>               <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span>        <span class="o">|</span> <span class="s1">&#39;123456789&#39;</span>
</span><span class='line'>           <span class="s1">&#39;creditCard&#39;</span>           <span class="o">|</span> <span class="s1">&#39;amex&#39;</span>       <span class="o">|</span> <span class="n">getCreditCard</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;inList&#39;</span>               <span class="o">|</span> <span class="s1">&#39;gender&#39;</span>     <span class="o">|</span> <span class="s1">&#39;Unknown&#39;</span>
</span><span class='line'>           <span class="s1">&#39;matches&#39;</span>              <span class="o">|</span> <span class="s1">&#39;login&#39;</span>      <span class="o">|</span> <span class="s1">&#39;ABC123&#39;</span>
</span><span class='line'>           <span class="s1">&#39;max&#39;</span>                  <span class="o">|</span> <span class="s1">&#39;birthDate&#39;</span>  <span class="o">|</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>           <span class="s1">&#39;min&#39;</span>                  <span class="o">|</span> <span class="s1">&#39;wage&#39;</span>       <span class="o">|</span> <span class="o">-</span><span class="mi">1</span><span class="n">F</span>
</span><span class='line'>           <span class="s1">&#39;maxSize&#39;</span>              <span class="o">|</span> <span class="s1">&#39;children&#39;</span>   <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">11</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;minSize&#39;</span>              <span class="o">|</span> <span class="s1">&#39;children&#39;</span>   <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;url&#39;</span>                  <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span>   <span class="o">|</span> <span class="n">getUrl</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;invalid.bountyhunter&#39;</span> <span class="o">|</span> <span class="s1">&#39;username&#39;</span>   <span class="o">|</span> <span class="s1">&#39;buba&#39;</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person age constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>      <span class="o">|</span> <span class="n">field</span> <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;range&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">151</span>
</span><span class='line'>           <span class="s1">&#39;range&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span> <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">100</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">150</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;age&#39;</span> <span class="o">|</span> <span class="mi">0</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person ssn constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>      <span class="o">|</span> <span class="n">field</span> <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;blank&#39;</span>    <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span> <span class="o">|</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span> <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;unique&#39;</span>   <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span> <span class="o">|</span> <span class="s1">&#39;123456789&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span> <span class="o">|</span> <span class="s1">&#39;123456788&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;ssn&#39;</span> <span class="o">|</span> <span class="s1">&#39;123-45-6787&#39;</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person username constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>                  <span class="o">|</span> <span class="n">field</span>      <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;invalid.bountyhunter&#39;</span> <span class="o">|</span> <span class="s1">&#39;username&#39;</span> <span class="o">|</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span>             <span class="o">|</span> <span class="s1">&#39;username&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;invalid.bountyhunter&#39;</span> <span class="o">|</span> <span class="s1">&#39;username&#39;</span> <span class="o">|</span> <span class="s1">&#39;bubua&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>                <span class="o">|</span> <span class="s1">&#39;username&#39;</span> <span class="o">|</span> <span class="s1">&#39;bobafet&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>                <span class="o">|</span> <span class="s1">&#39;username&#39;</span> <span class="o">|</span> <span class="s1">&#39;bobajunior&#39;</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person homepage constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>      <span class="o">|</span> <span class="n">field</span>      <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;url&#39;</span>      <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span> <span class="o">|</span> <span class="n">getUrl</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span> <span class="o">|</span> <span class="s1">&#39;&#39;</span> <span class="c1">//blanks work for url</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span> <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span> <span class="o">|</span> <span class="kc">null</span> <span class="c1">//null works for url (2.0.0 not anymore)</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span> <span class="o">|</span> <span class="n">getUrl</span><span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">+</span> <span class="s1">&#39;/page.gsp&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;homePage&#39;</span> <span class="o">|</span> <span class="n">getUrl</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><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person gender constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>      <span class="o">|</span> <span class="n">field</span>    <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;inList&#39;</span>   <span class="o">|</span> <span class="s1">&#39;gender&#39;</span> <span class="o">|</span> <span class="s1">&#39;Unknown&#39;</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span> <span class="o">|</span> <span class="s1">&#39;gender&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;gender&#39;</span> <span class="o">|</span> <span class="s1">&#39;&#39;</span> <span class="c1">//blanks work for inList</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;gender&#39;</span> <span class="o">|</span> <span class="s1">&#39;Male&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;gender&#39;</span> <span class="o">|</span> <span class="s1">&#39;Female&#39;</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person credit card constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>        <span class="o">|</span> <span class="n">field</span>  <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;creditCard&#39;</span> <span class="o">|</span> <span class="s1">&#39;amex&#39;</span> <span class="o">|</span> <span class="n">getCreditCard</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span>   <span class="o">|</span> <span class="s1">&#39;amex&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>      <span class="o">|</span> <span class="s1">&#39;amex&#39;</span> <span class="o">|</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>      <span class="o">|</span> <span class="s1">&#39;amex&#39;</span> <span class="o">|</span> <span class="n">getCreditCard</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><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field is #error using #val&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person birth date constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>      <span class="o">|</span> <span class="n">field</span>       <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;max&#39;</span>      <span class="o">|</span> <span class="s1">&#39;birthDate&#39;</span> <span class="o">|</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>           <span class="s1">&#39;nullable&#39;</span> <span class="o">|</span> <span class="s1">&#39;birthDate&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;birthDate&#39;</span> <span class="o">|</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span> <span class="o">-</span> <span class="mi">1</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>    <span class="o">|</span> <span class="s1">&#39;birthDate&#39;</span> <span class="o">|</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="nd">@Unroll</span><span class="o">(</span><span class="s2">&quot;person #field testing #error&quot;</span><span class="o">)</span>
</span><span class='line'>       <span class="kt">def</span> <span class="s2">&quot;test person children constraints&quot;</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>           <span class="nl">when:</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">obj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">(</span><span class="s2">&quot;$field&quot;</span><span class="o">:</span> <span class="n">val</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">then:</span>
</span><span class='line'>           <span class="n">validateConstraints</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">field</span><span class="o">,</span> <span class="n">error</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>           <span class="nl">where:</span>
</span><span class='line'>           <span class="n">error</span>     <span class="o">|</span> <span class="n">field</span>      <span class="o">|</span> <span class="n">val</span>
</span><span class='line'>           <span class="s1">&#39;maxSize&#39;</span> <span class="o">|</span> <span class="s1">&#39;children&#39;</span> <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">11</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;minSize&#39;</span> <span class="o">|</span> <span class="s1">&#39;children&#39;</span> <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>   <span class="o">|</span> <span class="s1">&#39;children&#39;</span> <span class="o">|</span> <span class="kc">null</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>   <span class="o">|</span> <span class="s1">&#39;children&#39;</span> <span class="o">|</span> <span class="n">createPerson</span><span class="o">(</span><span class="mi">10</span><span class="o">)</span>
</span><span class='line'>           <span class="s1">&#39;valid&#39;</span>   <span class="o">|</span> <span class="s1">&#39;children&#39;</span> <span class="o">|</span> <span class="n">createPerson</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><span class='line'>       <span class="kd">private</span> <span class="nf">createPerson</span><span class="o">(</span><span class="n">Integer</span> <span class="n">count</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>           <span class="kt">def</span> <span class="n">persons</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>           <span class="n">count</span><span class="o">.</span><span class="na">times</span> <span class="o">{</span>
</span><span class='line'>               <span class="n">persons</span> <span class="o">&lt;&lt;</span> <span class="k">new</span> <span class="n">Person</span><span class="o">()</span>
</span><span class='line'>           <span class="o">}</span>
</span><span class='line'>           <span class="n">persons</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>


<h3>Conclusion</h3>

<p>I hope that this can be a useful tool or guideline for you when you are
creating constraint tests for your domain objects. These tests are a bit
tedious to write, but using some of the techniques here makes writing them
pretty quick to create and test.</p>

<p>I would probably never test ALL the constraints like this, but in case you wanted to
test anything specific and guard against certain non-allowed data then you might want to consider something like this.  This
would certainly be to your benefit to do for any custom constraints you define on your objects.</p>

<h3>Sample Project</h3>

<p>All files for this demonstration can be found at my <a href="https://github.com/ctoestreich/grails-spock-constraints">grails-spock-
constraints</a> GitHub repository.</p>

<h3>Getting Grails 2.0 and Spock 0.6 Working (Legacy)</h3>

<p>We had a little bit of trouble getting grails 2.0.0.RC1 and Spock 0.6 to play
well together, but found some useful information in this <a href="http://jira.grails.org/browse/GPSPOCK-5?focusedCommentId=67107&amp;page=com.atlassian.jira.plugin.system.issuetabpanels%3acomment-tabpanel#comment-67107">jira</a>.
Add the following to the repositories section of your BuildConfig.groovy</p>

<figure class='code'><figcaption><span></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">mavenRepo</span> <span class="s2">&quot;http://m2repo.spockframework.org/snapshots&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>and the following to the plugins section of your BuildConfig.groovy</p>

<figure class='code'><figcaption><span></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">test</span> <span class="s2">&quot;:spock:0.6-SNAPSHOT&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>These will no doubt change as 2.0 becomes final and the official spock plugin
is updated.</p>

<h3>References</h3>

<ul>
<li>Another Spock Constraint Test: <a href="http://meetspock.appspot.com/script/35001">http://meetspock.appspot.com/script/35001</a></li>
<li>Spock Documentation: <a href="http://code.google.com/p/spock/">http://code.google.com/p/spock/</a></li>
<li>Generic Constraint Validation: <a href="http://www.objectpartners.com/2011/02/10/grails-testing-domain-constraints/">http://www.objectpartners.com/2011/02/10/grails-testing-domain-constraints/</a></li>
<li>Grails 2.0 Docs: <a href="http://grails.org/doc/2.0.x/">http://grails.org/doc/2.0.x/</a></li>
<li>Grails 2.0 Mocking: <a href="http://grails.org/doc/2.0.x/guide/testing.html#mockingCollaborators">http://grails.org/doc/2.0.x/guide/testing.html#mockingCollaborators</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails 2.x Deployed To Websphere 7ish]]></title>
    <link href="http://www.christianoestreich.com/2012/10/deloying-grails-2-to-websphere/"/>
    <updated>2012-10-20T12:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/10/deloying-grails-2-to-websphere</id>
    <content type="html"><![CDATA[<p>I have struggled a lot with getting our corporate-standard WebSphere container to play nicely with Grails in the past and when we moved to Grails 2.1.1 and WebSphere 7.0 it was no different.</p>

<!-- more -->


<h4>EAR Script</h4>

<p>The first thing you will want to do is add the Ear script to your project under <code>scripts</code>.</p>

<figure class='code'><figcaption><span></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>
<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>
</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;_GrailsWar&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">ear:</span> <span class="s2">&quot;Creates an EAR file from a Grails WAR&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">war</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;Building EAR file&quot;</span><span class="o">])</span>
</span><span class='line'>  <span class="n">generateApplicationXml</span><span class="o">()</span>
</span><span class='line'>  <span class="kt">def</span> <span class="n">warDest</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">warName</span><span class="o">).</span><span class="na">parentFile</span>
</span><span class='line'>  <span class="kt">def</span> <span class="n">appVersion</span> <span class="o">=</span> <span class="n">metadata</span><span class="o">.</span><span class="na">getApplicationVersion</span><span class="o">()</span>
</span><span class='line'>  <span class="kt">def</span> <span class="n">earFile</span> <span class="o">=</span> <span class="s2">&quot;${projectTargetDir}/${contextRoot}-${appVersion}.ear&quot;</span>
</span><span class='line'>  <span class="n">ant</span><span class="o">.</span><span class="na">ear</span><span class="o">(</span><span class="nl">destfile:</span> <span class="n">earFile</span><span class="o">,</span> <span class="nl">appxml:</span> <span class="n">appXml</span><span class="o">,</span> <span class="nl">update:</span> <span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">fileset</span><span class="o">(</span><span class="nl">dir:</span> <span class="n">warDest</span><span class="o">,</span> <span class="nl">includes:</span> <span class="s2">&quot;*.war&quot;</span><span class="o">)</span>
</span><span class='line'>  <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;Done creating EAR $earFile&quot;</span><span class="o">])</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">target</span><span class="o">(</span><span class="nl">defineContextRoot:</span> <span class="s2">&quot;defines the context root&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">contextRoot</span> <span class="o">=</span> <span class="s2">&quot;${grailsAppName}&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">target</span><span class="o">(</span><span class="nl">generateApplicationXml:</span> <span class="s2">&quot;Generates an application.xml file&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">defineContextRoot</span><span class="o">)</span>
</span><span class='line'>  <span class="kt">def</span> <span class="n">warDest</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">warName</span><span class="o">)</span>
</span><span class='line'>  <span class="n">appXml</span> <span class="o">=</span> <span class="s2">&quot;${projectTargetDir}/application.xml&quot;</span>
</span><span class='line'>  <span class="k">new</span> <span class="nf">File</span><span class="o">(</span><span class="n">appXml</span><span class="o">).</span><span class="na">write</span> <span class="s2">&quot;&quot;&quot;&lt;?xml version=&quot;</span><span class="mf">1.0</span><span class="s2">&quot; encoding=&quot;</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span><span class="s2">&quot;?&gt;</span>
</span><span class='line'><span class="s2">&lt;application xmlns=&quot;</span><span class="nl">http:</span><span class="c1">//java.sun.com/xml/ns/javaee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; version=&quot;5&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd&quot;&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">display</span><span class="o">-</span><span class="n">name</span><span class="o">&gt;</span><span class="n">$</span><span class="o">{</span><span class="n">grailsAppName</span><span class="o">}&lt;</span><span class="s">/display-name&gt;</span>
</span><span class='line'><span class="s">&lt;module&gt;</span>
</span><span class='line'><span class="s">    &lt;web&gt;</span>
</span><span class='line'><span class="s">        &lt;web-uri&gt;${warDest.name}&lt;/</span><span class="n">web</span><span class="o">-</span><span class="n">uri</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="n">context</span><span class="o">-</span><span class="n">root</span><span class="o">&gt;</span><span class="n">$</span><span class="o">{</span><span class="n">contextRoot</span><span class="o">}&lt;</span><span class="s">/context-root&gt;</span>
</span><span class='line'><span class="s">    &lt;/</span><span class="n">web</span><span class="o">&gt;</span>
</span><span class='line'> <span class="o">&lt;</span><span class="s">/module&gt;</span>
</span><span class='line'><span class="s">&lt;/</span><span class="n">application</span><span class="o">&gt;</span><span class="s2">&quot;&quot;</span><span class="err">&quot;</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">ear</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Install Web.xml and JNDI</h4>

<p>If, like us, you use JNDI for your database connection you will probably want to add it to the web.xml.  Just run the <code>grails install-templates</code> command and modify your web.xml with your jndi node similar to below.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;web-app&gt;</span>
</span><span class='line'>...
</span><span class='line'>    <span class="nt">&lt;resource-ref</span> <span class="na">id=</span><span class="s">&quot;ResourceRef_12345&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;res-ref-name&gt;</span>jdbc/MyName<span class="nt">&lt;/res-ref-name&gt;</span>
</span><span class='line'>        <span class="nt">&lt;res-type&gt;</span>javax.sql.DataSource<span class="nt">&lt;/res-type&gt;</span>
</span><span class='line'>        <span class="nt">&lt;res-auth&gt;</span>Application<span class="nt">&lt;/res-auth&gt;</span>
</span><span class='line'>        <span class="nt">&lt;res-sharing-scope&gt;</span>Shareable<span class="nt">&lt;/res-sharing-scope&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/resource-ref&gt;</span>
</span><span class='line'><span class="nt">&lt;/web-app&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should have your DataSource.groovy set up similar to this for each environment you are using.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">environments</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>    <span class="n">production</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">dataSource</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">jndiName</span> <span class="o">=</span> <span class="s2">&quot;java:comp/env/jdbc/MyName&quot;</span>
</span><span class='line'>            <span class="n">dialect</span> <span class="o">=</span> <span class="s2">&quot;org.hibernate.dialect.OracleDialect&quot;</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>If you need this jndi available in dev (run-app local mode) you will need to add it to your Config.groovy.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">environments</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">development</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// this will create the JNDI entry in the tomcat plugin for local execution</span>
</span><span class='line'>        <span class="n">grails</span><span class="o">.</span><span class="na">naming</span><span class="o">.</span><span class="na">entries</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>                <span class="s2">&quot;jdbc/MyName&quot;</span><span class="o">:</span> <span class="o">[</span>
</span><span class='line'>                        <span class="nl">type:</span> <span class="s2">&quot;javax.sql.DataSource&quot;</span><span class="o">,</span> <span class="c1">//required</span>
</span><span class='line'>                        <span class="nl">auth:</span> <span class="s2">&quot;Container&quot;</span><span class="o">,</span> <span class="c1">// optional</span>
</span><span class='line'>                        <span class="nl">description:</span> <span class="s2">&quot;Data source for Database&quot;</span><span class="o">,</span> <span class="c1">//optional</span>
</span><span class='line'>                        <span class="nl">driverClassName:</span> <span class="s2">&quot;com.mysql.jdbc.Driver&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nl">url:</span> <span class="s2">&quot;jdbc:mysql://server:3306/db?useOldAliasMetadataBehavior=true&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nl">username:</span> <span class="s2">&quot;blah&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nl">password:</span> <span class="s2">&quot;secret&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nl">maxActive:</span> <span class="s2">&quot;8&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nl">maxIdle:</span> <span class="s2">&quot;8&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nl">poolPreparedStatements:</span> <span class="s2">&quot;true&quot;</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>


<h4>Additional WebSphere Web Xml Settings</h4>

<p>There are two additional files you will probably need to create and put into your <code>web-app\WEB_INF</code> directory.</p>

<p><strong>ibm-web-bnd.xml</strong></p>

<figure class='code'><figcaption><span></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>
</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;web-bnd</span> <span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span class="na">xmlns=</span><span class="s">&quot;http://websphere.ibm.com/xml/ns/javaee&quot;</span>
</span><span class='line'>         <span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd&quot;</span> <span class="na">version=</span><span class="s">&quot;1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;virtual-host</span> <span class="na">name=</span><span class="s">&quot;default_host&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;resource-ref</span> <span class="na">name=</span><span class="s">&quot;jdbc/MyName&quot;</span> <span class="na">binding-name=</span><span class="s">&quot;jdbc/MyName&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/web-bnd&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>ibm-web-ext.xml</strong></p>

<figure class='code'><figcaption><span></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='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;web-ext</span> <span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span class="na">xmlns=</span><span class="s">&quot;http://websphere.ibm.com/xml/ns/javaee&quot;</span>
</span><span class='line'>         <span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd&quot;</span> <span class="na">version=</span><span class="s">&quot;1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;webApp</span> <span class="na">href=</span><span class="s">&quot;WEB-INF/web_merged.xml#WebApp_ID&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;jsp-attribute</span> <span class="na">name=</span><span class="s">&quot;reloadEnabled&quot;</span> <span class="na">value=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;jsp-attribute</span> <span class="na">name=</span><span class="s">&quot;reloadInterval&quot;</span> <span class="na">value=</span><span class="s">&quot;10&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;jsp-attribute</span> <span class="na">name=</span><span class="s">&quot;jdkSourceLevel&quot;</span> <span class="na">value=</span><span class="s">&quot;16&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;jsp-attribute</span> <span class="na">name=</span><span class="s">&quot;trackDependencies&quot;</span> <span class="na">value=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;jsp-attribute</span> <span class="na">name=</span><span class="s">&quot;keepgenerated&quot;</span> <span class="na">value=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/web-ext&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>WebSphere Settings</h4>

<p>I am not even sure if these are needed, but I did them anyway. (from &lt;<a href="http://grails.org/Deployment#Websphere">http://grails.org/Deployment#Websphere</a> 6.1>)</p>

<p>Server JVM settings:</p>

<ul>
<li>In &ldquo;Application servers > server > Process Definition > Java Virtual Machine&rdquo; set &ldquo;Generic JVM arguments&rdquo; to &ldquo;-Xverify:none&rdquo;</li>
<li>In &ldquo;Application servers > server > Process Definition > Java Virtual Machine > Custom Properties&rdquo;, add a custom property name: com.ibm.ws.classloader.getInputStream.enableIOException value: true</li>
<li>In &ldquo;Application servers > server > Web container > Custom Properties&rdquo;, add a custom property name: com.ibm.ws.webcontainer.invokeFiltersCompatibility value: true</li>
</ul>


<p>Also you will need to make sure that your Enterprise Application > Class loading and update detection</p>

<ul>
<li>Classes loaded with local class loader first (parent last)</li>
<li>Single class loader for application</li>
</ul>


<h4>War Settings</h4>

<p>In the end you will probably have jar/lib hell and your application may not start correctly.  Make sure all your plugins and dependencies have appropriate excludes.  For example, we are using spring security (not the plugin) and here is one dependency exclude example:</p>

<figure class='code'><figcaption><span></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="n">compile</span><span class="o">(</span><span class="s1">&#39;org.springframework.security:spring-security-core:3.0.7.RELEASE&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">excludes</span> <span class="s1">&#39;spring-expression&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-core&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-context&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-tx&#39;</span><span class="o">,</span>
</span><span class='line'>             <span class="s1">&#39;spring-aop&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-jdbc&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-web&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-test&#39;</span><span class="o">,</span> <span class="s1">&#39;aspectjrt&#39;</span><span class="o">,</span>
</span><span class='line'>             <span class="s1">&#39;aspectjweaver&#39;</span><span class="o">,</span> <span class="s1">&#39;cglib-nodep&#39;</span><span class="o">,</span> <span class="s1">&#39;ehcache&#39;</span><span class="o">,</span> <span class="s1">&#39;commons-collections&#39;</span><span class="o">,</span>
</span><span class='line'>             <span class="s1">&#39;hsqldb&#39;</span><span class="o">,</span> <span class="s1">&#39;jsr250-api&#39;</span><span class="o">,</span> <span class="s1">&#39;log4j&#39;</span><span class="o">,</span> <span class="s1">&#39;junit&#39;</span><span class="o">,</span> <span class="s1">&#39;mockito-core&#39;</span><span class="o">,</span> <span class="s1">&#39;jmock-junit4&#39;</span><span class="o">,</span>
</span><span class='line'>             <span class="s1">&#39;spring-aop&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-beans&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-context&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-core&#39;</span><span class="o">,</span> <span class="s1">&#39;spring-tx&#39;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I currently am also telling grails to remove certain jars from the war in <code>BuildConfig.groovy</code> via</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">grails</span><span class="o">.</span><span class="na">war</span><span class="o">.</span><span class="na">resources</span> <span class="o">=</span> <span class="o">{</span> <span class="n">stagingDir</span><span class="o">,</span> <span class="n">args</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/geronimo-servlet_2.5_spec-1.2.jar&quot;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/geronimo-jms_1.1_spec-1.1.1.jar&quot;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/geronimo-commonj_1.1_spec-1.0.jar&quot;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/jta-1.1.jar&quot;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/ojdbc.jar&quot;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/antlr-2.7.6.jar&quot;</span>
</span><span class='line'>    <span class="n">delete</span> <span class="nl">file:</span> <span class="s2">&quot;${stagingDir}/WEB-INF/lib/geronimo-javamail_1.4_spec-1.7.1.jar&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Conclusion</h4>

<p>Good Luck&hellip;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Interceptor Injection]]></title>
    <link href="http://www.christianoestreich.com/2012/04/grails-cxf-interceptor-injection.markdown/"/>
    <updated>2012-04-06T12:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/04/grails-cxf-interceptor-injection.markdown</id>
    <content type="html"><![CDATA[In my [grails cxf-client-demo project][1] I needed a way to test if the simple username token authentication wss4j interceptors were working.  I looked around the web for help on how to inject an inbound security interceptor into the [grails cxf plugin][3].  I found some example on how to do this with cxf 2.3.x versions, but when I was recently helping update the [grails cxf plugin][3] to use cxf 2.5.2, I found out they changed the way that username token was done.

<!-- more -->

#### Apache Cxf Security ####

All I have to say is good luck with using the sample code from the [apache cxf security docs][4].  Their code for 2.5.x is lacking and the code provided didn&#8217;t work and caused me a lot of ???? moments.

The [cxf plugin][3] wires up service factories that will match the name of your exposed service such as `secureService` with bean named `secureServiceFactory`.  You will want to inject any interceptors onto that factory during application boot.  For the following examples I use the BootStrap.groovy to inject these.

#### Grails Cxf Interceptor Injection 2.3.x ####

This is the &#8220;old&#8221; way of adding simple token authentication with 2.3.x.

&#8220;` groovy
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor
import org.apache.ws.security.WSConstants
import org.apache.ws.security.WSPasswordCallback
import org.apache.ws.security.handler.WSHandlerConstants

import javax.security.auth.callback.Callback
import javax.security.auth.callback.CallbackHandler
import javax.security.auth.callback.UnsupportedCallbackException

class BootStrap {

    def secureServiceFactory

    def init = { servletContext ->

        Map<String, Object> inProps = [:]
        inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        inProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        inProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]
                println pc.identifier
                println pc.password
                if(pc.identifier == &#8220;wsuser&#8221; && pc.password != &#8220;secret&#8221;) {
                    println &#8220;error :: wrong password&#8221;
                    throw new IOException(&#8220;wrong password&#8221;)
                }
            }
        })
        secureServiceFactory.getInInterceptors().add(new WSS4JInInterceptor(inProps))
    }
}
&#8220;`

#### Grails Cxf Interceptor Injection 2.4.x-2.5.x ####

Since the new apache cxf 2.4.x and 2.5.x use a Validator instead of the callback, here is how you would now inject that same check into the same service factory.  I am using an anonymous UsernameTokenValidator class just like the anonymous callback in the previous example.

&#8220;` groovy
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor
import org.apache.ws.security.WSConstants
import org.apache.ws.security.WSSecurityEngine
import org.apache.ws.security.WSSecurityException
import org.apache.ws.security.handler.WSHandlerConstants
import org.apache.ws.security.validate.UsernameTokenValidator
import org.apache.ws.security.validate.Validator

import javax.xml.namespace.QName

class BootStrap {

    def secureServiceFactory

    def init = { servletContext ->

        Map<String, Object> inProps = [:]
        inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        inProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        Map<QName, Validator> validatorMap = new HashMap<QName, Validator>();
        validatorMap.put(WSSecurityEngine.USERNAME_TOKEN, new UsernameTokenValidator() {

            @Override
            protected void verifyPlaintextPassword(org.apache.ws.security.message.token.UsernameToken usernameToken, org.apache.ws.security.handler.RequestData data)
                throws org.apache.ws.security.WSSecurityException {
                if(data.username == &#8220;wsuser&#8221; && usernameToken.password == &#8220;secret&#8221;) {
		    println &#8220;username and password are correct!&#8221;
		} else {
		    println &#8220;username and password are NOT correct&#8230;&#8221;
                    throw new WSSecurityException(&#8220;user and/or password mismatch&#8221;)
                }
            }
        });
        inProps.put(WSS4JInInterceptor.VALIDATOR_MAP, validatorMap);
        secureServiceFactory.getInInterceptors().add(new WSS4JInInterceptor(inProps))
    }

    def destroy = {
    }
}
&#8220;`

#### Conclusion ####

My frustrations really only apply to the username token authentication issue, but I haven&#8217;t tried getting the certificate or ldap authentication working on the server side in 2.5.2 yet.  In general if you need in or out logging or security interceptors on your [cxf plugin][3] exposed services, the above mentioned is a pretty good way to get them on there.  What you put into the properties of those interceptors to make them work is on you.  Good Luck!

[1]: https://www.github.com/Grails-Plugin-Consortium/cxf-client-demo (Grails Cxf Client Demo)
[2]: https://www.github.com/Grails-Plugin-Consortium/cxf-client (Grails Cxf Client Plugin)
[3]: http://www.grails.org/plugin/cxf (Grails Cxf Plugin)
[4]: http://cxf.apache.org/docs/ws-security.html (Apache Cxf Security Docs)
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Interceptor Injection]]></title>
    <link href="http://www.christianoestreich.com/2012/04/grails-cxf-interceptor-injection/"/>
    <updated>2012-04-06T12:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/04/grails-cxf-interceptor-injection</id>
    <content type="html"><![CDATA[<p>In my <a href="https://www.github.com/Grails-Plugin-Consortium/grails-cxf-client-demo" title="Grails Cxf Client Demo">grails cxf-client-demo project</a> I needed a way to test if the simple username token authentication wss4j interceptors were working.  I looked around the web for help on how to inject an inbound security interceptor into the <a href="http://www.grails.org/plugin/cxf" title="Grails Cxf Plugin">grails cxf plugin</a>.  I found some example on how to do this with cxf 2.3.x versions, but when I was recently helping update the <a href="http://www.grails.org/plugin/cxf" title="Grails Cxf Plugin">grails cxf plugin</a> to use cxf 2.5.2, I found out they changed the way that username token was done.</p>

<!-- more -->


<h4>Apache Cxf Security</h4>

<p>All I have to say is good luck with using the sample code from the <a href="http://cxf.apache.org/docs/ws-security.html" title="Apache Cxf Security Docs">apache cxf security docs</a>.  Their code for 2.5.x is lacking and the code provided didn&rsquo;t work and caused me a lot of ???? moments.</p>

<p>The <a href="http://www.grails.org/plugin/cxf" title="Grails Cxf Plugin">cxf plugin</a> wires up service factories that will match the name of your exposed service such as <code>secureService</code> with bean named <code>secureServiceFactory</code>.  You will want to inject any interceptors onto that factory during application boot.  For the following examples I use the BootStrap.groovy to inject these.</p>

<h4>Grails Cxf Interceptor Injection 2.3.x</h4>

<p>This is the &ldquo;old&rdquo; way of adding simple token authentication with 2.3.x.</p>

<figure class='code'><figcaption><span></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>
<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='groovy'><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.WSConstants</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.WSPasswordCallback</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.handler.WSHandlerConstants</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">javax.security.auth.callback.Callback</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">javax.security.auth.callback.CallbackHandler</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">javax.security.auth.callback.UnsupportedCallbackException</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">BootStrap</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">secureServiceFactory</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">init</span> <span class="o">=</span> <span class="o">{</span> <span class="n">servletContext</span> <span class="o">-&gt;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Object</span><span class="o">&gt;</span> <span class="n">inProps</span> <span class="o">=</span> <span class="o">[:]</span>
</span><span class='line'>        <span class="n">inProps</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">ACTION</span><span class="o">,</span> <span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">USERNAME_TOKEN</span><span class="o">);</span>
</span><span class='line'>        <span class="n">inProps</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">PASSWORD_TYPE</span><span class="o">,</span> <span class="n">WSConstants</span><span class="o">.</span><span class="na">PW_TEXT</span><span class="o">);</span>
</span><span class='line'>        <span class="n">inProps</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">PW_CALLBACK_REF</span><span class="o">,</span> <span class="k">new</span> <span class="n">CallbackHandler</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="kt">void</span> <span class="nf">handle</span><span class="o">(</span><span class="n">Callback</span><span class="o">[]</span> <span class="n">callbacks</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span><span class="o">,</span> <span class="n">UnsupportedCallbackException</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">WSPasswordCallback</span> <span class="n">pc</span> <span class="o">=</span> <span class="o">(</span><span class="n">WSPasswordCallback</span><span class="o">)</span> <span class="n">callbacks</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>                <span class="n">println</span> <span class="n">pc</span><span class="o">.</span><span class="na">identifier</span>
</span><span class='line'>                <span class="n">println</span> <span class="n">pc</span><span class="o">.</span><span class="na">password</span>
</span><span class='line'>                <span class="nf">if</span><span class="o">(</span><span class="n">pc</span><span class="o">.</span><span class="na">identifier</span> <span class="o">==</span> <span class="s2">&quot;wsuser&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">pc</span><span class="o">.</span><span class="na">password</span> <span class="o">!=</span> <span class="s2">&quot;secret&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="n">println</span> <span class="s2">&quot;error :: wrong password&quot;</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="s2">&quot;wrong password&quot;</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="n">secureServiceFactory</span><span class="o">.</span><span class="na">getInInterceptors</span><span class="o">().</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">WSS4JInInterceptor</span><span class="o">(</span><span class="n">inProps</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>


<h4>Grails Cxf Interceptor Injection 2.4.x-2.5.x</h4>

<p>Since the new apache cxf 2.4.x and 2.5.x use a Validator instead of the callback, here is how you would now inject that same check into the same service factory.  I am using an anonymous UsernameTokenValidator class just like the anonymous callback in the previous example.</p>

<figure class='code'><figcaption><span></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>
<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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.WSConstants</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.WSSecurityEngine</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.WSSecurityException</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.handler.WSHandlerConstants</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.validate.UsernameTokenValidator</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.ws.security.validate.Validator</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">javax.xml.namespace.QName</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">BootStrap</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">secureServiceFactory</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">init</span> <span class="o">=</span> <span class="o">{</span> <span class="n">servletContext</span> <span class="o">-&gt;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Object</span><span class="o">&gt;</span> <span class="n">inProps</span> <span class="o">=</span> <span class="o">[:]</span>
</span><span class='line'>        <span class="n">inProps</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">ACTION</span><span class="o">,</span> <span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">USERNAME_TOKEN</span><span class="o">);</span>
</span><span class='line'>        <span class="n">inProps</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSHandlerConstants</span><span class="o">.</span><span class="na">PASSWORD_TYPE</span><span class="o">,</span> <span class="n">WSConstants</span><span class="o">.</span><span class="na">PW_TEXT</span><span class="o">);</span>
</span><span class='line'>        <span class="n">Map</span><span class="o">&lt;</span><span class="n">QName</span><span class="o">,</span> <span class="n">Validator</span><span class="o">&gt;</span> <span class="n">validatorMap</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">QName</span><span class="o">,</span> <span class="n">Validator</span><span class="o">&gt;();</span>
</span><span class='line'>        <span class="n">validatorMap</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSSecurityEngine</span><span class="o">.</span><span class="na">USERNAME_TOKEN</span><span class="o">,</span> <span class="k">new</span> <span class="n">UsernameTokenValidator</span><span class="o">()</span> <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">verifyPlaintextPassword</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">ws</span><span class="o">.</span><span class="na">security</span><span class="o">.</span><span class="na">message</span><span class="o">.</span><span class="na">token</span><span class="o">.</span><span class="na">UsernameToken</span> <span class="n">usernameToken</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">ws</span><span class="o">.</span><span class="na">security</span><span class="o">.</span><span class="na">handler</span><span class="o">.</span><span class="na">RequestData</span> <span class="n">data</span><span class="o">)</span>
</span><span class='line'>                <span class="kd">throws</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">ws</span><span class="o">.</span><span class="na">security</span><span class="o">.</span><span class="na">WSSecurityException</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">username</span> <span class="o">==</span> <span class="s2">&quot;wsuser&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">usernameToken</span><span class="o">.</span><span class="na">password</span> <span class="o">==</span> <span class="s2">&quot;secret&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">println</span> <span class="s2">&quot;username and password are correct!&quot;</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="s2">&quot;username and password are NOT correct...&quot;</span>
</span><span class='line'>                    <span class="k">throw</span> <span class="k">new</span> <span class="nf">WSSecurityException</span><span class="o">(</span><span class="s2">&quot;user and/or password mismatch&quot;</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="n">inProps</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">WSS4JInInterceptor</span><span class="o">.</span><span class="na">VALIDATOR_MAP</span><span class="o">,</span> <span class="n">validatorMap</span><span class="o">);</span>
</span><span class='line'>        <span class="n">secureServiceFactory</span><span class="o">.</span><span class="na">getInInterceptors</span><span class="o">().</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">WSS4JInInterceptor</span><span class="o">(</span><span class="n">inProps</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="n">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>


<h4>Conclusion</h4>

<p>My frustrations really only apply to the username token authentication issue, but I haven&rsquo;t tried getting the certificate or ldap authentication working on the server side in 2.5.2 yet.  In general if you need in or out logging or security interceptors on your <a href="http://www.grails.org/plugin/cxf" title="Grails Cxf Plugin">cxf plugin</a> exposed services, the above mentioned is a pretty good way to get them on there.  What you put into the properties of those interceptors to make them work is on you.  Good Luck!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Client 1.2.9 Released]]></title>
    <link href="http://www.christianoestreich.com/2012/03/grails-cxf-client-soap-exceptions.markdown/"/>
    <updated>2012-03-01T12:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/03/grails-cxf-client-soap-exceptions.markdown</id>
    <content type="html"><![CDATA[The [Grails cxf-client plugin][1] has been updated to version 1.2.9.  When I first deployed the plugin I overlooked allowing checked exceptions and soap faults to bubble out of the client proxy appropriately.  I modified the plugin to allow this now.  In addition I added a configuration parameter for proxyFactoryBindingId to allow soap 1.2 (set to "http://schemas.xmlsoap.org/wsdl/soap12/").

#### Updated Parameter Documentation ####

The following partial documentation is available in full at [https://github.com/Grails-Plugin-Consortium/cxf-client][2]

Property|Description|Required
:-----------|:------------|:------------
proxyFactoryBindingId|The URI, or ID, of the message binding for the endpoint to use. For SOAP the binding URI(ID) is specified by the JAX-WS specification. For other message bindings the URI is the namespace of the WSDL extensions used to specify the binding. If you would like to change the binding (to use soap12 for example) set this value to "http://schemas.xmlsoap.org/wsdl/soap12/". (default: "")|No

[1]: http://www.grails.org/plugin/cxf-client (Grails Cxf Client Plugin)
[2]: https://github.com/Grails-Plugin-Consortium/cxf-client]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Client 1.2.9 Released]]></title>
    <link href="http://www.christianoestreich.com/2012/03/grails-cxf-client-soap-exceptions/"/>
    <updated>2012-03-01T12:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/03/grails-cxf-client-soap-exceptions</id>
    <content type="html"><![CDATA[<p>The <a href="http://www.grails.org/plugin/cxf-client" title="Grails Cxf Client Plugin">Grails cxf-client plugin</a> has been updated to version 1.2.9.  When I first deployed the plugin I overlooked allowing checked exceptions and soap faults to bubble out of the client proxy appropriately.  I modified the plugin to allow this now.  In addition I added a configuration parameter for proxyFactoryBindingId to allow soap 1.2 (set to &ldquo;<a href="http://schemas.xmlsoap.org/wsdl/soap12/">http://schemas.xmlsoap.org/wsdl/soap12/</a>&rdquo;).</p>

<h4>Updated Parameter Documentation</h4>

<p>The following partial documentation is available in full at <a href="https://github.com/Grails-Plugin-Consortium/grails-cxf-client">https://github.com/Grails-Plugin-Consortium/grails-cxf-client</a></p>

<table>
<thead>
<tr>
<th align="left">Property</th>
<th align="left">Description</th>
<th align="left">Required</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">proxyFactoryBindingId</td>
<td align="left">The URI, or ID, of the message binding for the endpoint to use. For SOAP the binding URI(ID) is specified by the JAX-WS specification. For other message bindings the URI is the namespace of the WSDL extensions used to specify the binding. If you would like to change the binding (to use soap12 for example) set this value to &ldquo;<a href="http://schemas.xmlsoap.org/wsdl/soap12/">http://schemas.xmlsoap.org/wsdl/soap12/</a>&rdquo;. (default: &ldquo;&rdquo;)</td>
<td align="left">No</td>
</tr>
</tbody>
</table>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Docs Helper Script]]></title>
    <link href="http://www.christianoestreich.com/2012/02/grails-script-docs-helper/"/>
    <updated>2012-02-24T15:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/02/grails-script-docs-helper</id>
    <content type="html"><![CDATA[<p>I am creating a hello world grails project for internal use here at our company.  The project encapsulates both the source code and the documentation in gdoc format.  When a new user comes onboard, they get the project from the source repository and then run the <code>grails doc</code> target to generate the guide locally with a tutorial on building a simple application.  In the project I have already included a full test suite that should pass when the tutorial is completed.</p>

<p>I needed a way to have my version control ignored domain, service, and controllers that I was using be added in a way that kept them out of the base grails-app directory so the user could generate them.  At the same time I really wanted to put a link to what the finished classes would look like in the docs somewhere to help users along during the process if needed.  During this process I only wanted to have one master file and not have to maintain the code blocks in the gdoc files separately from actual code.</p>

<!-- more -->


<h4>Background</h4>

<p>As I wrote the hello world tutorial I was in effect writting a simple application at the same time.  As I want the user to create all their own artifacts, I added them to my ignore list in version control.  This worked great and allowed me to build the docs and grab snippets of code for the gdoc and still maintain a shell of a project for users to be able to add these artifacts on their own when they followed the guide.</p>

<p>Alas, I really didn&rsquo;t want to just throw away these objects I was creating or leave them on my machine only.  I came up with a way for me to have the best of both worlds by using a Grails script that executes a few simple ant tasks.  I figured I would backup the files into another directory that was checked in as well as generate gdocs out of the code directly at the same time.</p>

<h4>Creating A Backup Script</h4>

<p>I created a script in the <code>scripts</code> directory of the project named <code>GenerateDocs.groovy</code> which would allow me to copy the sources (in my case a directory named <code>answers</code> at the project root), generate the gdoc, and run the docs task in one command by invoking the target:</p>

<pre><code>grails generate-docs
</code></pre>

<p>First I added the following block to the code to do the backup and run the grails doc target.</p>

<figure class='code'><figcaption><span>GenerateDocs.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>
<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='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;_GrailsDocs&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">main:</span> <span class="s2">&quot;Copy controllers, services, domain and views from svn excluded grails-app dirs to the answers dir and create gdoc from them in ref sidebar&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">//make sure they all compile</span>
</span><span class='line'>    <span class="n">depends</span><span class="o">(</span><span class="n">compile</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//closure to include or exclude certain file types</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">filesetToInclude</span> <span class="o">=</span> <span class="o">{</span><span class="n">directory</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="n">fileset</span><span class="o">(</span><span class="nl">dir:</span> <span class="n">directory</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">include</span><span class="o">(</span><span class="nl">name:</span> <span class="s1">&#39;**/*.groovy&#39;</span><span class="o">)</span>
</span><span class='line'>            <span class="n">include</span><span class="o">(</span><span class="nl">name:</span> <span class="s1">&#39;**/*.gsp&#39;</span><span class="o">)</span>
</span><span class='line'>            <span class="n">include</span><span class="o">(</span><span class="nl">name:</span> <span class="s1">&#39;**/*.xml&#39;</span><span class="o">)</span>
</span><span class='line'>            <span class="n">include</span><span class="o">(</span><span class="nl">name:</span> <span class="s1">&#39;**/*.properties&#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><span class='line'>    <span class="kt">def</span> <span class="n">initCopyDirs</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;grails-app/controllers&#39;</span><span class="o">,</span> <span class="s1">&#39;grails-app/domain&#39;</span><span class="o">,</span> <span class="s1">&#39;grails-app/services&#39;</span><span class="o">,</span> <span class="s1">&#39;grails-app/views&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">ant</span><span class="o">.</span><span class="na">sequential</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">//add the conf dir for now</span>
</span><span class='line'>        <span class="o">(</span><span class="n">initCopyDirs</span> <span class="o">+</span> <span class="o">[</span><span class="s1">&#39;grails-app/conf&#39;</span><span class="o">]).</span><span class="na">each</span> <span class="o">{</span> <span class="n">directory</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="n">println</span> <span class="s2">&quot;copying $directory to answers/$directory&quot;</span>
</span><span class='line'>            <span class="n">copy</span><span class="o">(</span><span class="nl">todir:</span> <span class="s2">&quot;answers/${directory}&quot;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">filesetToInclude</span><span class="o">(</span><span class="n">directory</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">println</span> <span class="s2">&quot;completed copying files&quot;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">depends</span><span class="o">(</span><span class="n">docs</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">main</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This would take all the directories in my app that matched the path in the list initCopyDirs and copy then into the answers directory with identical pathing relative to grails-app.  I also only wanted to copy a subset of the files so I used the fileset include parameter to limit the files I copy.  I then added all the files under the answers directory into version control for safe keeping knowing if and when they changed in the original grails-app directory my script would overwrite these backups and they would be added for update in my next commit.  If I created any new files they would have to be manually added to version control.  Not really all that exciting but at least now I would know that my source code wasn&rsquo;t going to disappear since it was being ignored.</p>

<h4>Creating Answers From Code</h4>

<p>I wanted to take all the same files we were backing up and create a viewable code item on the Quick Reference sidebar.  To accomplish this I had to transform the .groovy files into .gdoc files and put them into the <code>src/docs/ref/Answers</code> directory.  I added the following ant build task to my script above to accomplish that:</p>

<figure class='code'><figcaption><span>GenerateDocs.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="n">initCopyDirs</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span> <span class="n">directory</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="n">ant</span><span class="o">.</span><span class="na">fileScanner</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">filesetToInclude</span><span class="o">(</span><span class="n">directory</span><span class="o">)</span>
</span><span class='line'>    <span class="o">}.</span><span class="na">each</span> <span class="o">{</span><span class="n">File</span> <span class="n">file</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="n">println</span> <span class="s2">&quot;wrapping file ${file.name}&quot;</span>
</span><span class='line'>        <span class="n">echo</span><span class="o">(</span><span class="nl">file:</span> <span class="s2">&quot;src/docs/ref/Answers/${file.name}.gdoc&quot;</span><span class="o">,</span> <span class="s2">&quot;&quot;&quot;</span>
</span><span class='line'><span class="s2">            {code}</span>
</span><span class='line'><span class="s2">                ${file.getText()}</span>
</span><span class='line'><span class="s2">            {code}</span>
</span><span class='line'><span class="s2">        &quot;&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>What that code block accomplishes is to create a gdoc file for all matched files with the file&rsquo;s contents wrapped in <code>{code}</code> blocks.  For example it would take a Person.groovy file in the grails-app/domain directory and copy it answers/grails-app/domain an then create a file at src/docs/ref/Ansers/Person.groovy.gdoc with the following code snippet:</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="o">{</span><span class="n">code</span><span class="o">}</span>
</span><span class='line'><span class="kn">package</span> <span class="n">grails</span><span class="o">.</span><span class="na">hello</span><span class="o">.</span><span class="na">world</span>
</span><span class='line'>
</span><span class='line'><span class="kd">class</span> <span class="nc">Person</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">String</span> <span class="n">name</span>
</span><span class='line'>    <span class="n">Integer</span> <span class="n">age</span>
</span><span class='line'>    <span class="n">Date</span> <span class="n">createdDate</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">name</span><span class="o">(</span><span class="nl">nullable:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">blank:</span> <span class="kc">false</span><span class="o">)</span>
</span><span class='line'>        <span class="n">age</span><span class="o">(</span><span class="nl">nullable:</span> <span class="kc">false</span><span class="o">,</span> <span class="nl">range:</span> <span class="mi">0</span><span class="o">..</span><span class="mi">150</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="n">code</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That would show up in the generated doc pages as the following:</p>

<p><img src="http://www.christianoestreich.com/images/docs/script.jpg"></p>

<h4>The Whole Script</h4>

<div><script src='https://gist.github.com/1902796.js?file=GenerateDocs.groovy'></script>
<noscript><pre><code>includeTargets &lt;&lt; grailsScript(&quot;_GrailsDocs&quot;)

target(main: &quot;Copy controllers, services, domain and views from svn excluded grails-app dirs to the answers dir and create gdoc from them in ref sidebar&quot;) {
    //make sure they all compile
    depends(compile)

    //closure to include or exclude certain file types
    def filesetToInclude = {directory -&gt;
        fileset(dir: directory) {
            include(name: '**/*.groovy')
            include(name: '**/*.gsp')
            include(name: '**/*.xml')
            include(name: '**/*.properties')
        }
    }

    def initCopyDirs = ['grails-app/controllers', 'grails-app/domain', 'grails-app/services', 'grails-app/views']

    ant.sequential {
        //add the conf dir for now
        (initCopyDirs + ['grails-app/conf']).each { directory -&gt;
            println &quot;copying $directory to answers/$directory&quot;
            copy(todir: &quot;answers/${directory}&quot;) {
                filesetToInclude(directory)
            }
        }
        println &quot;completed copying files&quot;
    }

    initCopyDirs.each { directory -&gt;
        ant.fileScanner {
            filesetToInclude(directory)
        }.each {File file -&gt;
            println &quot;wrapping file ${file.name}&quot;
            echo(file: &quot;src/docs/ref/Answers/${file.name}.gdoc&quot;, &quot;&quot;&quot;
                {code}
                    ${file.getText()}
                {code}
            &quot;&quot;&quot;)
        }
    }

    depends(docs)
}

setDefaultTarget(main)
</code></pre></noscript></div>


<h4>Conclusion</h4>

<p>Maybe this will be useful for you in some or all of it&rsquo;s entirety in the future!?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Client 1.2.7 Released]]></title>
    <link href="http://www.christianoestreich.com/2012/02/grails-cxf-client-http-client-policy.markdown/"/>
    <updated>2012-02-15T15:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/02/grails-cxf-client-http-client-policy.markdown</id>
    <content type="html"><![CDATA[The [Grails cxf-client plugin][1] has been updated to version 1.2.7.  I have added the ability to specify timeouts (connection and receive) and allow chunking separately through params and also provided another parameter to pass the client name of an HTTPClientPolicy bean to use instead of setting the params seperately.

<!-- more -->

#### Updated Parameter Documentation ####

The following partial documentation is available in full at [https://github.com/Grails-Plugin-Consortium/cxf-client][2]

Property|Description|Required
:&#8212;&#8212;&#8212;&#8211;|:&#8212;&#8212;&#8212;&#8212;|:&#8212;&#8212;&#8212;&#8212;
connectionTimeout|Specifies the amount of time, in milliseconds, that the client will attempt to establish a connection before it times out. The default is 30000 (30 seconds). 0 specifies that the client will continue to attempt to open a connection indefinitely. (default: 30000)|No
receiveTimeout|Specifies the amount of time, in milliseconds, that the client will wait for a response before it times out. The default is 60000. 0 specifies that the client will wait indefinitely. (default: 60000)|No
allowChunking|If true will set the HTTPClientPolicy allowChunking for the clients proxy to true. (default: false)|No
httpClientPolicy|Instead of using the seperate timeout, chunking, etc values you can create your own HTTPClientPolicy bean in resources.groovy and pass the name of the bean here. <B>This will override the connectionTimeout, receiveTimeout and allowChunking values.</b> (default: null)|No
 
 
#### Timeout And Chunking Parameters ####

Here is an example cxf client configuration block using the connectionTimeout, receiveTimeout and allowChunking parameters:

<figure class='code'><figcaption><span>Config.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">cxf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">installDir</span> <span class="o">=</span> <span class="s2">&quot;C:/apps/apache-cxf-2.4.2&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>    <span class="n">client</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">simpleServiceClient</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">wsdl</span> <span class="o">=</span> <span class="s2">&quot;docs/SimpleService.wsdl&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>            <span class="n">wsdlArgs</span> <span class="o">=</span> <span class="s2">&quot;-autoNameResolution&quot;</span>
</span><span class='line'>            <span class="n">clientInterface</span> <span class="o">=</span> <span class="n">cxf</span><span class="o">.</span><span class="na">client</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">simple</span><span class="o">.</span><span class="na">SimpleServicePortType</span>
</span><span class='line'>            <span class="n">serviceEndpointAddress</span> <span class="o">=</span> <span class="s2">&quot;${service.simple.url}&quot;</span>
</span><span class='line'>            <span class="n">namespace</span> <span class="o">=</span> <span class="s2">&quot;cxf.client.demo.simple&quot;</span>
</span><span class='line'>            <span class="n">receiveTimeout</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">//no timeout</span>
</span><span class='line'>            <span class="n">connectionTimeout</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">//no timeout</span>
</span><span class='line'>            <span class="n">allowChunking</span> <span class="o">=</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></code></pre></td></tr></table></div></figure>

#### HTTPClientPolicy Parameter ####

Here is an example cxf client configuration block using the httpClientPolicy config parameter:

<figure class='code'><figcaption><span>resources.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">beans</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">customHttpClientPolicy</span><span class="o">(</span><span class="n">HTTPClientPolicy</span><span class="o">){</span>
</span><span class='line'>        <span class="n">connectionTimeout</span> <span class="o">=</span> <span class="mi">30000</span>
</span><span class='line'>        <span class="n">receiveTimeout</span> <span class="o">=</span> <span class="mi">60000</span>
</span><span class='line'>        <span class="n">allowChunking</span> <span class="o">=</span> <span class="kc">false</span>
</span><span class='line'>        <span class="n">autoRedirect</span> <span class="o">=</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>

<figure class='code'><figcaption><span>Config.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">cxf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">installDir</span> <span class="o">=</span> <span class="s2">&quot;C:/apps/apache-cxf-2.4.2&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>    <span class="n">client</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">simpleServiceClient</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">clientInterface</span> <span class="o">=</span> <span class="n">cxf</span><span class="o">.</span><span class="na">client</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">simple</span><span class="o">.</span><span class="na">SimpleServicePortType</span>
</span><span class='line'>            <span class="n">serviceEndpointAddress</span> <span class="o">=</span> <span class="s2">&quot;${service.simple.url}&quot;</span>
</span><span class='line'>            <span class="n">httpClientPolicy</span> <span class="o">=</span> <span class="s1">&#39;customHttpClientPolicy&#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>

   [1]: http://www.grails.org/plugin/cxf-client (Grails Cxf Client Plugin)

   [2]: https://github.com/Grails-Plugin-Consortium/cxf-client]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Client 1.2.7 Released]]></title>
    <link href="http://www.christianoestreich.com/2012/02/grails-cxf-client-http-client-policy/"/>
    <updated>2012-02-15T15:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/02/grails-cxf-client-http-client-policy</id>
    <content type="html"><![CDATA[<p>The <a href="http://www.grails.org/plugin/cxf-client" title="Grails Cxf Client Plugin">Grails cxf-client plugin</a> has been updated to version 1.2.7.  I have added the ability to specify timeouts (connection and receive) and allow chunking separately through params and also provided another parameter to pass the client name of an HTTPClientPolicy bean to use instead of setting the params seperately.</p>

<!-- more -->


<h4>Updated Parameter Documentation</h4>

<p>The following partial documentation is available in full at <a href="https://github.com/Grails-Plugin-Consortium/grails-cxf-client">https://github.com/Grails-Plugin-Consortium/grails-cxf-client</a></p>

<table>
<thead>
<tr>
<th align="left">Property</th>
<th align="left">Description</th>
<th align="left">Required</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">connectionTimeout</td>
<td align="left">Specifies the amount of time, in milliseconds, that the client will attempt to establish a connection before it times out. The default is 30000 (30 seconds). 0 specifies that the client will continue to attempt to open a connection indefinitely. (default: 30000)</td>
<td align="left">No</td>
</tr>
<tr>
<td align="left">receiveTimeout</td>
<td align="left">Specifies the amount of time, in milliseconds, that the client will wait for a response before it times out. The default is 60000. 0 specifies that the client will wait indefinitely. (default: 60000)</td>
<td align="left">No</td>
</tr>
<tr>
<td align="left">allowChunking</td>
<td align="left">If true will set the HTTPClientPolicy allowChunking for the clients proxy to true. (default: false)</td>
<td align="left">No</td>
</tr>
<tr>
<td align="left">httpClientPolicy</td>
<td align="left">Instead of using the seperate timeout, chunking, etc values you can create your own HTTPClientPolicy bean in resources.groovy and pass the name of the bean here. <B>This will override the connectionTimeout, receiveTimeout and allowChunking values.</b> (default: null)</td>
<td align="left">No</td>
</tr>
</tbody>
</table>


<h4>Timeout And Chunking Parameters</h4>

<p>Here is an example cxf client configuration block using the connectionTimeout, receiveTimeout and allowChunking parameters:</p>

<figure class='code'><figcaption><span>Config.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">cxf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">installDir</span> <span class="o">=</span> <span class="s2">&quot;C:/apps/apache-cxf-2.4.2&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>    <span class="n">client</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">simpleServiceClient</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">wsdl</span> <span class="o">=</span> <span class="s2">&quot;docs/SimpleService.wsdl&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>            <span class="n">wsdlArgs</span> <span class="o">=</span> <span class="s2">&quot;-autoNameResolution&quot;</span>
</span><span class='line'>            <span class="n">clientInterface</span> <span class="o">=</span> <span class="n">cxf</span><span class="o">.</span><span class="na">client</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">simple</span><span class="o">.</span><span class="na">SimpleServicePortType</span>
</span><span class='line'>            <span class="n">serviceEndpointAddress</span> <span class="o">=</span> <span class="s2">&quot;${service.simple.url}&quot;</span>
</span><span class='line'>            <span class="n">namespace</span> <span class="o">=</span> <span class="s2">&quot;cxf.client.demo.simple&quot;</span>
</span><span class='line'>            <span class="n">receiveTimeout</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">//no timeout</span>
</span><span class='line'>            <span class="n">connectionTimeout</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">//no timeout</span>
</span><span class='line'>            <span class="n">allowChunking</span> <span class="o">=</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></code></pre></td></tr></table></div></figure>


<h4>HTTPClientPolicy Parameter</h4>

<p>Here is an example cxf client configuration block using the httpClientPolicy config parameter:</p>

<figure class='code'><figcaption><span>resources.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">beans</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">customHttpClientPolicy</span><span class="o">(</span><span class="n">HTTPClientPolicy</span><span class="o">){</span>
</span><span class='line'>        <span class="n">connectionTimeout</span> <span class="o">=</span> <span class="mi">30000</span>
</span><span class='line'>        <span class="n">receiveTimeout</span> <span class="o">=</span> <span class="mi">60000</span>
</span><span class='line'>        <span class="n">allowChunking</span> <span class="o">=</span> <span class="kc">false</span>
</span><span class='line'>        <span class="n">autoRedirect</span> <span class="o">=</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>




<figure class='code'><figcaption><span>Config.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">cxf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">installDir</span> <span class="o">=</span> <span class="s2">&quot;C:/apps/apache-cxf-2.4.2&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>    <span class="n">client</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">simpleServiceClient</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">clientInterface</span> <span class="o">=</span> <span class="n">cxf</span><span class="o">.</span><span class="na">client</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">simple</span><span class="o">.</span><span class="na">SimpleServicePortType</span>
</span><span class='line'>            <span class="n">serviceEndpointAddress</span> <span class="o">=</span> <span class="s2">&quot;${service.simple.url}&quot;</span>
</span><span class='line'>            <span class="n">httpClientPolicy</span> <span class="o">=</span> <span class="s1">&#39;customHttpClientPolicy&#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>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Redis Plugin Memoization Annotation Transformation (A Retrospective on Groovy AST)]]></title>
    <link href="http://www.christianoestreich.com/2012/02/groovy-ast-transformations-part-1/"/>
    <updated>2012-02-03T17:00:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/02/groovy-ast-transformations-part-1</id>
    <content type="html"><![CDATA[<p>Recently while developing a prototype application for performance testing using <a href="http://www.grails.org/plugin/redis" title="Redis Plugin">redis</a> and <a href="http://www.grails.org/plugin/jesque" title="Jesque Plugin">jesque</a> (see <a href="http://www.christianoestreich.com/2012/02/grails-performance-framework/" title="My Blog">post</a>) I got to thinking &ldquo;why doesn&rsquo;t the grails redis plugin currently have support for annotation based memoization like spring cache?&rdquo;  I figured I would set out to add that support and learn to write <a href="http://groovy.codehaus.org/Compile-time+Metaprogramming+-+AST+Transformations" title="Groovy AST">Groovy AST Transformations</a> at the same time.  The process was long and arduous and I learned a lot during my several weeks of coding.</p>

<!-- more -->


<h2>First Steps</h2>

<p>I started off by reading articles on AST and found many great examples of existing AST transformations, blogs, and tests already written that I could leverage.  Here are some if you are looking for additional resources:</p>

<ul>
<li><a href="https://github.com/grails-plugins/grails-redis/tree/master/src/groovy/grails/plugin/redis" title="Memoization AST Transformation Code">Memoization AST Transformation Source Code</a></li>
<li><a href="http://svn.codehaus.org/groovy/trunk/groovy/groovy-core/src/test/org/codehaus/groovy/ast/builder/AstBuilderFromSpecificationTest.groovy">AST Builder Examples</a></li>
<li><a href="http://grails.io/post/15965611310/lessons-learnt-developing-groovy-ast-transformations">Lessons Learnt Developing Groovy AST Transformations</a></li>
<li><a href="http://groovy.codehaus.org/Local+AST+Transformations">Local AST Transformations</a></li>
<li><a href="http://groovy.codehaus.org/Building+AST+Guide">Building AST Guide</a></li>
<li><a href="http://java.dzone.com/articles/groovy-ast-transformations">Groovy AST Transformations by Example: Adding Methods to Classes</a></li>
<li><a href="http://joesgroovyblog.blogspot.com/2011/10/ast-transformation-using-astbuilder.html">AST Transformations: Creating a Complex AST Transformation</a></li>
<li><a href="http://joesgroovyblog.blogspot.com/2011/09/ast-transformations-compiler-phases-and.html">AST Transformations: Compiler Phases and Syntax Trees</a></li>
<li><a href="http://joesgroovyblog.blogspot.com/2011/09/ast-transformations-transformation.html">AST Transformations: The transformation itself</a></li>
<li><a href="http://blog.andresteingress.com/2010/06/18/unit-testing-groovy-ast-transformations/">Unit Testing AST</a></li>
</ul>


<p>There are a lot more out there in the world and you can find plenty <a href="http://lmgtfy.com/?q=groovy+ast">here</a>.</p>

<h2>The End Goal</h2>

<p>The end goal was pretty simple; to transform an annotated method like the first below during compile time into something that looked like the second method below at runtime.  Using an annotation with a key, expire, etc. and injecting code that would wrap all the method contents into a call to an appropriate redisService.memoize method.  I would then create memoize annotations for each type of memoize to be performed (domain, list, hash, set, etc).</p>

<p>Turn this:</p>

<figure class='code'><figcaption><span></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">@Memoize</span><span class="o">(</span><span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;#{text}&#39;</span><span class="o">)</span>
</span><span class='line'><span class="kt">def</span> <span class="nf">method</span><span class="o">(</span><span class="n">String</span> <span class="n">text</span><span class="o">,</span> <span class="n">Date</span> <span class="n">date</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s2">&quot;$text $date&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Into this:</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kt">def</span> <span class="nf">method</span><span class="o">(</span><span class="n">String</span> <span class="n">text</span><span class="o">,</span> <span class="n">Date</span> <span class="n">date</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">redisService</span><span class="o">.</span><span class="na">memoize</span><span class="o">(</span><span class="n">text</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;$text $date&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>


<h2>Start Coding &ndash; Issue 1</h2>

<p>Getting started was easy.  I created the annotation class Memoize.groovy and the actual transformation MemoizeASTTransformation.groovy as follows:</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@Retention</span><span class="o">(</span><span class="n">RetentionPolicy</span><span class="o">.</span><span class="na">SOURCE</span><span class="o">)</span>
</span><span class='line'><span class="nd">@Target</span><span class="o">([</span><span class="n">ElementType</span><span class="o">.</span><span class="na">METHOD</span><span class="o">])</span>
</span><span class='line'><span class="nd">@GroovyASTTransformationClass</span><span class="o">([</span><span class="s1">&#39;grails.plugin.redis.ast.MemoizeASTTransformation&#39;</span><span class="o">])</span>
</span><span class='line'><span class="nd">@interface</span> <span class="n">Memoize</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Class</span> <span class="nf">value</span><span class="o">()</span> <span class="k">default</span> <span class="o">{</span><span class="kc">true</span><span class="o">};</span>
</span><span class='line'>    <span class="n">String</span> <span class="nf">key</span><span class="o">()</span> <span class="k">default</span> <span class="s1">&#39;&#39;</span><span class="o">;</span>
</span><span class='line'>    <span class="n">String</span> <span class="nf">expire</span><span class="o">()</span> <span class="k">default</span> <span class="s1">&#39;&#39;</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@GroovyASTTransformation</span><span class="o">(</span><span class="n">phase</span> <span class="o">=</span> <span class="n">CompilePhase</span><span class="o">.</span><span class="na">CANONICALIZATION</span><span class="o">)</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">MemoizeASTTransformation</span> <span class="kd">implements</span> <span class="n">ASTTransformation</span> <span class="o">{</span>
</span><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">astNodes</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="n">println</span> <span class="s1">&#39;in transformation&#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>Easy enough right?!  When trying to decorate a service method in the project with the <code>@Memoize</code> method I ran into my first big hurdle&hellip; it didn&rsquo;t work.  I scratched my head for a long time.  Errors during compile?  No.  Printing &lsquo;in transformation&rsquo; during compile?  No.</p>

<p>I will cut to the chase and give you the solution to this issue.  Having another project using the AST annotations that pointed to the grails-redis plugin (AST annotation source) inline fixed this issue.  Why? Well it appears that the AST Transformation classes themselves are compiled along with everything else so during the actual <code>CompilePhase.CANONICALIZATION</code> there are no ASTs available to apply yet since they aren&rsquo;t compiled.  When a project was consuming the source as a plugin, it would compile the plugin code first and then compile the new project and the correct statement would print out.  I am not sure if I was doing something wrong or if there is another way around this, but for me this solution worked like a charm.</p>

<h2>Write More Code &ndash; Issue 2</h2>

<p>I was able to move beyond those issues and start adding a bunch of code to the MemoizeASTTransformation.groovy class.  Everything was humming along nicely.  On a side note, I did have a bit of a hard time deciding between using the AstBuilder or the more verbose statements and expressions to build up the code and opted for the more verbose usage of the direct <em>Statements and </em>Expressions.</p>

<p>I had built up a fair amount of AST code that seemed to be working as expected until it came time to create the method closure to hand to the redisService.  If we look at the redis service method definition we can see that it takes a closure as the code to execute if the key isn&rsquo;t found.</p>

<figure class='code'><figcaption><span></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="kt">def</span> <span class="nf">memoize</span><span class="o">(</span><span class="n">String</span> <span class="n">key</span><span class="o">,</span> <span class="n">Map</span> <span class="n">options</span> <span class="o">=</span> <span class="o">[:],</span> <span class="n">Closure</span> <span class="n">closure</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is a very convenient <code>ClosureExpression</code> available in the code to create a closure block of code and it&rsquo;s usage is rather simple.   The following two blocks of code attempts to create the arguments for the memoize method, including the closure, and wrap the existing method code of the annocated method in the closure.  There is a lot to the code here that I am not covering, but I don&rsquo;t want to dumb down the code too much in explaining the issue so I can try and help you avoid it.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">protected</span> <span class="kt">void</span> <span class="nf">addRedisServiceMemoizeInvocation</span><span class="o">(</span><span class="n">BlockStatement</span> <span class="n">body</span><span class="o">,</span> <span class="n">MethodNode</span> <span class="n">methodNode</span><span class="o">,</span> <span class="n">Map</span> <span class="n">memoizeProperties</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">ArgumentListExpression</span> <span class="n">argumentListExpression</span> <span class="o">=</span> <span class="n">makeRedisServiceArgumentListExpression</span><span class="o">(</span><span class="n">memoizeProperties</span><span class="o">)</span>
</span><span class='line'>    <span class="n">argumentListExpression</span><span class="o">.</span><span class="na">addExpression</span><span class="o">(</span><span class="n">makeClosureExpression</span><span class="o">(</span><span class="n">methodNode</span><span class="o">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">body</span><span class="o">.</span><span class="na">addStatement</span><span class="o">(</span>
</span><span class='line'>            <span class="k">new</span> <span class="nf">ReturnStatement</span><span class="o">(</span>
</span><span class='line'>                    <span class="k">new</span> <span class="nf">MethodCallExpression</span><span class="o">(</span>
</span><span class='line'>                            <span class="k">new</span> <span class="nf">VariableExpression</span><span class="o">(</span><span class="s1">&#39;redisService&#39;</span><span class="o">),</span>
</span><span class='line'>                            <span class="k">new</span> <span class="nf">ConstantExpression</span><span class="o">(</span><span class="s1">&#39;memoize&#39;</span><span class="o">),</span>
</span><span class='line'>                            <span class="n">argumentListExpression</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">protected</span> <span class="n">ClosureExpression</span> <span class="nf">makeClosureExpression</span><span class="o">(</span><span class="n">MethodNode</span> <span class="n">methodNode</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">ClosureExpression</span> <span class="n">closureExpression</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ClosureExpression</span><span class="o">(</span>
</span><span class='line'>            <span class="o">[]</span> <span class="k">as</span> <span class="n">Parameter</span><span class="o">[],</span>
</span><span class='line'>            <span class="k">new</span> <span class="nf">BlockStatement</span><span class="o">(</span><span class="n">methodNode</span><span class="o">.</span><span class="na">code</span><span class="o">.</span><span class="na">statements</span> <span class="k">as</span> <span class="n">Statement</span><span class="o">[],</span> <span class="k">new</span> <span class="n">VariableScope</span><span class="o">())</span>
</span><span class='line'>    <span class="o">)</span>
</span><span class='line'>    <span class="n">closureExpression</span><span class="o">.</span><span class="na">variableScope</span> <span class="o">=</span> <span class="k">new</span> <span class="n">VariableScope</span><span class="o">()</span>
</span><span class='line'>    <span class="n">closureExpression</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code failed and failed and failed to run (but did compile) in many different rewrites.  It usually errored at runtime telling me that some variables I referenced in the parent method like $text was not in scope in the closure.  I figured from some earlier troubles with VariableScopes that It was something to do with how the variable scopes were inherited.  I could also see a drastic difference in the decompiled code using <a href="http://java.decompiler.free.fr/?q=jdgui" title="JD-GUI">JD-GUI</a> in that the closure created didn&rsquo;t pass into themselves the variables used inside the actual method call.</p>

<p>Again to save headache I discovered, through a miracle I think, the following code:</p>

<figure class='code'><figcaption><span></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="n">VariableScopeVisitor</span> <span class="n">scopeVisitor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">VariableScopeVisitor</span><span class="o">(</span><span class="n">sourceUnit</span><span class="o">);</span>
</span><span class='line'><span class="n">sourceUnit</span><span class="o">.</span><span class="na">AST</span><span class="o">.</span><span class="na">classes</span><span class="o">.</span><span class="na">each</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">scopeVisitor</span><span class="o">.</span><span class="na">visitClass</span><span class="o">(</span><span class="n">it</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Running this at the end of the main visit method caused all the variable scopes to be correct propagated down to the newly created objects I was using, including the ClosureExpression.</p>

<ul>
<li><a href="http://groovy.codehaus.org/api/org/codehaus/groovy/classgen/VariableScopeVisitor.html">API Docs</a></li>
<li><a href="http://www.devdaily.com/java/jwarehouse/groovy/src/main/org/codehaus/groovy/tools/javac/JavaAwareCompilationUnit.java.shtml">Sample Usage</a></li>
</ul>


<p>Having inspected the source, I can best describe what it does as <em>aligning the correct variable scope inheritance in your class</em>.  There is an explicit visitClosureExpression method that does the magic and injects the scoped variables into the closure.  Following code that uses the visitor pattern is a bit tedious at times, but that is the best I can surmise from digging through that code.  Here is a snippet from the VariableScopeVisitor.java class:</p>

<figure class='code'><figcaption><span></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>
<span class='line-number'>25</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">visitClosureExpression</span><span class="o">(</span><span class="n">ClosureExpression</span> <span class="n">expression</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">pushState</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">expression</span><span class="o">.</span><span class="na">setVariableScope</span><span class="o">(</span><span class="n">currentScope</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">expression</span><span class="o">.</span><span class="na">isParameterSpecified</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">Parameter</span><span class="o">[]</span> <span class="n">parameters</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="na">getParameters</span><span class="o">();</span>
</span><span class='line'>        <span class="k">for</span> <span class="o">(</span><span class="n">Parameter</span> <span class="n">parameter</span> <span class="o">:</span> <span class="n">parameters</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">parameter</span><span class="o">.</span><span class="na">setInStaticContext</span><span class="o">(</span><span class="n">currentScope</span><span class="o">.</span><span class="na">isInStaticContext</span><span class="o">());</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">parameter</span><span class="o">.</span><span class="na">hasInitialExpression</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">parameter</span><span class="o">.</span><span class="na">getInitialExpression</span><span class="o">().</span><span class="na">visit</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">declare</span><span class="o">(</span><span class="n">parameter</span><span class="o">,</span> <span class="n">expression</span><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">expression</span><span class="o">.</span><span class="na">getParameters</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">Parameter</span> <span class="n">var</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Parameter</span><span class="o">(</span><span class="n">ClassHelper</span><span class="o">.</span><span class="na">OBJECT_TYPE</span><span class="o">,</span> <span class="s">&quot;it&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">var</span><span class="o">.</span><span class="na">setInStaticContext</span><span class="o">(</span><span class="n">currentScope</span><span class="o">.</span><span class="na">isInStaticContext</span><span class="o">());</span>
</span><span class='line'>        <span class="n">currentScope</span><span class="o">.</span><span class="na">putDeclaredVariable</span><span class="o">(</span><span class="n">var</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">super</span><span class="o">.</span><span class="na">visitClosureExpression</span><span class="o">(</span><span class="n">expression</span><span class="o">);</span>
</span><span class='line'>    <span class="n">markClosureSharedVariables</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">popState</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I believe it is the line:</p>

<pre><code>declare(parameter, expression);
</code></pre>

<p>which appears to do a lot of the magic in defining and adding the variables to the scope.  The <code>declare</code> method ultimately calls</p>

<pre><code>currentScope.putDeclaredVariable(var);
</code></pre>

<p>for each variable in the <em>n &ndash; 1</em> scope, in our case the parent of the closure.</p>

<p>This relatively short issue and code solution took a big chunk of my free time in December and early January.  Time I can only hope to save someone else in the future when doing this type of closure wrapping transformation.</p>

<h2>It Works&hellip; Almost &ndash; Issue 3</h2>

<p>When defining a key property string in the annotation the use of the <code>$</code> character is not allowed as that will reference an ACTUAL GString at compile time.  We want the value to represent a GString to get interpreted at runtime.  I opted to have the users provide variables in the format <code>#{var}</code> leveraging the <code>#</code> sign as a replacement for the <code>$</code> character.</p>

<p>With that issue resolved it was time to tackle passing the <em>GString variable</em> into the annotation closure as the memoization key.  That went awry very quickly as using a GString gets a little tricky when a user is passing in compound GStrings.  Representing the key as an expression <code>$variable</code> might be easy, but using something like <code>${key}:string${key2.prop}:value2</code> was proving to be hard as you would have to split and iterate all the GStrings vs non-GStrings in that statement.</p>

<p>The following is some sample code from the codehaus AST builder tests illustrating the typical usage of a GStringExpression in both builder and regular code.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">public</span> <span class="kt">void</span> <span class="nf">testGStringExpression</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c1">// &quot;$foo&quot;</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AstBuilder</span><span class="o">().</span><span class="na">buildFromSpec</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">gString</span> <span class="s1">&#39;$foo astring $bar&#39;</span><span class="o">,</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">strings</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">constant</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>                <span class="n">constant</span> <span class="s1">&#39; astring &#39;</span>
</span><span class='line'>                <span class="n">constant</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>            <span class="n">values</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">variable</span> <span class="s1">&#39;foo&#39;</span>
</span><span class='line'>                <span class="n">variable</span> <span class="s1">&#39;bar&#39;</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="kt">def</span> <span class="n">expected</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GStringExpression</span><span class="o">(</span><span class="s1">&#39;$foo astring $bar&#39;</span><span class="o">,</span>
</span><span class='line'>            <span class="o">[</span><span class="k">new</span> <span class="n">ConstantExpression</span><span class="o">(</span><span class="s1">&#39;&#39;</span><span class="o">),</span> <span class="k">new</span> <span class="n">ConstantExpression</span><span class="o">(</span><span class="s1">&#39; astring &#39;</span><span class="o">),</span> <span class="k">new</span> <span class="n">ConstantExpression</span><span class="o">(</span><span class="s1">&#39;&#39;</span><span class="o">)],</span>
</span><span class='line'>            <span class="o">[</span><span class="k">new</span> <span class="n">VariableExpression</span><span class="o">(</span><span class="s1">&#39;foo&#39;</span><span class="o">),</span> <span class="k">new</span> <span class="n">VariableExpression</span><span class="o">(</span><span class="s1">&#39;bar&#39;</span><span class="o">)])</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="n">AstAssert</span><span class="o">.</span><span class="na">assertSyntaxTree</span><span class="o">([</span><span class="n">expected</span><span class="o">],</span> <span class="n">result</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I went down the path of trying to parse the user provided string into a meaningful GStringExpression with little to no luck using complex/compound strings.</p>

<p>I figured if I could combine the <code>AstBuilder.buildFromString{}</code> method I might be able to use the statement(s) it generated and inject them into the code while letting the AstBuilder do the work in creating the GStringExpression.  After some tweaking, this is what I came up with, and it worked!</p>

<figure class='code'><figcaption><span></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="kd">protected</span> <span class="kt">void</span> <span class="nf">addRedisServiceMemoizeKeyExpression</span><span class="o">(</span><span class="n">Map</span> <span class="n">memoizeProperties</span><span class="o">,</span> <span class="n">ArgumentListExpression</span> <span class="n">argumentListExpression</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">memoizeProperties</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s1">&#39;key&#39;</span><span class="o">).</span><span class="na">toString</span><span class="o">().</span><span class="na">contains</span><span class="o">(</span><span class="s1">&#39;#&#39;</span><span class="o">))</span> <span class="o">{</span>
</span><span class='line'>        <span class="kt">def</span> <span class="n">ast</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AstBuilder</span><span class="o">().</span><span class="na">buildFromString</span><span class="o">(</span><span class="s2">&quot;&quot;&quot;</span>
</span><span class='line'><span class="s2">            &quot;</span><span class="n">$</span><span class="o">{</span><span class="n">memoizeProperties</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s1">&#39;key&#39;</span><span class="o">).</span><span class="na">toString</span><span class="o">().</span><span class="na">replace</span><span class="o">(</span><span class="s1">&#39;#&#39;</span><span class="o">,</span> <span class="s1">&#39;$&#39;</span><span class="o">).</span><span class="na">toString</span><span class="o">()}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="s2">       &quot;&quot;&quot;</span><span class="o">)</span>
</span><span class='line'>        <span class="n">argumentListExpression</span><span class="o">.</span><span class="na">addExpression</span><span class="o">(</span><span class="n">ast</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">statements</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">expression</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">argumentListExpression</span><span class="o">.</span><span class="na">addExpression</span><span class="o">(</span><span class="k">new</span> <span class="n">ConstantExpression</span><span class="o">(</span><span class="n">memoizeProperties</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s1">&#39;key&#39;</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>The real guts of this is in the following statements.</p>

<figure class='code'><figcaption><span></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="kt">def</span> <span class="n">ast</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AstBuilder</span><span class="o">().</span><span class="na">buildFromString</span><span class="o">(</span><span class="s2">&quot;&quot;&quot;</span>
</span><span class='line'><span class="s2">    &quot;</span><span class="n">$</span><span class="o">{</span><span class="n">memoizeProperties</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s1">&#39;key&#39;</span><span class="o">).</span><span class="na">toString</span><span class="o">().</span><span class="na">replace</span><span class="o">(</span><span class="s1">&#39;#&#39;</span><span class="o">,</span> <span class="s1">&#39;$&#39;</span><span class="o">).</span><span class="na">toString</span><span class="o">()}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="s2">&quot;&quot;&quot;</span><span class="o">)</span>
</span><span class='line'><span class="n">argumentListExpression</span><span class="o">.</span><span class="na">addExpression</span><span class="o">(</span><span class="n">ast</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">statements</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">expression</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Combining the expression built from the AstBuilder with the ArgumentListExpression married well together and I was happy that the solution ended up being so simple.  At one point I think the parsing, looping, etc. logic was nearly 100 lines of frustrating and non-working code.</p>

<h2>Up Next</h2>

<p>Next week I will post a more concise list of AST-isms that I feel are important when working with the code and things to be mindful of when coding.  It may end up looking similar to what Graeme posted on <a href="http://grails.io/post/15965611310/lessons-learnt-developing-groovy-ast-transformations">lessons learned</a>.  I think the pain I experienced at least warrants a list of things to do/avoid next time around.  Stay Tuned!</p>

<h2>Code</h2>

<p>The memoization AST transformation code I am referencing here is available at <a href="https://github.com/grails-plugins/grails-redis/tree/master/src/groovy/grails/plugin/redis" title="Memoization AST Transformation Code">github</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Performance Framework]]></title>
    <link href="http://www.christianoestreich.com/2012/02/grails-performance-framework/"/>
    <updated>2012-02-02T14:12:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/02/grails-performance-framework</id>
    <content type="html"><![CDATA[<p>I built a <em>relatively</em> simple framework to do performance testing of code using <a href="http://www.grails.org/plugin/redis" title="Redis Plugin">redis</a>, <a href="http://www.grails.org/plugin/jesque" title="Jesque Plugin">jesque</a> and <a href="http://www.grails.org/plugin/executor" title="Executor Plugin">executor</a>.  It uses some jQuery and ajax on the front end and provides a relatively simple administrative UI.  The code is currently availabe on <a href="https://github.com/ctoestreich/gperf" title="GPERF Framework">github</a>.  The overhead of the perf runner is relatively light and extremely fast as it is using <a href="http://www.grails.org/plugin/redis" title="Redis Plugin">redis</a> as its storage mechanism for queues, jobs, statistics, and status.  If you would like to change where or how the results are saved you could certainly hack the code in the ResultsService.</p>

<!-- more -->


<h2>Update 2/7/12</h2>

<p>I have made some slight changes to the framework and have updated this post and docs to illustrate the changes.  More specifically I have moved the Result interface and Result inheritors into the src/groovy directory as domain object support isn&rsquo;t currently required and was causing a bit of an issue during jsonification.</p>

<h2>Detailed Description</h2>

<p>Using a web admin console, configured jobs can be submitted via ajax to a queue in jesque with a type (workerClass) and number of threads to run.  A jesque worker will then pick up the queued jobs and spawn off a number of worker threads using executor.  These threads will continue to run until the user then stops the job via the admin console.  Stopping the job is essentially flipping an active flag for the job to false in the datastore (<a href="http://www.grails.org/plugin/redis" title="Redis Plugin">redis</a>).  Ther results will be updated near-time on the screen using a custom ajax enabled jQuery widget that polls and aggregates the data from redis.  These operations are extremely fast due to the speed of <a href="http://www.grails.org/plugin/redis" title="Redis Plugin">redis</a>.</p>

<p>The admin console provides the following functionality:</p>

<ul>
<li>View paged resultset of successful &amp; error results per job</li>
<li>List all keys in Redis</li>
<li>Clear all results</li>
<li>Clear all data (Flush Redis Database)</li>
</ul>


<p>See the sequence diagram below for a UML view of how the system operates.</p>

<p><em>There may be a slight delay in the updating of statistics both when starting and stopping the tests as the jQuery widget only updates stats every 5s.</em></p>

<h2>Create A Job</h2>

<p>To create a new performance job simply create a new service in the services/com/perf/runners directory.  I have 3 sample jobs created in the base project.  It is important that you extend the <code>AbstractPerformanceService</code> and implement the <code>performTest</code> method.</p>

<p>The abstract service contains a benchmark method that accepts a closure which you should use to encapsulate the code you wish to time.  The benchmark method will return the time in ms the closure took to execute.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="kd">class</span> <span class="nc">LargeNumberPerformanceService</span> <span class="kd">extends</span> <span class="n">AbstractPerformanceService</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">Result</span> <span class="nf">performTest</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">Long</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>        <span class="kt">def</span> <span class="n">executionTime</span> <span class="o">=</span> <span class="n">benchmark</span> <span class="o">{</span>
</span><span class='line'>            <span class="mi">100000</span><span class="o">.</span><span class="na">times</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">result</span> <span class="o">+=</span> <span class="n">it</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="k">new</span> <span class="nf">SimpleResult</span><span class="o">(</span><span class="nl">testName:</span> <span class="s1">&#39;Long Number Performance Service&#39;</span><span class="o">,</span> <span class="nl">executionTime:</span> <span class="n">executionTime</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>This method performTest must return a Result interface as this will be used to log into the results data cache in redis.  I have two types of results, SimpleResult and ComparisonResult, that both inherit from Result and are demonstrated in the project.  Users are free to add their own types of result objects if they need more fields.</p>

<figure class='code'><figcaption><span></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">interface</span> <span class="nc">Result</span> <span class="o">{</span>
</span><span class='line'>     <span class="n">String</span> <span class="n">testName</span>
</span><span class='line'>     <span class="n">String</span> <span class="n">details</span>
</span><span class='line'>     <span class="n">Integer</span> <span class="n">executionTime</span>
</span><span class='line'>     <span class="n">Date</span> <span class="n">createDate</span>
</span><span class='line'>     <span class="n">Boolean</span> <span class="n">isError</span>
</span><span class='line'> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@ToString</span><span class="o">(</span><span class="n">includeNames</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">includeFields</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">excludes</span> <span class="o">=</span> <span class="s2">&quot;class, id&quot;</span><span class="o">)</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">SimpleResult</span> <span class="kd">implements</span> <span class="n">Serializable</span><span class="o">,</span> <span class="n">Result</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">String</span> <span class="n">testName</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">details</span>
</span><span class='line'>    <span class="n">Integer</span> <span class="n">executionTime</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="n">Date</span> <span class="n">createDate</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Date</span><span class="o">()</span>
</span><span class='line'>    <span class="n">Boolean</span> <span class="n">isError</span> <span class="o">=</span> <span class="kc">false</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="nd">@ToString</span><span class="o">(</span><span class="n">includeNames</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">includeFields</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">excludes</span> <span class="o">=</span> <span class="s2">&quot;class, id&quot;</span><span class="o">)</span>
</span><span class='line'><span class="kd">class</span> <span class="nc">ComparisonResult</span> <span class="kd">extends</span> <span class="n">SimpleResult</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">result1</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">result2</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Result Interface Fields:</p>

<pre><code>testName - This can be an abitrary value that you would like, simply used when displaying detailed results view.
details - If you would like to put any specific output from the test like facts, figures, etc. you can do so in the details field.
executionTime - This should be the value of the result from the benchmark method.  You could roll your own timing schema and put that value here.
createDate - The date, defaulted to now, simply used when displaying detailed results view.
isError - This will cause the result to be logged into the error queue.  You should set this if an error condition occurs perhaps in a try catch or when unexpected results are reached.
</code></pre>

<p>Here is an example of a test the may set the error flag if the results are empty or an exception occurs:</p>

<figure class='code'><figcaption><span></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="n">Result</span> <span class="nf">performTest</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">String</span> <span class="n">quote</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>    <span class="n">Boolean</span> <span class="n">isError</span> <span class="o">=</span> <span class="kc">false</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="n">duration</span> <span class="o">=</span> <span class="n">benchmark</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">quote</span> <span class="o">=</span> <span class="n">stockQuoteClient</span><span class="o">.</span><span class="na">getQuote</span><span class="o">(</span><span class="n">randomStock</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="n">isError</span> <span class="o">=</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="k">new</span> <span class="nf">SimpleResult</span><span class="o">(</span><span class="nl">details:</span> <span class="n">quote</span><span class="o">,</span> <span class="nl">isError:</span> <span class="o">(</span><span class="n">isError</span> <span class="o">||</span> <span class="o">!</span><span class="n">quote</span><span class="o">),</span> <span class="nl">executionTime:</span> <span class="n">duration</span><span class="o">,</span> <span class="nl">testName:</span> <span class="s1">&#39;Stock Quote Performance Service&#39;</span><span class="o">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last and most important step for activating a performance job is adding the job config to the Config.groovy perf runners block.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">perf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">runners</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">jobName</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">description</span>
</span><span class='line'>            <span class="n">maxWorkers</span>
</span><span class='line'>            <span class="n">workerClass</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>The values are represented via the following:</p>

<pre><code>jobName - A unique name for the job node (no spaces)
description - A name that will be used to display on the jobs screen
maxWorkers - Max number of workers available to choose on job screen.  Will be between 1 and maxWorkers in drop down.
workerClass - Points to the class of the worker to wire up to the job.
</code></pre>

<p><em>The jobName MUST be unique or you will get overlapping and/or inaccurate results.</em></p>

<p>To wire up the LargeNumberPerformanceService job above to show up in the admin console as an available job you need to add the following:</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">perf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">runners</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">largeNumberPerformanceRunner</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">description</span> <span class="o">=</span> <span class="s1">&#39;Large Number Performance Test&#39;</span>
</span><span class='line'>            <span class="n">maxWorkers</span> <span class="o">=</span> <span class="mi">20</span>
</span><span class='line'>            <span class="n">workerClass</span> <span class="o">=</span> <span class="n">com</span><span class="o">.</span><span class="na">perf</span><span class="o">.</span><span class="na">runners</span><span class="o">.</span><span class="na">math</span><span class="o">.</span><span class="na">LargeNumberPerformanceService</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>Note: I have not tested a large number of jobs, but having several available to run would be okay.  If you tried to run several jobs with large thread pools, you will probably experience inaccurate results as your machine struggles to keep up.  Leaving the job service classes in place but simply commenting out the jobName block in the config will cause the admin console to not list the job for running and should take up no overhead while essentially disabling the job.</p>

<h2>Simplified Sequence Diagram</h2>

<p><img src="http://www.christianoestreich.com/images/gperf/processflow.png"></p>

<h2>Running the Application</h2>

<p><em>You will need to start a redis server and make sure the Config.groovy points to it before running the application.</em></p>

<p>Once one or more jobs are configured and redis is running you can <code>run-app</code> and navigate to <a href="http://localhost:8080/gperf" title="Local Web App">localhost</a>.</p>

<h2>Admin Console</h2>

<p>The main admin console view:</p>

<p><img src="http://www.christianoestreich.com/images/gperf/admin1.jpg"></p>

<p>Clicking the start button and using ajax to collect some results:</p>

<p><img src="http://www.christianoestreich.com/images/gperf/admin2.jpg"></p>

<p>A view of the list all keys feature.  Some keys are clickable if they contain more details of data to view:</p>

<p><img src="http://www.christianoestreich.com/images/gperf/listkeys.jpg"></p>

<p>A detailed view of a success queue:</p>

<p><img src="http://www.christianoestreich.com/images/gperf/viewqueue.jpg"></p>

<h2>PerformanceRunnerJob Class</h2>

<figure class='code'><figcaption><span></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>
<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='groovy'><span class='line'><span class="kd">class</span> <span class="nc">PerformanceRunnerJob</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">GrailsApplication</span> <span class="n">grailsApplication</span>
</span><span class='line'>    <span class="n">RedisService</span> <span class="n">redisService</span>
</span><span class='line'>    <span class="n">ResultsService</span> <span class="n">resultsService</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">executorService</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">def</span> <span class="nf">perform</span><span class="o">(</span><span class="n">jobName</span><span class="o">,</span> <span class="n">workers</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">println</span> <span class="s2">&quot;jesque queueing up job ${jobName} with ${workers} threads&quot;</span>
</span><span class='line'>        <span class="n">Class</span> <span class="n">clazz</span> <span class="o">=</span> <span class="n">grailsApplication</span><span class="o">.</span><span class="na">config</span><span class="o">?.</span><span class="na">perf</span><span class="o">?.</span><span class="na">runners</span><span class="o">[</span><span class="n">jobName</span><span class="o">]?.</span><span class="na">workerClass</span>
</span><span class='line'>        <span class="k">if</span><span class="o">(!</span><span class="n">clazz</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="s2">&quot;Can not start a performance worker without a workerClass defined in the config attribute&quot;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="n">PerformanceService</span> <span class="n">service</span> <span class="o">=</span> <span class="o">(</span><span class="n">PerformanceService</span><span class="o">)</span> <span class="n">grailsApplication</span><span class="o">.</span><span class="na">mainContext</span><span class="o">.</span><span class="na">getBean</span><span class="o">(</span><span class="n">clazz</span><span class="o">)</span>
</span><span class='line'>        <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">workers</span><span class="o">).</span><span class="na">times</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">runAsync</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">println</span> <span class="s2">&quot;running ${jobName} on thread :: ${Thread.currentThread().id}&quot;</span>
</span><span class='line'>                <span class="k">while</span><span class="o">(</span><span class="n">redisService</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">jobName</span><span class="o">)</span> <span class="o">==</span> <span class="n">PerformanceConstants</span><span class="o">.</span><span class="na">RUNNING</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                    <span class="n">saveResults</span><span class="o">(</span><span class="n">jobName</span><span class="o">,</span> <span class="n">service</span><span class="o">.</span><span class="na">performTest</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">private</span> <span class="kt">void</span> <span class="nf">saveResults</span><span class="o">(</span><span class="n">String</span> <span class="n">jobName</span><span class="o">,</span> <span class="n">Result</span> <span class="n">result</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">debug</span> <span class="n">result</span>
</span><span class='line'>        <span class="n">resultsService</span><span class="o">.</span><span class="na">saveResults</span><span class="o">(</span><span class="n">jobName</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>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Client 1.2.5 Changes]]></title>
    <link href="http://www.christianoestreich.com/2012/01/grails-cxf-client-wsdl2java-changes/"/>
    <updated>2012-01-10T10:17:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/01/grails-cxf-client-wsdl2java-changes</id>
    <content type="html"><![CDATA[<p>Based on a user request, I have added the ability to pass the wsdl2java script a wsdlArgs param in which you can use to pass custom args into the client creation process.  I have also modified the name of the <strong>bindingFile</strong> parameter as the name <strong>binding</strong> was in conflict with groovy reserved keywords.</p>

<!-- more -->




<table border="1">
<tr><td><b>Property</b></td><td><b>Description</b></td><td>Required</b></td></tr>
<tr><td>wsdl</td><td>Location of the wsdl either locally relative to project home dir or a url. (default: &#8220;&#8221;)</td><td>No</td></tr>
<tr><td>wsdlArgs</td><td>A custom list of args to pass in seperated by space such as [&#8220;-autoNameResolution&#8221;,&#8221;-validate&#8221;].  This can also be a single string value such as &#8220;-autoNameResolution&#8221;, but when using multiple custom params you must specify each in a list [&#8220;-one val&#8221;,&#8221;-two&#8221;,&#8221;-three val&#8221;] due to limitations with ant. (default: &#8220;&#8221;)</td><td>No</td></tr>
<tr><td>namespace</td><td>Specifies package names to use for the generated code. (default: &#8220;use wsdl provided schema&#8221;)</td><td>No</td></tr>
<tr><td>client</td><td>Used to tell wsdl2java to output sample clients, usually not needed. (default: false)</td><td>No</td></tr>
<tr><td>bindingFile</td><td>Path of binding file to pass to wsdl2java. (default: &#8220;&#8221;)</td><td>No</td></tr>
<tr><td>outputDir</td><td>Password to pass along with request in wss4j interceptor when secured is true. (default: &#8220;src/java&#8221;)</td><td>No</td></tr>
</table>


<p>Here is an example cxf client configuration block using the new wsdlArgs param.</p>

<figure class='code'><figcaption><span></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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">cxf</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">installDir</span> <span class="o">=</span> <span class="s2">&quot;C:/apps/apache-cxf-2.4.2&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>    <span class="n">client</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">simpleServiceClient</span> <span class="o">{</span>
</span><span class='line'>            <span class="c1">//used in wsdl2java</span>
</span><span class='line'>            <span class="n">wsdl</span> <span class="o">=</span> <span class="s2">&quot;docs/SimpleService.wsdl&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>            <span class="n">wsdlArgs</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;-autoNameResolution&#39;</span><span class="o">,</span> <span class="s1">&#39;-validate&#39;</span><span class="o">]</span>
</span><span class='line'>            <span class="c1">//wsdlArgs = &#39;-autoNameResolution&#39; //single param style</span>
</span><span class='line'>            <span class="n">namespace</span> <span class="o">=</span> <span class="s2">&quot;cxf.client.demo.simple&quot;</span>
</span><span class='line'>            <span class="n">client</span> <span class="o">=</span> <span class="kc">false</span> <span class="c1">//defaults to false</span>
</span><span class='line'>            <span class="n">bindingFile</span> <span class="o">=</span> <span class="s2">&quot;grails-app/conf/bindings.xml&quot;</span>
</span><span class='line'>            <span class="n">outputDir</span> <span class="o">=</span> <span class="s2">&quot;src/java&quot;</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//used for invoking service</span>
</span><span class='line'>            <span class="n">clientInterface</span> <span class="o">=</span> <span class="n">cxf</span><span class="o">.</span><span class="na">client</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">simple</span><span class="o">.</span><span class="na">SimpleServicePortType</span>
</span><span class='line'>            <span class="n">serviceEndpointAddress</span> <span class="o">=</span> <span class="s2">&quot;${service.simple.url}&quot;</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>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving To Octopress]]></title>
    <link href="http://www.christianoestreich.com/2012/01/moving-to-octopress/"/>
    <updated>2012-01-03T16:30:00+00:00</updated>
    <id>http://www.christianoestreich.com/2012/01/moving-to-octopress</id>
    <content type="html"><![CDATA[<p>I am currently in the process of porting all the blog posts to <a href="http://www.octopress.org">Octopress</a>.  This is a WIP and I will try and get all the content updated ASAP.</p>

<p>Thanks!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grails Cxf Client 1.2.3 Released]]></title>
    <link href="http://www.christianoestreich.com/2011/12/grails-cxf-client-custom-interceptors.markdown/"/>
    <updated>2011-12-13T13:58:55+00:00</updated>
    <id>http://www.christianoestreich.com/2011/12/grails-cxf-client-custom-interceptors.markdown</id>
    <content type="html"><![CDATA[Based on a request from a user to add user defined logging and fault
interceptors, I have enhanced the [Grails cxf-client plugin][1]. I have
included these features in the new release version 1.2.3.

In the previous version (1.2.2) of the plugin I added the ability to override
the security interceptor. This was done to allow users to diverge from using
the standard WSS4J interceptor that I bundled with the plugin. I accomplished
this by adding an single out interceptor to the cxf client proxy.

In the latest version I have taken the interceptor injection one step further
and allowed users to configure any number of in, out or fault out interceptors
they want to add to the interceptor chain.  In addition I have provided a flag
to turn on or off the default logging in and out interceptors that I am auto
injecting for the users.

<!-- more  -->

The following partial documentation is available in full at
[https://github.com/Grails-Plugin-Consortium/cxf-client][2]

To begin create the interceptor bean.

<figure class='code'><figcaption><span>CustomLoggingInInterceptor.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>
</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">cxf</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">logging</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.common.injection.NoJSR250Annotations</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.interceptor.AbstractLoggingInterceptor</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.interceptor.Fault</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.interceptor.LoggingInInterceptor</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.message.Message</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.cxf.phase.Phase</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@NoJSR250Annotations</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CustomLoggingInInterceptor</span> <span class="kd">extends</span> <span class="n">AbstractLoggingInterceptor</span>
</span><span class='line'><span class="o">{</span>
</span><span class='line'>    <span class="kt">def</span> <span class="n">name</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="nf">CustomLoggingInInterceptor</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">Phase</span><span class="o">.</span><span class="na">RECEIVE</span><span class="o">);</span>
</span><span class='line'>        <span class="n">log</span> <span class="s2">&quot;Creating the custom interceptor bean&quot;</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">handleMessage</span><span class="o">(</span><span class="n">Message</span> <span class="n">message</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Fault</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">log</span> <span class="s2">&quot;$name :: I AM IN CUSTOM IN LOGGER!!!!!!!&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>

Next you will want to wire up the interceptor bean in the resources.groovy.

<figure class='code'><figcaption><span>resources.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>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">customLoggingInInterceptor</span><span class="o">(</span><span class="n">CustomLoggingInInterceptor</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;customLoggingInInterceptor&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">verboseLoggingInInterceptor</span><span class="o">(</span><span class="n">VerboseCustomLoggingInInterceptor</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;verboseLoggingInInterceptor&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">customLoggingOutInterceptor</span><span class="o">(</span><span class="n">CustomLoggingOutInterceptor</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;customLoggingOutInterceptor&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>

Last you will need to define a list of interceptors in your config.groovy cxf
{client {&#8230;}} block for either in, out or out fault. The following defines
two custom inInterceptors named customLoggingInInterceptor and
verboseLoggingInInterceptor.

<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">simpleServiceInterceptorClient</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">wsdl</span> <span class="o">=</span> <span class="s2">&quot;docs/SimpleService.wsdl&quot;</span> <span class="c1">//only used for wsdl2java script target</span>
</span><span class='line'>    <span class="n">clientInterface</span> <span class="o">=</span> <span class="n">cxf</span><span class="o">.</span><span class="na">client</span><span class="o">.</span><span class="na">demo</span><span class="o">.</span><span class="na">simple</span><span class="o">.</span><span class="na">SimpleServicePortType</span>
</span><span class='line'>    <span class="n">serviceEndpointAddress</span> <span class="o">=</span> <span class="s2">&quot;${service.simple.url}&quot;</span>
</span><span class='line'>    <span class="n">inInterceptors</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;customLoggingInInterceptor&#39;</span><span class="o">,</span> <span class="s1">&#39;verboseLoggingInInterceptor&#39;</span><span class="o">]</span> <span class="c1">//can use comma separated list or groovy list</span>
</span><span class='line'>    <span class="n">enableDefaultLoggingInterceptors</span> <span class="o">=</span> <span class="kc">false</span>
</span><span class='line'>    <span class="n">namespace</span> <span class="o">=</span> <span class="s2">&quot;cxf.client.demo.simple&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>

The flag enableDefaultLoggingInterceptors will turn on (true) the default
logging interceptors. You do not need to provide this property if you wish to
use the default logging as the default value is true. If you wish to turn
them off simply provide the property for your client bean config and set the
value to false similar to the above block.

See the docs at [https://github.com/Grails-Plugin-Consortium/cxf-client][2] for more
details on further use of the cxf-client plugin and additional tips for wiring
up interceptors.

   [1]: http://www.grails.org/plugin/cxf-client (Grails Cxf Client Plugin)

   [2]: https://github.com/Grails-Plugin-Consortium/cxf-client

]]></content>
  </entry>
  
</feed>
