<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Manifest</title>
	<atom:link href="http://www.novagenia.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.novagenia.com/blog</link>
	<description>Novagenia&#039;s blog on agilism, technology and tools</description>
	<lastBuildDate>Thu, 05 Apr 2012 08:24:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Corporate agile</title>
		<link>http://www.novagenia.com/blog/en/2012/01/31/agilismo-corporativo/</link>
		<comments>http://www.novagenia.com/blog/en/2012/01/31/agilismo-corporativo/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 15:00:24 +0000</pubDate>
		<dc:creator>Eduardo Mayor</dc:creator>
				<category><![CDATA[Agilismo]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Greenhopper]]></category>
		<category><![CDATA[QA]]></category>

		<guid isPermaLink="false">http://www.novagenia.com/blog/?p=192</guid>
		<description><![CDATA[I have found that one of the main obstacles in the adoption of agile methods by conventional organizations has to do with the impact of a non-conventional layout (like that of Scrum) on a corportation&#8217;s organizational chart. In this entry &#8230; <a href="http://www.novagenia.com/blog/en/2012/01/31/agilismo-corporativo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">I have found that one of the main obstacles in the adoption of agile methods by conventional organizations has to do with the impact of a non-conventional layout (like that of Scrum) on a corportation&#8217;s organizational chart. In this entry about <em>corporate agilism</em> we deal with the role of Quality Assurance engineers from different perspectives.</p>
<p style="text-align: justify;"><a href="http://www.novagenia.com/blog/wp-content/uploads/2012/01/Scrum-team.png"><img class="aligncenter size-full wp-image-193" title="Scrum-team" src="http://www.novagenia.com/blog/wp-content/uploads/2012/01/Scrum-team.png" alt="" width="623" height="344" /></a><span id="more-192"></span>During the last decade, methodologists and software engineers have been pushing for a paradigm shift in IT focusing on new roles and creative intereaction among them. The background of those driving the change has conditioned the roles and responsabilities in development teams, forgetting about some of the key actors in more traditional processes:</p>
<ul>
<li>QA: Quality Assurance Engineers, mainly functional testers</li>
<li>Project Manager.</li>
<li>Project Office.</li>
</ul>
<p style="text-align: justify;">The challenge in introducing an agile culture in traditional corporations (or just change-resistant ones) requires a review of the role of these and some other actors in software development teams. In this first article on corporate agilism we will provide our vision on the new areas of responsibility for quality assurance engineers.</p>
<h1>QA in agile teams</h1>
<p style="text-align: justify;">As opposed to heavyweight methods from the 80&#8242;s, agile frameworks seem to have reserved a marginal role to QA guys. Formal documentation on functional testing for agile teams is hard to find and the introduction of techniques such as <a style="text-align: justify;" href="http://en.wikipedia.org/wiki/Test-driven_development">TDD </a>or <a href="http://en.wikipedia.org/wiki/Continuous_integration">Continuous Integration</a> may be confused with functional validation.</p>
<blockquote>
<p style="text-align: justify;">We firmly believe all agile teams should have specific roles in charge of functional testing and quality assurance.</p>
</blockquote>
<h2>QA as Product Owner</h2>
<p style="text-align: justify;">Product Backlog in Scrum is the ordered list of functional requirements sorted by business value (or ROI). Each item in the list (Product Backlog Item) must contain at least the following data:</p>
<ul>
<li><strong>Feature</strong>: A functional description (user story).</li>
<li><strong>Business Value</strong>: Relative estimate of value for the client/user.</li>
<li style="text-align: justify;"><strong>Cost</strong>: Relative estimate of effort for the team.</li>
<li><strong>Acceptance Criteria</strong>: Definition of Done, Validation and/or regression tests.</li>
</ul>
<p style="text-align: justify;">Leaving aside estimates for business value (it&#8217;s sole responsibility lies on the user) and cost (it&#8217;s sole responsibility lies on the development team), data related to a PBI belongs to the area of responsibility of Functional QA testing!</p>
<blockquote>
<p style="text-align: justify;">Consider appointing a Funtional tester as Product Owner in order to enhance communication of user stories and maximize quality in every Sprint.</p>
</blockquote>
<p>This approach has also, some added benefits:</p>
<ul>
<li><strong>User Stories</strong> expressed in a more <em>developer-friendly</em> language</li>
<li><strong>Definition of Done</strong> for every user story</li>
<li style="text-align: justify;"><strong>Product Quality</strong> in every release, which provides greater reliability on the team and project advance.</li>
</ul>
<p style="text-align: justify;">Those companies where product quality is critical or software development driven teams are ideal candidates for this layout.</p>
<h2>QA as part of the development team</h2>
<p style="text-align: justify;">Frequently, rigid organizations do not allow the flexibility and selft-organization required by agiles teams (see <strong>Agile Ecosystems</strong>). In some cases, responsibility for functional requirements lies in departments outside development or technology.</p>
<p style="text-align: justify;">When it is not possible to have a Quality tester act as Product owner, the team should enfoce product quality in the following practices:</p>
<ul>
<li style="text-align: justify;"><strong>Planning session</strong>. Quality should contribute to the understanding of user stories and Definition of done as these information may have an impact in the cost/effort estimate.</li>
<li style="text-align: justify;"><strong>Tracking</strong>. Continuous Integration (on different environments) must be a valuable tool for functional validation.</li>
<li style="text-align: justify;"><strong>Sprint Review</strong>. Review sessions should focus on validating that committed features have been delivered completely, satisfying the acceptance criteria (for more info see <a href="http://es.wikipedia.org/wiki/Scrum">Sashimi</a>).</li>
</ul>
<p style="text-align: justify;">Trust in the team (and therefore, in the new paradigm) rely heavily on the quality of every bit of functionality released in a sustained rithm. Thus, product quality must be top priotity for the team.</p>
<h1>Agile Ecosystems</h1>
<p style="text-align: justify;">As we have mentioned, Technology departments on many traditional corporations are not ready for a collaborative environment. To make thing worst, frequently responsiblity for product development is highly distributed: Requirements Manager, Architecture Manager, Sfotware Development Manager, Quality Manager, Project Office&#8230;</p>
<p style="text-align: justify;">Sometime the only way to introduce agile in these environments is to create an <strong>agile ecosystem.</strong></p>
<blockquote>
<p style="text-align: justify;">An agile ecosystem is a protected environment for developers and QA in which conditions for self-organization are set to allow organic growth processes.</p>
</blockquote>
<p style="text-align: justify;">A word of warning! An agile ecosystem&#8217;s goal is to implement itereative and incremental proceses in organizations that do not allow such models explicitly (as they operate in a closed scope or closed budget approach). This <em>modus operandi</em> may be the only one feasible at a given time but best results can only be obtained when the new paradigm is ambraced by the whole corporation.</p>
<h2>QA in Agile Ecosystems</h2>
<p style="text-align: justify;">The concept of Agile ecosisystems is not part of any <em>de facto</em> standard or body of knowledge accepted by the community. The following suggestions are just our particular outlook on this subject as a result of several years helping companies embrace the agile paradigm:</p>
<ul>
<li style="text-align: justify;"><strong>Planning</strong>. QA must contribute to cost/effort estimates providing feedback on Acceptance criteria for every user story. Besides, an explicit Definition of Done will be provided by QA for every user story planned for the next sprint.</li>
<li style="text-align: justify;"><strong>Continuous Integration</strong>. Sustained product integration along the sprint must be used for automation of funtional tests (whenever possible). QA will have access to testing environments and automation tools to ease continuous delivery on them.</li>
<li style="text-align: justify;"><strong>Tracking tools</strong>. Tracking toos and charts (burndown chart, kanban, etc.) will take into account validation as a new stage to evaluate progress. A user story will only be finished once it has made it from the validation stage to the closed status.</li>
</ul>
<div id="attachment_204" class="wp-caption alignnone" style="width: 964px"><img class=" wp-image-204" title="Kanban-QA" src="http://www.novagenia.com/blog/wp-content/uploads/2012/01/Kanban-QA1.png" alt="" width="954" height="333" /><p class="wp-caption-text">Kanban &amp; QA in Greenhopper</p></div>
<p style="padding-left: 30px;">By using tools such as Kanban boards and CFD the team must reflect on the optimum number of resources to reduce WIP</p>
<div id="attachment_201" class="wp-caption aligncenter" style="width: 298px"><img class=" wp-image-201" title="CFD en Greenhopper" src="http://www.novagenia.com/blog/wp-content/uploads/2012/01/greenhoppertour_kanban_flow.png" alt="" width="288" height="194" /><p class="wp-caption-text">CFD in Greenhopper</p></div>
<ul>
<li style="text-align: justify;"><strong>Sprint Review</strong>. Sprint review sessions must be aimed to analyzing the fulfillment of commitments. We can&#8217;t stress this enough; one of the main goals of an iterative and incremental process in to strengthen the reliability on the team (as well as its self-esteem) which means that any deviation from commitment must be dealt with in the retrospective session.</li>
<li style="text-align: justify;"><strong>Sprint retrospective</strong>. In the first sprints development and QA will hold retrospective sessions to analyze in a collaborative fashion the impediments that are stopping the team from increasing velocity as well as structre and process changes that may improve productivity and overall quality.</li>
<li style="text-align: justify;"><strong>Scrum Master</strong>. Agile ecosystems introduction must be driven by a great deal of common sense and, above all, by an expert facilitator that can pull the best results in a constrained environment. Degree of success (and time required to achieve it) depend heavily on the experience of this role.</li>
</ul>
<p>In next entries we will deal with some other factors affecting the introduction of agile in conventional organizations. Keep tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novagenia.com/blog/en/2012/01/31/agilismo-corporativo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JIRA Plugins: Data model access</title>
		<link>http://www.novagenia.com/blog/en/2011/12/14/jira-plugins-modelo-de-datos/</link>
		<comments>http://www.novagenia.com/blog/en/2011/12/14/jira-plugins-modelo-de-datos/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 09:00:14 +0000</pubDate>
		<dc:creator>Eduardo Mayor</dc:creator>
				<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[Plugin Devops]]></category>
		<category><![CDATA[Develoment]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://www.novagenia.com/blog/?p=118</guid>
		<description><![CDATA[In previous entries of this blog, we have shown how to create Atlassian plugins for Atlassian JIRA by extending built-in search functionallity with JQL functions. This new post will provide you with some information regarding OfBiz in order to access &#8230; <a href="http://www.novagenia.com/blog/en/2011/12/14/jira-plugins-modelo-de-datos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">In previous entries of this blog, we have shown how to create Atlassian <a>plugins</a> for Atlassian JIRA by extending built-in search functionallity with <a title="JIRA Plugins: JQL in JIRA" href="http://www.novagenia.com/blog/en/2011/11/22/jira-plugins-jql-en-jira/">JQL functions</a>. This new post will provide you with some information regarding <a href="http://ofbiz.apache.org/">OfBiz </a>in order to access JIRA&#8217;s data model directly. Our goal will be to create a JQL function that can use any records stored in JIRA (or Greenhopper) data model.</p>
<p style="text-align: center;"><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/12/ofbiz_jira.png"><img class="aligncenter" title="ofbiz_jira" src="http://www.novagenia.com/blog/wp-content/uploads/2011/12/ofbiz_jira.png" alt="" width="455" height="282" /></a></p>
<h1><span id="more-118"></span>¿What is Ofbiz?</h1>
<p style="text-align: justify;">Apache Ofbiz (The Apache Open For Business Project) is a java framework by the Apache Foundation that provides <em>corporate tools automation</em>. It offers corporate tools such as: ERP, CRM, etc. So, what does this have to do with JIRA? Traditionally, JIRA has used OfBiz as a Database abstraction layer to access records as map of fields (as an instance of the class <a>GenericValue</a>). The main benefit of this approach is keeping forward compatibility even if the database schema changes.</p>
<p style="text-align: justify;">The matching betweern logical model and database schema is performed by defining OfBiz Entities (tables) as a set of Fields (columns) with a strong data type. This model map is stored as a set of XML documents (for different DB servers) in a folder named <em>entitydefs</em> inside a JIRA installation directory. The file entitymodel.xml stores all entities available via Ofbiz. This is a little sample from this file:</p>
<pre class="brush: xml; gutter: true">    &lt;entity entity-name=&quot;Issue&quot; table-name=&quot;jiraissue&quot; package-name=&quot;&quot;&gt;
        &lt;field name=&quot;id&quot; type=&quot;numeric&quot;/&gt;

        &lt;field name=&quot;key&quot; col-name=&quot;pkey&quot; type=&quot;long-varchar&quot;/&gt;

        &lt;field name=&quot;project&quot; type=&quot;numeric&quot;/&gt;

        &lt;field name=&quot;reporter&quot; type=&quot;long-varchar&quot;/&gt;
        &lt;field name=&quot;assignee&quot; type=&quot;long-varchar&quot;/&gt;

        &lt;field name=&quot;type&quot; col-name=&quot;issuetype&quot; type=&quot;long-varchar&quot;/&gt;
        &lt;field name=&quot;summary&quot; type=&quot;long-varchar&quot;/&gt;
        &lt;field name=&quot;description&quot; type=&quot;extremely-long&quot;/&gt;
        &lt;field name=&quot;environment&quot; type=&quot;extremely-long&quot;/&gt;
        &lt;field name=&quot;priority&quot; type=&quot;long-varchar&quot;/&gt;
        &lt;field name=&quot;resolution&quot; type=&quot;long-varchar&quot;/&gt;
        &lt;field name=&quot;status&quot; col-name=&quot;issuestatus&quot; type=&quot;long-varchar&quot;/&gt;
        &lt;field name=&quot;created&quot; type=&quot;date-time&quot;/&gt;
        &lt;field name=&quot;updated&quot; type=&quot;date-time&quot;/&gt;
        &lt;field name=&quot;duedate&quot; type=&quot;date-time&quot;/&gt;
        &lt;field name=&quot;resolutiondate&quot; type=&quot;date-time&quot;/&gt;
        ...
    &lt;/entity&gt;</pre>
<p style="text-align: justify;">Ofbiz is a complex tool and it&#8217;s API is out of the scope of this article so we will focus on an interface used by JIRA when accessing data: <a href="http://ci.apache.org/projects/ofbiz/site/javadocs/org/ofbiz/entity/GenericDelegator.html">Delegator</a>. This interface provides all required methods to search for different criteria.</p>
<h1>Accesessing OfBiz from JIRA</h1>
<p style="text-align: justify;">JIRA public API contains interfaces to access OfBiz from plugins. com.atlassian.jira.ofbiz.OfBizDelegator is a wrapper interface to hide OfBiz Delegator. In the following snippet you can see how to retrieve an object of this interface:</p>
<pre class="brush: actionscript3; gutter: false">OfBizDelegator delegator = new DefaultOfBizDelegator(CoreFactory.getGenericDelegator());</pre>
<p style="text-align: justify;">This interface provides methods to explore entities and fileds from JIRA datamodel. Bear in mind that values for fileds are usually indexes from some other tables. For instance, in order to retireve all <em>issues</em> of type Bug (assuming the numerical value for Bug is 1) we can use this code:</p>
<pre class="brush: java; gutter: false">final List&lt;GenericValue&gt; bugs = delegator.findByField(&quot;Issue&quot;, &quot;type&quot;, (Integer)1);</pre>
<p style="text-align: justify;">Every <em>GenericValue</em> object returned by delegator provides a simple interface to get field values from name:</p>
<pre class="brush: java; gutter: false">String key = bugs.get(0).getString(&quot;key&quot;);</pre>
<p><em>OfBizDelegator</em> interface include some other methods for creating complex queries:</p>
<ul>
<li>findByLike</li>
<li>findByPrimaryKey</li>
<li>findByCondition</li>
<li>findByAnd</li>
<li>findByOr</li>
</ul>
<p>See JIRA API for more info on <a href="http://docs.atlassian.com/software/jira/docs/api/latest/">OfBizDelegator</a>.</p>
<h2>Conditional queries</h2>
<p style="text-align: justify;">So far we have created simple queries using OfBizDelegator but there is no way to use complex logic using these methods. In order to combine different fields and logical conditions we will need some other classes:</p>
<ul>
<li>org.ofbiz.core.entity.EntityCondition: Stores a logical condition consisting of 1 field, 1 operator (instanceof EntityOperator) and a value.</li>
<li>org.ofbiz.core.entity.EntityExpr: Stores a logical expression between openrands or conditions (OR, AND, etc)</li>
<li>org.ofbiz.core.util.UtilMisc: Helper class to assist in creating complex conditions.</li>
</ul>
<p style="text-align: justify;">This is a sample of how to use the method <em>findByCondition</em> from <em>OfBizDelegator</em> to get a list of <em>GenericValues</em> using conditional statements.</p>
<pre class="brush: java; gutter: true">java.sql.Timestamp fromTime = new Timestamp(new java.util.Date().getTime() - 365*24*3600);
List conditions = UtilMisc.toList(
                                  new EntityExpr(&quot;created&quot;, EntityOperator.GREATER_THAN, fromTime),
                                  new EntityExpr(&quot;field&quot;, EntityOperator.LIKE, &quot;status&quot;),
                                  new EntityExpr(&quot;fieldtype&quot;, EntityOperator.LIKE, &quot;jira&quot;),
                                  new EntityExpr(&quot;newvalue&quot;, EntityOperator.LIKE, (Integer)5) // &quot;Resolved&quot;
                                 );
final EntityCondition condition = new EntityConditionList(conditions, EntityOperator.AND);

OfBizDelegator delegator = new DefaultOfBizDelegator(CoreFactory.getGenericDelegator());
final List&lt;GenericValue&gt; resolved = delegator.findByCondition(&quot;ChangeGroupChangeItemView&quot;, condition, EasyList.build(&quot;issue&quot;));</pre>
<h1> JQL WAS operator</h1>
<p style="text-align: justify;">From version 4.3 on, JIRA provides a new operator to search in the past using JQL: WAS. It is identical as operator IS except it also checks in the <em>issue</em>&#8216;s histoy. For example, the following JQL sentence would return all <em>issues</em> ever assigned to the current user:</p>
<pre class="brush: sql; gutter: false">assignee was currentUser()</pre>
<p style="text-align: justify;">In the next section we will try to replicate this functionallity using a JQL function based on OfBiz.</p>
<h2>¿IS the user the actual assignee?</h2>
<p style="text-align: justify;">Operator IS works as a subset of WAS but schema-wise, queries affect completely different entities. This way, the current assignee for a particular issue is stored in the Issue entity (shown previously).</p>
<pre class="brush: java; gutter: true">final List&lt;QueryLiteral&gt; literals = new LinkedList&lt;QueryLiteral&gt;();
OfBizDelegator delegator = new DefaultOfBizDelegator(CoreFactory.getGenericDelegator());
final List&lt;GenericValue&gt; assignedToGVs = delegator.findByField(&quot;Issue&quot;, &quot;assignee&quot;, userId);

for (GenericValue changeItem : assignedToGVs) {
    try {
        literals.add(new QueryLiteral(operand, changeItem.getLong(&quot;id&quot;)));
    }
    catch (NumberFormatException e) {
    }
}</pre>
<h2>Now, let&#8217;s look into the past&#8230;</h2>
<p style="text-align: justify;">However, in order to know if a certain user has ever been assigned to a particular issue we need to use another entity that stores previous changes for all issues: <strong>ChangeGroupChangeItemView</strong> (see the example for Conditional queries). In this case, the helper class EasyMap comes in handy to create a map using constructor arguments.</p>
<pre class="brush: java; gutter: true">final List&lt;QueryLiteral&gt; literals = new LinkedList&lt;QueryLiteral&gt;();
Map&lt;String, Object&gt; paramsItem = EasyMap.build(&quot;field&quot;, field, &quot;fieldtype&quot;, &quot;jira&quot;, &quot;newvalue&quot;, newValue);
final List&lt;GenericValue&gt; changeItemsForFieldGVs = delegator.findByLike(&quot;ChangeGroupChangeItemView&quot;, paramsItem);
for (GenericValue changeItem : changeItemsForFieldGVs) {
    try {
         literals.add(new QueryLiteral(operand, changeItem.getLong(&quot;issue&quot;)));
    }
    catch (NumberFormatException e) {
    }
}</pre>
<h1>The final test</h1>
<p style="text-align: justify;">We have already seen in previous posts how to write and bundle <a title="Atlassian plugins con eclipse y maven" href="http://www.novagenia.com/blog/en/2011/11/17/50/">JIRA plugins</a> as well as <a title="JIRA Plugins: JQL en JIRA" href="http://www.novagenia.com/blog/en/2011/11/22/jira-plugins-jql-en-jira/">JQL functions</a> so we will skip this step. The XML descriptor for the new JQL funcion will be as follows:</p>
<pre class="brush: xml; gutter: true">&lt;jql-function key=&quot;issue-assigned-to-jql-function&quot; name=&quot;Issue Ever Assigned To Function&quot;
 system=&quot;true&quot;&gt;
    &lt;fname&gt;everAssignedTo&lt;/fname&gt;
    &lt;list&gt;true&lt;/list&gt;
&lt;/jql-function&gt;</pre>
<p>So let&#8217;s deploy and test our JQL function <em>everAssignedTo</em>.</p>
<p style="text-align: center;"><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/12/everassignedto1.png"><img title="everassignedto" src="http://www.novagenia.com/blog/wp-content/uploads/2011/12/everassignedto1.png" alt="" width="1000" height="343" /></a></p>
<p style="text-align: left;">Let&#8217;s double check with operator WAS.</p>
<p style="text-align: center;"><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/12/assigneeWas1.png"><img class="aligncenter" title="assigneeWas" src="http://www.novagenia.com/blog/wp-content/uploads/2011/12/assigneeWas1.png" alt="" width="999" height="342" /></a></p>
<h2 style="text-align: left;">References</h2>
<p style="text-align: justify;">Besides JIRA and OfBiz API links shown in this post, there is detailed information on JIRA&#8217;s datamodel in this <a href="https://developer.atlassian.com/display/JIRADEV/Database+Schema">page</a>.</p>
<p style="text-align: justify;">As with the rest of entries of our blog, you can download the source code from the repository publicly available at bitbucket.org: <a title="https://bitbucket.org/novagenia/elmanifiesto.git" href="https://bitbucket.org/novagenia/elmanifiesto.git">https://bitbucket.org/novagenia/elmanifiesto.git</a>.</p>
<p>Let us know what you think about this post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novagenia.com/blog/en/2011/12/14/jira-plugins-modelo-de-datos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JIRA Plugins: JQL Functions in JIRA</title>
		<link>http://www.novagenia.com/blog/en/2011/11/22/jira-plugins-jql-en-jira/</link>
		<comments>http://www.novagenia.com/blog/en/2011/11/22/jira-plugins-jql-en-jira/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 09:00:31 +0000</pubDate>
		<dc:creator>Eduardo Mayor</dc:creator>
				<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[Plugin Devops]]></category>
		<category><![CDATA[Develoment]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://www.novagenia.com/blog/?p=67</guid>
		<description><![CDATA[JIRA is a complete project management tool that support complex queries and filters for tracking and reporting. In this blog entry we will show how to develop your custom JQL functions to extend the long list of built-in functions included &#8230; <a href="http://www.novagenia.com/blog/en/2011/11/22/jira-plugins-jql-en-jira/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>JIRA is a complete project management tool that support complex queries and filters for tracking and reporting. In this blog entry we will show how to develop your custom JQL <em>functions </em>to extend the long list of built-in functions included from version 4.x.</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/issue_filters-jql.png"><img title="issue_filters-jql" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/issue_filters-jql.png" alt="" width="447" height="181" /></a></p>
<h1><span id="more-67"></span>¿What is JQL?</h1>
<p>JQL (JIRA Query Language) is a query language for JIRA&#8217;s data model very similar to SQL that allows complex searching from version 4.0. A JQL query is made up of a logic combination (OR, AND) of conditions in the form <em>field + operator + operands</em>. The operands can be one or more values or a JQL function (returning one or a list of values). For instance:</p>
<pre>project = &quot;New office&quot; AND status = &quot;open&quot;</pre>
<p>This JQL query returns all <em>issues</em> in project &#8220;New office&#8221; in status &#8220;open&#8221;. The next exaple shows the use of a JQL function:</p>
<pre class="brush: sql; gutter: false">assignee != currentUser()</pre>
<p>Which returns all issues assigned to a user different from the one executing the query, returned by the JQL function <em>currentUser()</em>.</p>
<h1>¿Can I extend the JQL sintax?</h1>
<p>It is not possible to create new operators. JQL can use any custom field, though. And we can create new JQL functions that provide complex operands that cannot be expressed with the built-in logic. In the next lines we will try to show you how to create a JQL function to display all <em>blocked</em> issues (identified in JIRA by the &#8216;<span style="text-decoration: underline;">blocks</span>&#8216; issue linking type).</p>
<h1>JQL Functions in a plugin</h1>
<p>In order to use our JQL function in JIRA we will create a plugin as described in our previuos entry: <a title="Atlassian plugins with eclipse &amp; maven" href="http://www.novagenia.com/blog/en/2011/11/17/50/">Atlassian plugins with eclipse &amp; maven</a>.</p>
<h2>1. Create base class BlockedIssuesJqlFunction.java</h2>
<p>Every JQL function must implement the interface <a href="http://docs.atlassian.com/jira/latest/com/atlassian/jira/plugin/jql/function/JqlFunction.html">JqlFunction </a>provided by JIRA&#8217;s API. For the sake of simplicity we will use an abstract class that provides common functionality: <a href="http://docs.atlassian.com/jira/latest/com/atlassian/jira/plugin/jql/function/AbstractJqlFunction.html">AbstractJqlFunction</a>. The following methods are abstract and needs to be implemented:</p>
<ul>
<li><strong>getMinimumNumberOfExpectedArguments()</strong>: returns the number of arguments our JQL function needs, in out example this is 0.<strong><br />
</strong></li>
<li><strong>getDataType()</strong>: returns the function&#8217;s return type, for issues this should be <span style="text-decoration: underline;"><tt>JiraDataTypes.ISSUE</tt></span>.</li>
<li><strong>validate(&#8230;)</strong>: validates arguments passed to our JQL function.</li>
<li><strong>getValues()</strong>: returns a list of values as objects of class QueryLiteral.</li>
</ul>
<p>So now we create the class <em>BlockedIssuesJqlFunction.java</em> to extend <em><em>AbstractJqlFunction:</em><br />
</em></p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/BlockedIssuesJqlFunction.png"><img title="BlockedIssuesJqlFunction" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/BlockedIssuesJqlFunction.png" alt="" width="546" height="369" /></a></p>
<pre class="brush: java; gutter: true">public class BlockedIssuesJqlFunction extends AbstractJqlFunction {

    @Override
    public JiraDataType getDataType() {
        return JiraDataTypes.ISSUE;
    }

    @Override
    public int getMinimumNumberOfExpectedArguments() {
        return 0;
    }

    @Override
    public List&lt;QueryLiteral&gt; getValues(
        QueryCreationContext queryCreationContext, FunctionOperand operand,
	TerminalClause terminalClause) {
	// TODO Auto-generated method stub
	return null;
    }

    @Override
    public MessageSet validate(User searcher, FunctionOperand operand,
	TerminalClause terminalClause) {
	// TODO Auto-generated method stub
	return null;
    }
}</pre>
<h2> 2. Now Implement validate(&#8230;)</h2>
<p>In the method <em>validate(&#8230;)</em> we need to check arguments passed to our Jql function, generate error messages (using an object of class <em>MessageSet</em>) if needed and store the values of the arguments to parameterize our search. In our example we will check that the following conditions apply:</p>
<ol>
<li>JIRA&#8217;s issue linking is enabled.</li>
<li>There is at least one issue using &#8216;is blocked by&#8217; linking type. We will use object of class <em>IssueLinkTypeManager</em> and <em>IssueLinkManager</em> provided during construction.</li>
</ol>
<pre class="brush: java; gutter: true">public class BlockedIssuesJqlFunction extends AbstractJqlFunction {

    private final IssueLinkTypeManager issueLinkTypeManager;
    private final IssueLinkManager issueLinkManager;
    private final static String LINK_NAME = &quot;is blocked by&quot;;

    public BlockedIssuesJqlFunction(IssueLinkManager issueLinkManager,
    		IssueLinkTypeManager issueLinkTypeManager) {
		super();
		this.issueLinkTypeManager = issueLinkTypeManager;
		this.issueLinkManager = issueLinkManager;
	}

	@Override
	public MessageSet validate(User searcher, FunctionOperand operand,
			TerminalClause terminalClause) {
        MessageSet messageSet = new MessageSetImpl();
        if (!issueLinkManager.isLinkingEnabled())
        {
            messageSet.addErrorMessage(&quot;Invalid argument for &quot; + getFunctionName());
            return messageSet;
        }

        final List&lt;String&gt; args = operand.getArgs();
        if (args.isEmpty())
        {
            messageSet.addErrorMessage(&quot;Invalid argument for &quot; + getFunctionName());
            return messageSet;
        }

        return messageSet;
    }
...
}</pre>
<h2> 3. getValues(&#8230;): Return candidates as literals</h2>
<p>Using a similar code we will retrieve all issues with a linking of type &#8220;is blocked by&#8221;. Finally, convert issue objects into literals (objects of class <em>QueryLiteral</em>).</p>
<pre class="brush: java; gutter: true">@Override
public List&lt;QueryLiteral&gt; getValues(
        QueryCreationContext queryCreationContext, FunctionOperand operand,
	TerminalClause terminalClause) {
    notNull(&quot;queryCreationContext&quot;, queryCreationContext);
    final List&lt;QueryLiteral&gt; literals = new LinkedList&lt;QueryLiteral&gt;();

    Collection&lt;IssueLinkType&gt; linkTypes = issueLinkTypeManager.getIssueLinkTypesByOutwardDescription(LINK_NAME);
    if (
         null == linkTypes ||
         linkTypes.isEmpty() ||
         null == issueLinkManager.getIssueLinks(linkTypes.iterator().next().getId())
       ) {
           return null;
    }

    Set&lt;Issue&gt; linkedIssues = new LinkedHashSet&lt;Issue&gt;();
    for (IssueLinkType linkType : linkTypes)
    {
        List&lt;Issue&gt; issues = new LinkedList&lt;Issue&gt;();
        Collection&lt;IssueLink&gt; links = issueLinkManager.getIssueLinks(linkType.getId());
        for (IssueLink link: links) {
            issues.add(link.getSourceObject());
        }

        if (issues != null)
        {
            linkedIssues.addAll(issues);
        }
    }
    for (Issue issue : linkedIssues)
    {
        literals.add(new QueryLiteral(operand, issue.getId()));
    }

    return literals;
}</pre>
<h2>4. Plugin descriptor</h2>
<p>In order for our class to be available in JIRA we must package it in a JIRA plugin with the appropiate OSGi descriptor. The following lines should be included in the file <tt><em>src/main/resources/atlassian-plugin.xml</em>.</tt></p>
<pre class="brush: xml; gutter: true">&lt;jql-function key=&quot;blocked-issues&quot; name=&quot;Blocked Issues Function&quot;
  class=&quot;com.novagenia.jira.plugins.jql.function.BlockedIssuesJqlFunction&quot;&gt;
  &lt;!--The name of the function--&gt;
  &lt;fname&gt;blockedIssues&lt;/fname&gt;
  &lt;description&gt;Provides a JQL function to returned issues with is blocked by link.&lt;/description&gt;
  &lt;!--Whether this function returns a list or a single value--&gt;
  &lt;list&gt;true&lt;/list&gt;
&lt;/jql-function&gt;</pre>
<p>Now you can deploy the plugin in JIRA and use the JQL function as follows:</p>
<pre class="brush: sql; gutter: false">issue in blockedIssues()</pre>
<p style="text-align: left;">And you should see some like&#8230;<br />
<img class="aligncenter" title="issue-in-blokedIssues" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/issue-in-blokedIssues.png" alt="" width="884" height="249" /></p>
<h1>The final touch</h1>
<p>Some suggestions to enhance your code.</p>
<h2>1. Add log traces</h2>
<p>There are several ways to debug JIRA plugins but you should, at least, provide runtime log traces to easy debugging and maintenance. By adding the right entries in the file log4j.properties we can adjust the verbose level of our our plugins from JIRA administration interface.</p>
<p>This is how we create an object to use logs from code:</p>
<pre class="brush: java; gutter: false">private final Logger log = Logger.getLogger(BlockedIssuesJqlFunction.class);</pre>
<p>Calls to this object should specify the severity of the trace:</p>
<pre class="brush: java; gutter: false">log.warn(&quot;Linking is not enabled!&quot;);</pre>
<h2>2. Refactor to use more linking types</h2>
<p>With little effort we can extend the functionality in our previous example to make it reusable. By using eclipse&#8217;s built-in refactoring tecnique &#8220;Extract Superclass&#8221; we will create a superclass with the linking type as a parameter.</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/extract-superclass.png"><img title="extract-superclass" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/extract-superclass.png" alt="" width="616" height="609" /></a></p>
<p>Now we add the new JQL function in the plugin descriptor:</p>
<pre class="brush: xml; gutter: true">&lt;jql-function key=&quot;linked-issues&quot; name=&quot;Linked Issues With Function&quot;&gt;
    &lt;!--The name of the function--&gt;
    &lt;fname&gt;linkedIssuesWith&lt;/fname&gt;
    &lt;description&gt;Provides a JQL function to get all issues with an outward link.&lt;/description&gt;
    &lt;!--Whether this function returns a list or a single value--&gt;
    &lt;list&gt;true&lt;/list&gt;
&lt;/jql-function&gt;</pre>
<h2>3. Keep it private (sanitize)</h2>
<p>To end with, we would like to talk about a mechanism (<em>sanitising</em>) that ensures that parameterized JQL functions keep information private. Although not mandatory, it is highly convenient if your JQL function is accesible from different projects. The goal is to keep all information regarding fields and values private. This is important when using a JQL function is filters that might be shared with people in different projects and, probably, with different security or visibility levels. If you think this is the case with your Jql fucntion then you may need to implement the interface <em>ClauseSanitisingJqlFunction</em>.</p>
<p>You will find more details in the following <a href="http://www.ricksoft.jp/document/display/JIRA/JQL+Function+Plugin+Module#JQLFunctionPluginModule-Functionsanitisation%28Optional%29">link</a>.</p>
<h1>Share</h1>
<p>The code included in this entry (as well as examples for all entries in <a href="http://www.novagenia.com/blog/en">The manifest</a>), can be accessed from bitbucket.org: <a href="http://git.novagenia.com">http://git.novagenia.com</a>.</p>
<p>Any comment that helps us improve would be hilghly appreciated.</p>
<p>Best regards.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novagenia.com/blog/en/2011/11/22/jira-plugins-jql-en-jira/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Atlassian plugins with eclipse &amp; maven</title>
		<link>http://www.novagenia.com/blog/en/2011/11/17/50/</link>
		<comments>http://www.novagenia.com/blog/en/2011/11/17/50/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 12:26:57 +0000</pubDate>
		<dc:creator>Eduardo Mayor</dc:creator>
				<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[Plugin Devops]]></category>
		<category><![CDATA[Develoment]]></category>

		<guid isPermaLink="false">http://www.novagenia.com/blog/?p=50</guid>
		<description><![CDATA[In this article we show how to create a plugin for JIRA, Confluence or Bamboo using eclipse and maven plugin overcoming current limitations on Atlassian SDK. 1. Get ready for Atlassian SDK. Atlassian provides an SDK for plugins (and other &#8230; <a href="http://www.novagenia.com/blog/en/2011/11/17/50/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In this article we show how to create a plugin for JIRA, Confluence or Bamboo using eclipse and maven plugin overcoming current limitations on Atlassian SDK.</p>
<h1><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/M2Eclipse-not-supported.png"><img class="aligncenter" title="M2Eclipse-not-supported" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/M2Eclipse-not-supported.png" alt="" width="673" height="92" /></a><span id="more-50"></span>1. Get ready for Atlassian SDK.</h1>
<p>Atlassian provides an SDK for plugins (and other artifacts as well ) creation that simplifies the setup of a complex environment. Platform requirements: Java Development Kit (JDK) version 6 you can download <a href="http://java.sun.com/javase/downloads/index.jsp">here</a>.</p>
<p>The Atlassian SDK comes with a Maven instalation with extra tools that helps jumpstarting a plugin. Download the latest SDK from this <a href="https://developer.atlassian.com/display/DOCS/Atlassian+Plugin+SDK+Documentation">location </a>and uncompress on a local path without spaces. Finally add the Maven&#8217;s bin folder to your path.</p>
<p>Then we will install the IDE, making sure we user eclipse Helios for Java development. <strong>Important!</strong> The latest eclipse version (when this entry was written) is Indigo which is incompatible with Atlassian SDK Atlassian and you won&#8217;t be able to use eclipse pluginj for Maven: M2Eclipse. Eclipse Helios can be downloaded from this <a href="http://www.eclipse.org/downloads/packages/release/helios/sr2">link</a>. Again, avoid spaces in eclipse installation path.</p>
<h1>2. Configure eclipse</h1>
<p>Eclipse plugin for Maven won&#8217;t run on a JRE so you need to make sure it starts with a Java Development Kit (JDK). In order to avoid trouble  you can modify eclipse configuraion file eclipse.ini and specify the path to the installed JDK:</p>
<pre>-vm
C:/Program Files/Java/jdk1.6.0_29/bin</pre>
<p>Eclipse Helios does not came bundeled with M2Eclipse plugin so we will add it manually. This way we can resort to a plugin version compatible with Atlassian SDK: <a href="http://m2eclipse.sonatype.org/installing-m2eclipse.html">http://m2eclipse.sonatype.org/installing-m2eclipse.html</a>. Add the Update repository and select <strong>Maven Integration for Eclipse</strong> for installation.</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Maven-integration-for-eclipse.png"><img class="aligncenter" title="eclipse-add-repository" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/eclipse-add-repository.png" alt="" width="731" height="404" /><img class="aligncenter" title="Maven-integration-for-eclipse" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Maven-integration-for-eclipse.png" alt="" width="730" height="278" /></a>Sonatype&#8217;s plugin version includes an embedded Maven installation that must be replaced for the one bundled in the Atlassian SDK. In the plugin configuration Window-&gt;Preferences-&gt;Maven-&gt;Installations we create a new entry for the Maven installation.</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Maven-sdk-installation.png"><img class="aligncenter" title="Maven-sdk-installation" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Maven-sdk-installation.png" alt="" width="715" height="387" /></a>To finish eclipse configuration we set the maven&#8217;s reposotory path as an environment variable. We can do that invoking the following command in a terminal:</p>
<pre>atlas-mvn eclipse:add-maven-repo &quot;-Declipse.workspace=&quot;</pre>
<p>On windows, it is important to use double quotes in order for the workspace pth to be resolved correctly. If the command executed successfully you should see some like:</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/add-maven-repo-output.png"><img class="aligncenter" title="add-maven-repo-output" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/add-maven-repo-output.png" alt="" width="638" height="198" /></a>By executing this command a new variable path is created in eclipse with the name <strong>M2_REPO</strong> that refers to the repository folder.</p>
<h1>3. Create your first plugin</h1>
<p>We are now ready to start writing plugins. There are several alternatives depending on the affected product and the kind of artifact you are building. We will use the SDK tools for the sake of simplicity.</p>
<p>Using the command-line on a terminal, Execute the following command in the workspace path:</p>
<pre>atlas-create-jira-plugin</pre>
<p>During the command execution you&#8217;ll be prompted for JIRA&#8217;s version, GroupId, ArtifactId, plugin version, etc. The expected output is something like:</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/alas-create-jira-output.png"><img class="aligncenter" title="alas-create-jira-output" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/alas-create-jira-output.png" alt="" width="1027" height="743" /></a>This will create a Maven project and the pom.xml file. Now we create an eclipse project skeleton by running the following command inside the plugin&#8217;s folder:</p>
<pre>atlas-mvn eclipse:eclipse</pre>
<p>This command will update current dependencies depending on the product and version. Now our plugin is ready to be imported into eclipse either as an eclipse or as a Maven project.</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Import-Maven-Projects.png"><img class="aligncenter" title="Import-Maven-Projects" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Import-Maven-Projects.png" alt="" width="621" height="633" /></a><strong></strong></p>
<p><strong>E voilà!</strong> The project is ready to generate our first plugin.</p>
<h1>4. Build, depoly and test</h1>
<p>This project will build automatically. In order to create a plugin package we will resort to the maven tools. Select the project in eclipse and click on <em>Run As-&gt;Maven package</em>.</p>
<p style="text-align: justify;"><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Run-as-maven-package.png"><img class="aligncenter" title="Run-as-maven-package" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Run-as-maven-package.png" alt="" width="678" height="376" /></a>Upon successfull run a  <em>test-plugin-1.0-SNAPSHOT.jar</em> file will be created in the target subdirectory. Now it is time to deploy.</p>
<p>Install JIRA if you haven&#8217;t already. You can download the latest version installer from <a href="http://www.atlassian.com/software/jira/download">here</a>. You can acquire a comercial license for just 10$ &#8230;</p>
<p>Log in JIRA with administrator privileges click on Administration-&gt;Plugins. On the Install tab, click on Upload plugin and select the jar file we just created from eclipse.</p>
<p><a href="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Upload-plugin.png"><img class="aligncenter" title="Upload-plugin" src="http://www.novagenia.com/blog/wp-content/uploads/2011/11/Upload-plugin.png" alt="" width="1168" height="377" /></a>Once the process finishes, the plugin is loaded and ready to play. Improve it, extend funcionality, change the plugin version and generate a new jar file as explained. You can deploy newer versions of the plugin without the hassle or restarting JIRA.</p>
<p>For simple debugging add your plugin&#8217;s groupid to the <em>log4j.properties</em> file and restart. From the administration page you can further customize the logging levels for every entry in the file.</p>
<pre>log4j.logger.com.novagenia = DEBUG, filelog
log4j.additivity.com.novagenia = false</pre>
<h1>6. Explore new possibilities</h1>
<p>Explore the SDK to get a glimpse of all you can do by creating plugins. There is a site devoted to developers regarding Atlassian products: <a href="http://developer.atlassian.com">http://developer.atlassian.com.</a></p>
<p>When your plugin is production-ready, register it in the Atlassian plugin repository and share with the community: <a href="http://plugins.atlassian.com">http://plugins.atlassian.com</a>.</p>
<p>I hope this was helpful. Tell us what you think..</p>
<p>Regards.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novagenia.com/blog/en/2011/11/17/50/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>About The Manifest&#8230;</title>
		<link>http://www.novagenia.com/blog/en/2011/11/09/about-el-manifiesto/</link>
		<comments>http://www.novagenia.com/blog/en/2011/11/09/about-el-manifiesto/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 18:23:18 +0000</pubDate>
		<dc:creator>Eduardo Mayor</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[Novagenia]]></category>

		<guid isPermaLink="false">http://www.novagenia.com/blog/?p=19</guid>
		<description><![CDATA[Welcome to The Manifest, the corporate blog of Novagenia (Information Technologies). Novagenia  is a spanish company specialized in  Agile Methods and Tools applied, mainly, but not exclusively, to creating software solutions. From a personal perspective,my experience on agile methods dates &#8230; <a href="http://www.novagenia.com/blog/en/2011/11/09/about-el-manifiesto/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Welcome to The Manifest, the corporate blog of Novagenia (Information Technologies).</p>
<p><a title="Novagenia" href="http://www.novagenia.com">Novagenia </a> is a spanish company specialized in  Agile Methods and Tools applied, mainly, but not exclusively, to creating software solutions. <span id="more-19"></span></p>
<p>From a personal perspective,my experience on agile methods dates to ancient history, back to 1999, when I stumbled upon an interesting refection on new ways of facing software development methods. The author was a Mr <a title="Kent Beck" href="http://en.wikipedia.org/wiki/Kent_Beck">Kent Beck</a> and it was published in the first wiki site (created by <a title="Ward Cunningham" href="http://en.wikipedia.org/wiki/Ward_Cunningham">Ward Cuningham</a> who, besides, came up with the name wiki from a Hawaian word for  <em>fast</em> although that is another story&#8230;) You can still access a modern version of the site in this <a href="http://c2.com/cgi/wiki?ExtremeProgrammingRoadmap">link</a>. Once I was <a href="http://c2.com/cgi/wiki?TestInfected">test infected</a> there was no cure; ¡it was impossible to accept waterfall paradigm dogma!</p>
<p>Some time later, after co-founding Novagenia in 2004, I decided that besides using the best software develoment process, I needed the best tools available in the market. I tested dozens of applications for months (Saas computing was not in fashion at the time) from open source solutions to comercial tools our budget could buy. Until I found the tool suite that I have been using since: JIRA + Confluence. For those of you who still haven&#8217;t used them, there are important open source projects using these tools: <a href="https://issues.apache.org/jira">Apache</a>, <a href="https://issues.jboss.org">JBoss</a>, <a href="https://jira.springsource.org">Spring</a>, <a href="https://issues.alfresco.com/jira">Alfresco</a>, etc. Then in 2006 Novagenia started providing consulting services on Agile Methods and we became the first Atlassian <a href="http://www.atlassian.com/resources/experts">partner </a>in Spain.</p>
<p>In the next articles on The Manifest we&#8217;ll try and share our take on agilism from a pragmatical outlook, writing about experiences and lessons learned during these exciting years providing our small contribution to the community. I hope you will share with us the journy that starts today&#8230;</p>
<p>Eduardo Mayor</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novagenia.com/blog/en/2011/11/09/about-el-manifiesto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

