<?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>Xebia Blog &#187; ShriKant Vashishtha</title>
	<atom:link href="http://blog.xebia.com/author/vashishtha/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.com</link>
	<description>Software development done right!</description>
	<lastBuildDate>Wed, 01 Feb 2012 00:30:00 +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>Maven appassembler Plugin: Dealing with Long Classpaths on Windows</title>
		<link>http://blog.xebia.com/2009/11/22/maven-appassembler-plugin-dealing-with-long-classpath-on-windows/</link>
		<comments>http://blog.xebia.com/2009/11/22/maven-appassembler-plugin-dealing-with-long-classpath-on-windows/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:33:36 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[long classpath on windows]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[maven appassembler]]></category>
		<category><![CDATA[maven appassembler booter]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=3514</guid>
		<description><![CDATA[When it comes to generating command-line scripts for Java applications, Maven &#8220;appassembler&#8221; plugin comes handy. Its &#8220;assemble&#8221; goal does all the maven magic, i.e. searching the dependencies used for creating the Java application, adding them into the classpath of resultant script and finally copying all relevant jars to a single place. It was all working [...]]]></description>
			<content:encoded><![CDATA[<p>When it comes to generating command-line scripts for Java applications, Maven &#8220;appassembler&#8221; plugin comes handy. Its &#8220;assemble&#8221; goal does all the maven magic, i.e. searching the dependencies used for creating the Java application, adding them into the classpath of resultant script and finally copying all relevant jars to a single place. It was all working very nicely until I stumbled across the problem of long classpaths in the Windows OS.</p>
<p>Irrespective of whether you use DOS prompt or cygwin, Windows limits the length of environment variables. Though there are <a href="http://stackoverflow.com/questions/1503708/problem-running-bat-file-on-windows-due-to-input-line-is-too-long">various options</a> to overcome this problem using Java 6 wildcard classpath, mapping the path to some drive etc, they all look like workarounds to me as problem can recur again anytime.<br />
<span id="more-3514"></span></p>
<p>After some amount of research, I found appassembler plugin resolves this issue with booter-windows and booter-unix daemons. From the outset it looked like daemon does something else as the name is a bit misleading but in reality it&#8217;s a generic way to start your Java applications. The booter-unix/booter-windows platforms were introduced for the sole purpose of resolving the long classpath issue (see <a href="http://jira.codehaus.org/browse/MAPPASM-43">MAPPASM-43</a>) in appassembler maven plugin. Here&#8217;s how it looks like in the pom you are working with:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
    &lt;artifactId&gt;appassembler-maven-plugin&lt;/artifactId&gt;
    &lt;configuration&gt;
        &lt;repositoryLayout&gt;flat&lt;/repositoryLayout&gt;
        &lt;installArtifacts&gt;false&lt;/installArtifacts&gt;
        &lt;target&gt;${project.build.directory}/appassembler&lt;/target&gt;
        &lt;defaultJvmSettings&gt;
            &lt;initialMemorySize&gt;512M&lt;/initialMemorySize&gt;
            &lt;maxMemorySize&gt;1024M&lt;/maxMemorySize&gt;
            &lt;extraArguments&gt;
                &lt;extraArgument&gt;-DconfigFile=../../etc/config.properties&lt;/extraArgument&gt;
                &lt;extraArgument&gt;-Dlog4j.configuration=../../etc/log4j.properties&lt;/extraArgument&gt;
            &lt;/extraArguments&gt;
        &lt;/defaultJvmSettings&gt;
        &lt;configurationDirectory&gt;etc&lt;/configurationDirectory&gt;
        &lt;daemons&gt;
            &lt;daemon&gt;
                &lt;id&gt;applicationName&lt;/id&gt;
                &lt;mainClass&gt;com.xebia.appassebler.sample.Main&lt;/mainClass&gt;
                &lt;platforms&gt;
                    &lt;platform&gt;booter-unix&lt;/platform&gt;
                    &lt;platform&gt;booter-windows&lt;/platform&gt;
                &lt;/platforms&gt;
                &lt;environmentSetupFileName&gt;app-env&lt;/environmentSetupFileName&gt;
            &lt;/daemon&gt;
        &lt;/daemons&gt;
    &lt;/configuration&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt; phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
                 &lt;goal&gt;generate-daemons&lt;/goal&gt;
                 &lt;goal&gt;create-repository&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p>If you look at the code carefully, you&#8217;ll find &#8220;app-env&#8221; as a parameter to &#8220;environmentSetupFileName&#8221; tag. It is quite useful in passing environment variables to the resultant script. Using app-env (for UNIX) and app-env.bat (for Windows) environment setup files, I could pass a modified $REPO environment variable so that the copied repository containing dependencies is shared between booter-unix and booter-windows folders as follows:</p>
<pre>
|-- booter-unix

|   |-- bin

|   |   |-- applicationName
|   |   `-- app-env

|   `-- etc

|       `-- applicationName.xml

|-- booter-windows

|   |-- bin

|   |   |-- app-env.bat

|   |   `-- applicationName.bat

|   `-- etc

|       `-- applicationName.xml

|-- etc

|   |-- config.properties

|   `-- log4j.properties

`-- repo

    |-- &lt;dependency1&gt;.jar

    |-- &lt;dependency2&gt;.jar

    |-- ...
</pre>
<p>To copy the environment files and result of appassembler:generate-daemons maven goal to the appropriate locations we can use &#8220;maven-assembly-plugin&#8221; as follows: </p>
<pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
    &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;
    &lt;configuration&gt;
        &lt;descriptor&gt;src/main/conf/descriptor.xml&lt;/descriptor&gt;
    &lt;/configuration&gt;
    &lt;executions&gt;
       &lt;execution&gt;
          &lt;goals&gt;
              &lt;goal&gt;single&lt;/goal&gt;
          &lt;/goals&gt;
          &lt;phase&gt;package&lt;/phase&gt;
       &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p>Here&#8217;s what src/main/conf/assembly.xml looks like:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;assembly&gt;
    &lt;id&gt;bin&lt;/id&gt;
    &lt;formats&gt;
        &lt;format&gt;tar.gz&lt;/format&gt;
        &lt;format&gt;zip&lt;/format&gt;
        &lt;format&gt;dir&lt;/format&gt;
    &lt;/formats&gt;
    &lt;fileSets&gt;
        &lt;fileSet&gt;
            &lt;directory&gt;target/appassembler/booter-unix&lt;/directory&gt;
            &lt;outputDirectory&gt;/booter-unix&lt;/outputDirectory&gt;
            &lt;excludes&gt;
                &lt;exclude&gt;*.bat&lt;/exclude&gt;
                &lt;exclude&gt;*.cmd&lt;/exclude&gt;
            &lt;/excludes&gt;
            &lt;lineEnding&gt;unix&lt;/lineEnding&gt;
            &lt;fileMode&gt;0744&lt;/fileMode&gt;
        &lt;/fileSet&gt;
        &lt;fileSet&gt;
            &lt;directory&gt;target/appassembler/booter-windows&lt;/directory&gt;
            &lt;outputDirectory&gt;/booter-windows&lt;/outputDirectory&gt;
        &lt;/fileSet&gt;
        &lt;fileSet&gt;
            &lt;directory&gt;target/appassembler/repo&lt;/directory&gt;
            &lt;outputDirectory&gt;/repo&lt;/outputDirectory&gt;
        &lt;/fileSet&gt;
        &lt;fileSet&gt;
            &lt;directory&gt;src/main/conf&lt;/directory&gt;
            &lt;includes&gt;
                &lt;include&gt;app-env.bat&lt;/include&gt;
            &lt;/includes&gt;
            &lt;outputDirectory&gt;/booter-windows/bin&lt;/outputDirectory&gt;
        &lt;/fileSet&gt;
        &lt;fileSet&gt;
            &lt;directory&gt;src/main/conf&lt;/directory&gt;
            &lt;includes&gt;
                &lt;include&gt;app-env&lt;/include&gt;
            &lt;/includes&gt;
            &lt;outputDirectory&gt;/booter-unix/bin&lt;/outputDirectory&gt;
            &lt;lineEnding&gt;unix&lt;/lineEnding&gt;
        &lt;/fileSet&gt;
    &lt;/fileSets&gt;
&lt;/assembly&gt;
</pre>
<p>Now, if you run &#8220;mvn clean package&#8221;, it provides you the structure as mentioned in listing 2. You can execute the script from booter-windows/bin/applicationName.bat on Windows without worrying about long classpaths now.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/11/22/maven-appassembler-plugin-dealing-with-long-classpath-on-windows/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F11%2F22%2Fmaven-appassembler-plugin-dealing-with-long-classpath-on-windows%2F&amp;title=Maven%20appassembler%20Plugin%3A%20Dealing%20with%20Long%20Classpaths%20on%20Windows" id="wpa2a_2"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/11/22/maven-appassembler-plugin-dealing-with-long-classpath-on-windows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pentaho Kettle and Integration Testing</title>
		<link>http://blog.xebia.com/2009/09/30/pentaho-kettle-and-integration-testing/</link>
		<comments>http://blog.xebia.com/2009/09/30/pentaho-kettle-and-integration-testing/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 08:57:56 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[kettle]]></category>
		<category><![CDATA[kettle integration testing]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=3196</guid>
		<description><![CDATA[Recently for our project we started using Kettle for ETL purposes. Pentaho Kettle provides UI based tool. Initially it takes quite some time to get used to Kettle UI as it becomes difficult to visualize how to orchestrate available Kettle Steps to solve a business problem. As you know how to use it, it&#8217;s all [...]]]></description>
			<content:encoded><![CDATA[<p>Recently for our project we started using Kettle for ETL purposes. Pentaho Kettle provides UI based tool. Initially it takes quite some time to get used to Kettle UI as it becomes difficult to visualize how to orchestrate available Kettle Steps to solve a business problem. As you know how to use it, it&#8217;s all about drag and drop a step and configuring it with available UI. With our experience we observed that it&#8217;s pretty easy to design 90% stuff easily but rest 10% involves a lot of research and at the end involved some hacks which we never liked.<br />
<span id="more-3196"></span></p>
<p>As we created Kettle transformations and jobs, we were not very sure about its testability part. After some research we found that we can use BlackBoxTests class available in Kettle distribution for test purposes. The fundamentals of it are quite simple. You pass some inputs and define the expected file and in the output you get actual output file after executing Kettle transformation. BlackBoxTests asserts if expected file matches with actual file. So for instance if you have a Sample.ktr under test, BlackBoxTests will expect Sample.expected.&lt;txt/xml/csv&gt; as an expected file and Sample.actual.&lt;txt/xml/csv&gt; as actual file to make it work. It tests all available transformations under a folder and subfolders.</p>
<p>By definition Kettle uses kettle.properties (available under $HOME/.kettle folder) which creates complications from testing point of view. However you should be able to test a Kettle transformation in isolation. That&#8217;s why instead of using kettle.properties, we planned to use application specific property file to pass it to  TransMeta class with available injectVariables() method. We were kind of successful but later found out that Kettle still uses kettle.properties even if we use a different property file.</p>
<p>After a lot of debugging we found out the culprit. BlackBoxTests uses EnvUtil.environmentInit() and does all the magic. It loads the kettle.properties by default and to our horror loads into java.lang.System.</p>
<p>We quickly got rid of using EnvUtil but found again that it&#8217;s not enough to pass the properties from outside. It works for the current transformation but somehow Kettle is not able to pass these properties to embedded sub-transformations. It worked earlier just because EnvUtil.environmentInit() loads properties into java.lang.System.</p>
<p>Overall, though we were finally able to do the testing with BlackBoxTests in isolation with some hacks, we concluded that the Kettle code is not designed to be testable and it can be termed as legacy code in Michael Feather&#8217;s language.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/09/30/pentaho-kettle-and-integration-testing/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F09%2F30%2Fpentaho-kettle-and-integration-testing%2F&amp;title=Pentaho%20Kettle%20and%20Integration%20Testing" id="wpa2a_4"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/09/30/pentaho-kettle-and-integration-testing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>iCMG Architecture World 2009 Bangalore</title>
		<link>http://blog.xebia.com/2009/07/31/icmg-architecture-world-2009-bangalore/</link>
		<comments>http://blog.xebia.com/2009/07/31/icmg-architecture-world-2009-bangalore/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 07:38:41 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[distributed agile]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=2804</guid>
		<description><![CDATA[Recently I got a chance to attend a 2 days architecture conference in Bangalore organized by iCMG. Some very experienced and renowned figures in software world took sessions on architecture and software development. It sounded like a conference on just software architecture but it catered various other topics which could be grouped under Software development [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I got a chance to attend a 2 days <a href="http://www.icmgworld.com/corp/events/architecture_world_09/sa_workshop/agenda.asp">architecture conference</a> in Bangalore organized by iCMG. Some very experienced and renowned figures in software world took sessions on architecture and software development. It sounded like a conference on just software architecture but it catered various other topics which could be grouped under Software development in general. If we leave the question of whether the conference should have focused on architecture only, other topics were also quite good and relevant to software development.</p>
<p><span id="more-2804"></span></p>
<p>In the entire conference there was a lot of focus on Outside-In thinking instead of Inside-Out thinking. It&#8217;s no more sufficient just to think about customer satisfaction. It has more to do with customer delight and in true sense, participating towards customer success. So instead of thinking what you think will be good for a customer, it&#8217;s important to figure out what a customer actually need. So a thinking from an end-user perspective is very important for software development.</p>
<p>There was an interesting talk from Manoj Shrivastava in which along with stressing on the usability principle &#8220;Don&#8217;t make me think&#8221;, he stressed on the need of &#8220;Don&#8217;t make me state&#8221; being more explicit to software vendors. It&#8217;s about some basic fundamentals of software development which you as a customer wouldn&#8217;t like to state while defining requirements. For instance, as a vendor you definitely won&#8217;t say at the end of a project that you didn&#8217;t care about foreign key constraints as part of database design because design document was signed off and customer should have pointed it out earlier. </p>
<p>This highlighted two key facts. One &#8211; a lot of organizations still follow traditional methodologies for software development. As a result, there is no scope of early feedback and adapting to the changes. That&#8217;s one of the reasons why Agile has become and growing very fast as the mainstream software development methodology.</p>
<p>Second fact is even more serious. Simply, don&#8217;t make me state!!! From software development point of view, some  of the things should be quite understood and shouldn&#8217;t required to be told.</p>
<p>There was a very good presentation from David S. Frankel on the challenges involved in Model Driven Systems. Sometimes the cost involved in integrating various systems based for different financial networks can be too high (for instance one billion dollar if you think of changing small details in credit card transaction integration). He mentioned ISO 20022 as an emerging standard for financial messaging but at the same time highlighted its limitations as it solves some problems but creates even more. His focus of presentation was go to the next level and provide semantic interoperability in data integration path.</p>
<p>At the end of the day, there was a very good panel discussion on a very important topic &#8211; why we lack focus and drive on software product development and innovation in India. It was a great debate and here are some important points discussed.</p>
<ul>
<li> The entrepreneur culture: David S. Frankel asked a question &#8211; how easy it is to start and how easy it is fail as a business in India. For instance, it&#8217;s very easy to start a company in USA. The red tape and bureaucracy involved are very minimal. At the same time, it&#8217;s very easy to fail too. If you fail in one venture, you start another. Most of the successful entrepreneurs in the world did not taste success in their very first venture. They failed, learned from mistakes and started a new one again. The culture of easy to start and easy to fail creates a very healthy environment in setting up business ventures based on new ideas which is the basic premise of product development. At the same time in some countries, if you fail and go bankrupt, it may become very tough to start a new company again. In India, it&#8217;s very easy to start but not that easy to fail. Not because from legal point of view but from attached social stigma as Indian culture is a society based culture.</li>
<li> Another point discussed was about the proximity of the market with India. Software market is still in western countries. Computer penetration in India is increasing but still hasn&#8217;t reached at that level. As market is in other countries, it&#8217;s difficult to think the need of new products from a thousands of miles distance. I personally feel it not a valid case as India is a very big market in itself. There can be many business ideas which suits to Indian consumer need.</li>
<li> Some people attributed the culture of being followers instead of being leader in terms of innovation. Also it has a lot to do with the education system which hasn&#8217;t changed since colonial times and was created to produce clerks to aid British colonial system but definitely not creative thinkers. Current education system has a lot of focus on cramming books for getting good marks instead of focusing on new innovative ideas. </li>
</ul>
<p>Personally I also feel, education and culture has a lot to do with it. At the same time, it&#8217;s also important to understand how easy or difficult it is to survive in India. India has absolutely no concept of social security. From the very beginning you strive for survival and in case you fail, you are on your own. Most of the people who are just living for survival don&#8217;t want to take chances and play safe. Entrepreneurship in product innovation is a risky game which makes it very difficult to fail in India. That&#8217;s one of the main reasons why people don&#8217;t try to experiment.</p>
<p>A session from Grady Booch was thought provoking in context of current grim economic environment. He gave several examples on how software world has transformed the world we know in recent years. In the face of economic scarcity, the tradition reaction is to retreat, shrink, slash, and/or panic. Very natural considering the tough situations it creates for corporates to survive. The thing about software, however, is that it is perhaps the most fungible and liquid of resources. The supply of software is limited only by human imagination and labor. Grady argued, software-intensive systems are an inescapable and necessary element in helping us operate, innovate, and even thrive in the face of lean economic times.</p>
<p>In all, it was a very informative conference and included participation from around 300-400 software professionals. However time and again, during discussions, I observed a fact that people from software services industry in India and also in other parts of world still follow traditional software development approaches. It creates a lot of issues in outsourcing world. You don&#8217;t show your kitchen anymore, how you build software and the progress on periodic basis. At the end of project, it leads to requirements not met, low quality product and not getting the required features in time. I think Agile Distributed Delivery Model brings a lot of proximity with customer with periodic delivery, always visible (open kitchen approach) quality dashboards and delivering prioritized business goals instead of delivering everything but half baked product.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/07/31/icmg-architecture-world-2009-bangalore/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F07%2F31%2Ficmg-architecture-world-2009-bangalore%2F&amp;title=iCMG%20Architecture%20World%202009%20Bangalore" id="wpa2a_6"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/07/31/icmg-architecture-world-2009-bangalore/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Knowledge Sharing Between Distributed Teams</title>
		<link>http://blog.xebia.com/2009/06/02/knowledge-sharing-between-distributed-teams/</link>
		<comments>http://blog.xebia.com/2009/06/02/knowledge-sharing-between-distributed-teams/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 09:52:16 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[distributed agile]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=1801</guid>
		<description><![CDATA[One of the key USPs of pair-programming is &#8211; it provides value which is more than simple typing. That includes ACTIVE participation in code-review, knowledge sharing on continual basis, frequent design discussions with minimal distractions etc. If you primarily focus on knowledge sharing, pair-programming essentially provides true form of knowledge sharing as instead of looking [...]]]></description>
			<content:encoded><![CDATA[<p>One of the key USPs of pair-programming is &#8211; it provides value which is more than simple typing. That includes ACTIVE participation in code-review, knowledge sharing on continual basis, frequent design discussions with minimal distractions etc. If you primarily focus on knowledge sharing, pair-programming essentially provides true form of knowledge sharing as instead of looking at some bulky heartless documents you sit together with a person who has already worked on the subject and can have conversations and design discussions.</p>
<p><span id="more-1801"></span><br />
It works very well when team is collocated as pair-switching, driver-navigator role change and design discussions in person is quite seamless in collocated environment. </p>
<p>What if you are the part of a distributed team? Developers still pair-up but not necessarily with team-member from distributed location. Though many teams have started implementing the concept of distributed pair-programming with the help of newly available communication tools (Skype for voice conversations and <a href="http://skype.mikogo.com/">Skype Mikogo plugin</a> for desktop sharing to name a few) quite successfully in which developers in distributed locations pair-up with each other . </p>
<p>While working in one such distributed project, we realized that knowledge areas were getting localized as distributed teams used to work on different stories. Standups by nature are brief and don&#8217;t give a lot exact implementation details. Planning-2 meetings help in defining low level design and steps but during implementation those steps are also bound to change sometimes. Because of above mentioned reasons, we felt the need of a forum for knowledge sharing between distributed teams.</p>
<p>We started having distributed knowledge sharing sessions using Skype voice-communication and Mikogo desktop sharing tool and they were quite effective. Even though it may be difficult to grasp entire flow in one session, it still provided a good view on implementation issues which helps in implementing future stories or fixing any maintenance issue quickly,</p>
<p>During those discussions we also used to get design feedback within the team which were helpful in identifying any design flaws, points of improvements, refactoring areas etc.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/06/02/knowledge-sharing-between-distributed-teams/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F06%2F02%2Fknowledge-sharing-between-distributed-teams%2F&amp;title=Knowledge%20Sharing%20Between%20Distributed%20Teams" id="wpa2a_8"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/06/02/knowledge-sharing-between-distributed-teams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Augmented Distributed Agile Teams &#8211; The Need of Local Retrospective</title>
		<link>http://blog.xebia.com/2009/05/21/augmented-distributed-agile-teams-the-need-of-local-retrospective/</link>
		<comments>http://blog.xebia.com/2009/05/21/augmented-distributed-agile-teams-the-need-of-local-retrospective/#comments</comments>
		<pubDate>Thu, 21 May 2009 12:25:34 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Agile]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=1785</guid>
		<description><![CDATA[World is becoming a global village especially in form of communication and the dissemination of information. In context of current economic turmoil and lack of enough trained software professionals locally, distributed Agile is becoming a norm for software project execution. Earlier, most of the times, entire distributed software project used to be executed completely at [...]]]></description>
			<content:encoded><![CDATA[<p>World is becoming a global village especially in form of communication and the dissemination of information. In context of current economic turmoil and lack of enough trained software professionals locally, distributed Agile is becoming a norm for software project execution. </p>
<p>Earlier, most of the times, entire distributed software project used to be executed completely at offshore because of time-zone differences and communication issues. Now because of communication revolution, you see a new trend where software companies like to extend their teams (augmented Agile teams) with different vendors. Recently while working in such a project from a distributed location, we realized the need of local retrospective.</p>
<p><span id="more-1785"></span><br />
As part of retrospective (Scrum practice), at the end of a sprint (iteration), entire team sit together and discusses the good points and points of improvement. At the end of it, entire team converges to vote on the most important &#8220;points of improvements&#8221; which could be implemented in the next sprint.</p>
<p>During one of such retrospectives we realized that sometimes, some points of improvements are local in nature. For instance, team in US may feel strongly about some issues for which Indian team may not feel with the same intensity and vice-versa. </p>
<p>It leads to situations where issues are lost somewhere because of lack of consensus between distributed teams. Sometimes there can be cases in which because of some political and management reasons, the local (vendor) team may not want to discuss some local issues with other part (customer) of team.</p>
<p>In such cases, there used to be some informal discussions on problems within the team but most of the times without any solutions (action points) and action owners. Also those discussions used to be one-on-one discussions but not with entire local team. Not taken seriously, it created even bigger problems for the team in long run.</p>
<p>Finally we realized that we need a formal forum in which entire team sits together, discusses local points of improvements, identify action items and action-owner. Also it&#8217;s important to identify somebody on alternate basis to track the actions taken.</p>
<p>As part of the Agile philosophy of <a href="http://blog.xebia.com/2009/03/06/information-store-is-not-same-as-information-radiator/">keeping information radiator</a> always visible, these retrospective action items should also be visible on Scrum board.</p>
<p>We realized that having local retrospective helped the team a lot as we could focus on many local points of improvements like &#8220;how to gain domain knowledge quickly, how to improve on pair switching etc&#8221; which otherwise wouldn&#8217;t have been possible and could have lost somewhere.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/05/21/augmented-distributed-agile-teams-the-need-of-local-retrospective/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F05%2F21%2Faugmented-distributed-agile-teams-the-need-of-local-retrospective%2F&amp;title=Augmented%20Distributed%20Agile%20Teams%20%26%238211%3B%20The%20Need%20of%20Local%20Retrospective" id="wpa2a_10"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/05/21/augmented-distributed-agile-teams-the-need-of-local-retrospective/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Refactoring Flex application from existing Adobe AIR codebase</title>
		<link>http://blog.xebia.com/2009/03/02/refactoring-flex-application-from-existing-adobe-air-codebase/</link>
		<comments>http://blog.xebia.com/2009/03/02/refactoring-flex-application-from-existing-adobe-air-codebase/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 18:26:00 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Flex]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=899</guid>
		<description><![CDATA[Adobe AIR is a great technology to provide platform-independent desktop RIA applications. Gone are the days when Windows operating system used to be ubiquitous in desktop market. That&#8217;s the reason why Adobe AIR is considered as the future of desktop applications. Desktop applications are here to stay as they come with the power of providing [...]]]></description>
			<content:encoded><![CDATA[<p>Adobe AIR is a great technology to provide platform-independent desktop RIA applications. Gone are the days when Windows operating system used to be ubiquitous in desktop market. That&#8217;s the reason why Adobe AIR is considered as the future of desktop applications. Desktop applications are here to stay as they come with the power of providing rich features in efficient/optimal way compared to browser mode.</p>
<p><span id="more-899"></span></p>
<p>Another side of the coin is &#8211; in the competitive age of software products with two many choices and with a lot of time-crunch, end-user might be a bit lazy in downloading and installing just to be able to look at the features of the application. On the other hand browser based applications are quick to experiment with. In terms of features and power, browser based application may be a subset of desktop application but still provides majority of features for most of the quick users.</p>
<p>We had a similar situation in our project where we had to refactor an existing AIR application to provide support for both browser and AIR versions. To accomplish this task, we found <a href="http://www.adobe.com/devnet/air/flex/articles/flex_air_codebase.html">a good article</a> which provided us a basic architectural approach to do it. </p>
<p>We started with refactoring existing AIR project (ProjectAIR) into two more projects, SharedProject and ProjectWeb (web project). SharedProject contained the common shared code between ProjectAIR and ProjectWeb.</p>
<p>Adobe AIR based applications use windows, file-system, SQL operations etc which needed to be replaced with their counterparts in web version. We abstracted out these functionalities using ActionScript (AS3) interfaces. In other words wherever AS3 code had to be implemented in different ways for AIR and Web version, we identified common abstraction in form of AS3 interfaces and  provided AIR (in ProjectAIR) and Web (in ProjectWeb) based implementations.</p>
<p>We used <a href="http://www.pranaframework.org/">Spring ActionScript</a>, an ActionScript dependency injection framework, to inject appropriate AS3 interface implementations based on applications we are using (different applicationContext.xml for ProjectAIR and ProjectWeb).</p>
<p>As AIR version is able to work on files (say images), we had to provide a similar functionality in web version also. It was just not possible in Flash 9 as it is a violation of sandbox security. Recently Flash 10 introduced a new feature of read/write files in flash player without any need to send anything back to the server. We used recently introduced Flex 3.2 SDK to access these features. Instead of storing data in file-system (possible in AIR), we used SharedObject (Flex cookie) to store the user-information on desktop.</p>
<p>One of the major issue comes when you have to reuse View (MXML). For some views where it was just not possible, we created different views (one each for web and AIR version). However for majority we could refactor and reuse them. We refactored the Views and taken out any AIR specific functionality. They became base version of view which could either be directly used in web version or needed to be extended for both web and AIR versions. We created a nomenclature something like <ViewA>AIR and <ViewA>Web (e.g. InvoiceViewAIR.mxml and InvoiceViewWeb.mxml which extend from InvoiceView.mxml). For instance InvoiceViewAIR.mxml (extends from InvoiceView.mxml) could be something like this.</p>
<pre lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<InvoiceView
	nativeDragEnter="onNativeDragEnter(event)"
	nativeDragDrop="onNativeDragDrop(event)"
	xmlns="com.xxx.product.*"
	xmlns:mx="http://www.adobe.com/2006/mxml">

	<mx:Script>
		<![CDATA[
			private function onNativeDragEnter(nativeDragEvent:NativeDragEvent):void
			{
                           ...
			}

			private function onNativeDragDrop(nativeDragEvent:NativeDragEvent):void
			{
                           ...
			}
	       ]]&gt;
        </mx:Script>
</InvoiceView>
</pre>
<p>Using above mentioned techniques, we finally were able to run the application in both AIR and web-browser and it was a wonderful moment for us.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/03/02/refactoring-flex-application-from-existing-adobe-air-codebase/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F03%2F02%2Frefactoring-flex-application-from-existing-adobe-air-codebase%2F&amp;title=Refactoring%20Flex%20application%20from%20existing%20Adobe%20AIR%20codebase" id="wpa2a_12"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/03/02/refactoring-flex-application-from-existing-adobe-air-codebase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting through Popup Blockers with window.open() in Flex</title>
		<link>http://blog.xebia.com/2009/01/04/getting-through-popup-blockers-with-windowopen-in-flex/</link>
		<comments>http://blog.xebia.com/2009/01/04/getting-through-popup-blockers-with-windowopen-in-flex/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 04:35:31 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[General]]></category>
		<category><![CDATA[Flex]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=863</guid>
		<description><![CDATA[It was a few years back when I last worked with Javascript. Things have changed significantly in between and one of the things which we people always like is the introduction of popup-blockers in browser world. I hope you remember those old days when it was a nuisance to close all those uninvited windows. Now [...]]]></description>
			<content:encoded><![CDATA[<p>It was a few years back when I last worked with Javascript. Things have changed significantly in between and one of the things which we people always like is the introduction of popup-blockers in browser world. I hope you remember those old days when it was a nuisance to close all those uninvited windows. Now we are living in a relatively peaceful world. But sometimes we also want to open new windows for legitimate reasons. So when I had a task to open a new browser window on button-click, I discovered the problems posed by popup-blockers. The interesting part is &#8211; window.open() behavior can be different for different browsers and popup-blockers.</p>
<p><span id="more-863"></span></p>
<p>One of the things which is common amongst all browsers is &#8211; popup should open from a user action like button-click, link click etc. Popup-blockers almost always block windows opened without user-actions which looks fine to me as otherwise spammers could open dozens of windows without asking you. However this posed a bit of problem in Flex for me. I wanted to open a window after invoking some backend services. As responses (results from web-services) coming from Flex events are always asynchronous, it was just not possible to open the window after having some backend interaction. I had to change some of my design.</p>
<p>Another problem was different browsers behaviors. In some browsers Flex based ExternalInterface.call() method works and on some navigationToURL(). While solving this problem, I came across with a <a href="http://www.mehtanirav.com/2008/11/27/opening-external-links-in-new-window-from-as3">good link</a> which solves most of the window.open() issues on different browsers.</p>
<p>Safari poses yet another challenge when it comes to using window.focus() function. In many of the situations you&#8217;d like to open one single named window (important from usability perspective). While using the same window for a new URL, you may want to put focus on exiting window using window.focus() function. Safari doesn&#8217;t support window.focus() function. I tried to find a suitable alternative but nothing worked except close and open the window again as follows:</p>
<pre lang="javascript">
var newwindow = '';
function popitup(url) {
    if (!newwindow.closed &#038;&#038; newwindow.location) {
        newwindow.close();
        newwindow=window.open(url,'name'+Math.random(),'height=600,width=800');
    }
    else {
        newwindow=window.open(url,'name','height=600,width=800');
        if (!newwindow.opener) newwindow.opener = self;
    }
    return false;
}
</pre>
<p>Please note I used a new window name every time I close a window. Again in Safari one cannot reopen the same named window after closing it.</p>
<p>I also used following references which were helpful for me.</p>
<ul>
<li><a href="http://www.quirksmode.org/js/croswin.html">Javascript &#8211; Cross window scripting</a></li>
<li><a href="http://www.webmaster-talk.com/javascript-forum/105303-about-window-open-in-safari.html">about window.open() in safari</a></li>
</ul>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/01/04/getting-through-popup-blockers-with-windowopen-in-flex/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F01%2F04%2Fgetting-through-popup-blockers-with-windowopen-in-flex%2F&amp;title=Getting%20through%20Popup%20Blockers%20with%20window.open%28%29%20in%20Flex" id="wpa2a_14"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/01/04/getting-through-popup-blockers-with-windowopen-in-flex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Article Series: &#8220;Automated code reviews with Checkstyle&#8221; on JavaWorld</title>
		<link>http://blog.xebia.com/2008/11/26/article-series-automated-code-reviews-with-checkstyle-on-javaworld/</link>
		<comments>http://blog.xebia.com/2008/11/26/article-series-automated-code-reviews-with-checkstyle-on-javaworld/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 23:23:44 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Frameworks]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=821</guid>
		<description><![CDATA[Today JavaWorld published my article series &#8220;Automated code reviews with Checkstyle&#8221; in 2 parts. Part 1: Automated code reviews with Checkstyle, Part 1 Part 2: Automated code reviews with Checkstyle, Part 2 This article series attempts to bridge the gap of code review with applying automated Checkstyle checks in a complete and proactive way. First [...]]]></description>
			<content:encoded><![CDATA[<p>Today JavaWorld published my article series &#8220;Automated code reviews with Checkstyle&#8221; in 2 parts.</p>
<p>Part 1:<br />
<a href="http://www.javaworld.com/javaworld/jw-11-2008/jw-11-checkstyle1.html ">Automated code reviews with Checkstyle, Part 1</a></p>
<p>Part 2:<br />
<a href="http://www.javaworld.com/javaworld/jw-11-2008/jw-11-checkstyle2.html ">Automated code reviews with Checkstyle, Part 2</a></p>
<p>This article series attempts to bridge the gap of code review with applying automated Checkstyle checks in a complete and proactive way. First goal is to make the task of custom Checkstyle rules creation so simple so that any enterprise IT team could create new custom rules suiting to their project (IT standards) needs.</p>
<p>Second goal is to apply these rules in PROCTIVE fashion. Instead of waiting the build to fail or waiting for rule violation reports and working on them in a reactive way, the idea is to apply these checks proactively with Checkstyle Eclipse plugin or applying them at SVN level itself. Irrespective of which IDE you are using, if your code contains some of the high severity violations, you will not be able to commit the code in SVN. You will see the same kind errors and location on SVN console as you see with Eclipse plugin. This is achieved using SVN pre-commit hooks.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2008/11/26/article-series-automated-code-reviews-with-checkstyle-on-javaworld/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2008%2F11%2F26%2Farticle-series-automated-code-reviews-with-checkstyle-on-javaworld%2F&amp;title=Article%20Series%3A%20%26%238220%3BAutomated%20code%20reviews%20with%20Checkstyle%26%238221%3B%20on%20JavaWorld" id="wpa2a_16"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2008/11/26/article-series-automated-code-reviews-with-checkstyle-on-javaworld/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Productive Tools on top of Flex Builder 3</title>
		<link>http://blog.xebia.com/2008/11/16/productive-tools-on-top-of-flex-builder-3/</link>
		<comments>http://blog.xebia.com/2008/11/16/productive-tools-on-top-of-flex-builder-3/#comments</comments>
		<pubDate>Sun, 16 Nov 2008 18:48:38 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[General]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Flex]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=800</guid>
		<description><![CDATA[As I got introduced to Flex world some times back, I started using Flex Builder as an IDE, a product from Adobe on top of Eclipse platform. I assumed that it&#8217;ll provide all the basic features available in Eclipse for Java, but I was wrong. Flex Builder is in nascent phase from tooling point of [...]]]></description>
			<content:encoded><![CDATA[<p>As I got introduced to Flex world some times back, I started using Flex Builder as an IDE, a product from Adobe on top of Eclipse platform. I assumed that it&#8217;ll provide all the basic features available in Eclipse for Java, but I was wrong. Flex Builder is in nascent phase from tooling point of view. Just to refresh your memories, Flex Builder lacks some of the following Eclipse features.</p>
<p><span id="more-800"></span></p>
<ol>
<li>Support for generating getters-setters automatically.</li>
<li>Support of templates for creating constants.</li>
<li>Organize imports. If some type has not been included already, organize-import should do that.</li>
<li>Better refactoring support. Right now refactoring is just limited to renaming and you start missing real sense of refactoring in terms of creating new methods etc.</li>
<li>Sometimes you may want to create your own templates for creating ASDoc instead of doing it from the scratch all the time</li>
<li>Formatting ActionScript/Flex files</li>
</ol>
<p>I did some research on internet and found some options to resolve these problems.</p>
<h3>Eclipse Monkey</h3>
<p>Eclipse Monkey currently is a part of <a href="http://www.eclipse.org/dash/">Eclipse Dash</a> project. It is <a href="http://www.eclipse.org/proposals/eclipse-monkey/">proposed</a> to be split from Dash to make it full-fledged project in itself. It&#8217;s a very powerful tool. Instead of extending Eclipse platform through creating plugins, you can extend Eclipse functionality through some scripting. Eclipse Monkey uses the Mozilla <a href="http://www.mozilla.org/rhino/">Rhino Javascript interpreter</a>  at its core. You guessed it right, scripting couldn&#8217;t have been easier for Eclipse than the way it does with Monkey using Javascript.</p>
<p>Eclipse Monkey can be used to create getters and setters in ActionScript in automated fashion. You may want to take a look on a <a href="http://eokyere.blogspot.com/2007/09/productivity-with-dash-in-eclipse.html">~eokyere blog</a> to see how Monkey is used to create getters and setters. As I searched some more available Monkey scripting resources, I found more examples and <a href="http://rs145gc2.rapidshare.com/files/119902972/Actionscript_Code_Generate_Scripts_1.0_by_Panel.zip">one of them</a> satisfied my problem no 2 also.</p>
<p>If you have already downloaded and executed Monkey scripts on your Eclipse platform, you may have realized how powerful this Scripting tool is for Eclipse. You can create a lot of scripting based tools to enhance productivity without creating specialized plugin.</p>
<h3>FDT ActionScript Editor</h3>
<p>For rest of the problems mentioned above, I tried many options but somehow they didn&#8217;t provide desired outcome. However one ActionScript based editor <a href="http://fdt.powerflasher.com/">FDT</a> comes very close. It supports most of features mentioned in the list and is certainly a better choice from ActionScript editor point of view. However it&#8217;s not free and sometimes I wonder why somebody will invest yet another €599 to buy this tool if he already has Flex Builder. Flex Builder is a defacto tool for Flex based development whereas FDT mainly focuses on ActionScript based programming. FDT doesn&#8217;t support MXML yet.</p>
<p>No wonder that we come to conclude that Flex Builder has a lot to catch up in terms of enhancing its tooling for Flex developers. However the tools I just mentioned come a bit close in providing the required support.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2008/11/16/productive-tools-on-top-of-flex-builder-3/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2008%2F11%2F16%2Fproductive-tools-on-top-of-flex-builder-3%2F&amp;title=Productive%20Tools%20on%20top%20of%20Flex%20Builder%203" id="wpa2a_18"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2008/11/16/productive-tools-on-top-of-flex-builder-3/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Current Architectural Frameworks Developments in Flex</title>
		<link>http://blog.xebia.com/2008/11/08/current-architectural-frameworks-developments-in-flex/</link>
		<comments>http://blog.xebia.com/2008/11/08/current-architectural-frameworks-developments-in-flex/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 20:34:54 +0000</pubDate>
		<dc:creator>ShriKant Vashishtha</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[cairngorm]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[fluint]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[prana]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=785</guid>
		<description><![CDATA[Flex provides means to create RIA applications in declarative fashion using MXML. Unlike Swing where you need to do the entire coding in Java, Flex hides a lot of complexity behind MXML tags like JSTL/taglibs do for JSPs. In JSP world, view level scripting is done in JavaScript and presentation layer server side code is [...]]]></description>
			<content:encoded><![CDATA[<p>Flex provides means to create RIA applications in declarative fashion using MXML. Unlike Swing where you need to do the entire coding in Java, Flex hides a lot of complexity behind MXML tags like JSTL/taglibs do for JSPs. In JSP world, view level scripting is done in JavaScript and presentation layer server side code is written in Java which kind of provides a separation between client side code and server side code. If you really want to do some dynamic stuff on JSPs, either you write some Java code inside JSP (not recommended though) or you use/create taglibs to achieve the same effect. In Flex world, it&#8217;s all about ActionScript (AS). Irrespective of whether you are writing some scripting or server side code, it&#8217;s all AS code which kind of creates a confusing situation in front of a developer. It becomes very difficult to separate the scripting code from server side code. That&#8217;s one of the reasons people complain about Flex as it looks like it doesn&#8217;t provide a clear separation between scripting code and server side code.</p>
<p><span id="more-785"></span></p>
<p>Because of all those reasons, some frameworks have been created in Flex world to provide MVC pattern implementation. One such frameworks is <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a> which is an architectural framework to provide the separation between different MVC layers using some of the very well known design patterns from JEE world. So it may sound quite familiar to you if I talk about <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html">Front Controller</a>, <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html">Business Delegate</a>, <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html">Service Locator</a>, GOF Command Pattern and <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html">Value Object</a> patterns. Flex world still calls Data Transfer Object (DTO) pattern as Value Object because of some reasons. Along with all mentioned patterns it uses one more design pattern which is specific to Flex world and is called <a href="http://www.bigroom.co.uk/blog/improving-cairngorms-modellocator">Model Locator</a> design pattern. This pattern is based on singleton pattern though.</p>
<p>Now while I talk about these design patterns, you may wonder that some of these patterns reduces testability a lot because of their singleton nature. Service Locator tries to get the dependencies instead of being injected. To resolve all these problems, you may wonder that there has to be a Spring like dependency injection framework in Flex world too. You are absolutely right. There is one and is called <a href="http://www.pranaframework.org/">prana framework</a>. Now if you use prana on top of Cairngorm framework, you automatically remove the need of creating Controller classes, Service Locator, singleton nature of Model Locator etc. Also automatically it enhances the testability of the applications and encourages programming to interfaces.</p>
<p>However while using prana you may come across with a problem. You define the actual implementation of the interface in applicationContext.xml but mxml compiler does not include these dependencies while creating resultant SWF file because it doesn&#8217;t see these dependencies in the actual code. It may result in a lot of runtime errors. To resolve these problems, generally implementations are included in the main MXML file just for compilation sake which you already know is error prone. I should call it as the limitation of Flex framework as currently it&#8217;s not able to resolve the dependencies with prana based applicatonContext.xml files. To resolve this, some people create tools to generate the Factory classes from applicationComtext.xml to get actual implementation.</p>
<p>The prana framework is in 0.6 release right now and as you expect it yet again, it requires a similar IDE as you have for Spring (SpringIDE). Even after removing all above problems in Cairngorm with the help of &#8220;prana&#8221;, Cairngorm still has some other problems which then are removed using <a href="http://code.google.com/p/flexcairngorm/">cairngorm UM extensions</a>.</p>
<p>For unit testing purposes, we have <a href="http://code.google.com/p/as3flexunitlib/">FlexUnit framework</a> but it doesn&#8217;t meet some of the requirements of unit testing like testing asynchronous code and other similar problems. To resolve them currently people use <a href="http://fluint.googlecode.com/ ">fluint framework</a> which is a unit-test as well as integration test framework. Similar to Selenium web application testing framework Flex world currently has <a href="http://code.google.com/p/flexmonkey/">FlexMonkey</a> to test Flex UI.</p>
<p>Flex build is mostly done on ANT which provides a low level build abstraction compared to Maven 2. Flex world currently lacks good Maven plugins. On similar note, FlexBuilder (an Eclipse based Flex IDE) needs many improvements in IDE in the areas of code refactoring (refactoring support for ActionScript classes other than renaming) and other very usual Eclipse based code generation.</p>
<p>As you already can see that Flex world is going through with a lot of architectural frameworks changes currently. Most of the time, they are Flex specific implementations of already proven existing JEE architectural frameworks/design patterns. In coming time, Flex world is expected to have more matured frameworks which will make the life of a developer easier and software more maintainable.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2008/11/08/current-architectural-frameworks-developments-in-flex/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2008%2F11%2F08%2Fcurrent-architectural-frameworks-developments-in-flex%2F&amp;title=Current%20Architectural%20Frameworks%20Developments%20in%20Flex" id="wpa2a_20"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2008/11/08/current-architectural-frameworks-developments-in-flex/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.xebia.com/author/vashishtha/feed/ ) in 1.09680 seconds, on Feb 9th, 2012 at 4:52 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 9th, 2012 at 5:52 pm UTC -->
