<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Francesco Iovine</title>
	
	<link>http://www.francesco.iovine.name/blog</link>
	<description>My life @ work</description>
	<lastBuildDate>Sun, 19 Jul 2009 09:43:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<image><link>http://franciov.altervista.org/blog/</link><url>http://franciov.altervista.org/blog/wordpress/wp-content/themes/franciov/images/francesco.jpg</url><title>Franciov</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/franciov_professional" type="application/rss+xml" /><feedburner:emailServiceId>franciov_professional</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Spring AbstractWizardFormController, how to manipulate pages at runtime</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/yHof_F8wfbo/</link>
		<comments>http://www.francesco.iovine.name/blog/2009/07/19/spring-abstractwizardformcontroller-how-to-manipulate-pages-at-runtime/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 02:20:14 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/?p=201</guid>
		<description><![CDATA[The Abstract Wizard Form Controller is a form controller for typical wizard-style workflows, provided by the Spring Framework.
In contrast to classic forms, wizards have more than one form view page.  Therefore, there are various actions instead of one single submit action:

finish: trying to leave the wizard successfully, i.e. performing its  final action, and [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="Spring Framework API 2.5" href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/portlet/mvc/AbstractWizardFormController.html" target="_blank">Abstract Wizard Form Controller</a> is a form controller for typical wizard-style workflows, provided by the <a title="SpringSource.org" href="http://www.springsource.org/" target="_blank">Spring Framework</a>.</p>
<blockquote><p>In contrast to classic forms, wizards have more than one form view page.  Therefore, there are various actions instead of one single submit action:</p>
<ul>
<li>finish: trying to leave the wizard successfully, i.e. performing its  final action, and thus needing a valid state;</li>
<li>cancel: leaving the wizard without performing its final action, and  thus without regard to the validity of its current state;</li>
<li>page change: showing another wizard page, e.g. the next or previous  one, with regard to &#8220;dirty back&#8221; and &#8220;dirty forward&#8221;.</li>
</ul>
</blockquote>
<p>In this article I want to focus on pages, how to set them up, expecially in the uncommon situation in which you don&#8217;t know exactly the number of pages you want to put in your wizard before running the application.</p>
<p>Every Spring manual would suggest you to put WizardFormController&#8217;s pages in the Spring XML configuration file, and actually this is the best way to set up your pages. Let&#8217;s consider the following configuration:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">name</span>=<span class="st0">&quot;myWizardForm&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">class</span>=<span class="st0">&quot;forms.MyWizardForm&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span></p>
<p>&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">name</span>=<span class="st0">&quot;/myWizard.html&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">class</span>=<span class="st0">&quot;control.MyWizardFormController&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">p:sessionForm</span>=<span class="st0">&quot;true&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">p:commandClass</span>=<span class="st0">&quot;forms.MyWizardForm&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">p:commandName</span>=<span class="st0">&quot;myWizardForm&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;pages&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;list<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;value<span class="re2">&gt;</span></span></span>page0<span class="sc3"><span class="re1">&lt;/value<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;value<span class="re2">&gt;</span></span></span>page1<span class="sc3"><span class="re1">&lt;/value<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;value<span class="re2">&gt;</span></span></span>page2<span class="sc3"><span class="re1">&lt;/value<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/list<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/property<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span></div>
</div>
<p>We have put a <i>property</i> named <i>pages</i> inside <i>myWizard.html</i> bean, in which we listed the page values. Each value is used as the name of the view inside your <i>jsp</i> folder.</p>
<p>And now the wizard form, you can set it up for your needs.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">public</span> <span class="kw2">class</span> MyWizardForm <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// put your fields here</span></p>
<p>&nbsp; &nbsp; <span class="kw2">public</span> MyWizardForm<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// initialization</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// put your setters and getters here</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Finally the wizard controller.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">public</span> <span class="kw2">class</span> MyWizardFormController <span class="kw2">extends</span> AbstractWizardFormController <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">public</span> MyWizardFormController<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMap+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Map</span></a> referenceData<span class="br0">&#40;</span>HttpServletRequest request, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> command, Errors errors, <span class="kw4">int</span> page<span class="br0">&#41;</span> <span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMap+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Map</span></a> map = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AHashMap+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">HashMap</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// put information you need into the map</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> map;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">protected</span> ModelAndView processFinish<span class="br0">&#40;</span>HttpServletRequest request, HttpServletResponse response, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> object, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABindException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BindException</span></a> exception<span class="br0">&#41;</span> <span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">new</span> ModelAndView<span class="br0">&#40;</span><span class="st0">&quot;finish&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</div>
<p>What if, for some reasons, you need to create or edit your wizard page list at runtime? Let&#8217;s face the problem.</p>
<p>First of all, you can override the XML configuration through the <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/portlet/mvc/AbstractWizardFormController.html#setPages(java.lang.String[])" target="_blank">setPages</a> method. The following example replaces the page list specified in the XML file with an identical one but that has been built at run-time in MyWizardFormController constructor.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">public</span> MyWizardFormController<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pages<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; pages<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;page0&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; pages<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> = <span class="st0">&quot;page1&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; pages<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> = <span class="st0">&quot;page2&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">setPages</span><span class="br0">&#40;</span>pages<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>This doesn&#8217;t help much: we moved the configuration outside XML (that&#8217;s a bad thing) but we still have a fixed number of pages with fixed values.</p>
<p>Let&#8217;s consider an application in which the page values are the request parameter keys for the first step (i.e. _target0). We might call <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/portlet/mvc/AbstractWizardFormController.html#setPages(java.lang.String[])" target="_blank">setPages</a> inside an overridden method used before the wizard controller accesses to page list, such as the <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/portlet/mvc/AbstractWizardFormController.html#getInitialPage(javax.portlet.PortletRequest)" target="_blank">getInitialPage</a> method.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">public</span> <span class="kw2">class</span> MyWizardFormController <span class="kw2">extends</span> AbstractWizardFormController <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">public</span> MyWizardFormController<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw4">int</span> getInitialPage<span class="br0">&#40;</span>HttpServletRequest request, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> command<span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// override pages only when the target page is 0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">this</span>.<span class="me1">getTargetPage</span><span class="br0">&#40;</span>request, <span class="nu0">0</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// retrieve keys from request parameters</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASet+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Set</span></a> parameters = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AHashSet+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">HashSet</span></a><span class="br0">&#40;</span>request.<span class="me1">getParameterMap</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Iterator</span></a> parametersIterator = parameters.<span class="me1">iterator</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pages<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span>parameters.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">1</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> i = <span class="nu0">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// fill wizard pages</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>parametersIterator.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> page = <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#41;</span> parametersIterator.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// let&#8217;s ignore the &#8216;_target0&#8242; parameter key</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>page.<span class="me1">startsWith</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span><span class="br0">&#41;</span> == <span class="kw2">false</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pages<span class="br0">&#91;</span>i<span class="br0">&#93;</span> = page;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">setPages</span><span class="br0">&#40;</span>pages<span class="br0">&#41;</span>; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">super</span>.<span class="me1">getInitialPage</span><span class="br0">&#40;</span>request, command<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</div>
<p>In this way, as soon as <i>myWizard.html</i> bean is invoked by clicking on a link (i.e. GET http request) or submitting a form (i.e. POST http request), the page list is dinamically built starting from request parameter keys. This would be more useful if you decide to use request parameters values, or attributes.</p>
<p>For my purposes I used request parameter keys retrieved from a form submission in order to run an unordered set of pages and reporting each result (i.e. validation) in the final step.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=yHof_F8wfbo:Gr4MMV0-9wI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=yHof_F8wfbo:Gr4MMV0-9wI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=yHof_F8wfbo:Gr4MMV0-9wI:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=yHof_F8wfbo:Gr4MMV0-9wI:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=yHof_F8wfbo:Gr4MMV0-9wI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=yHof_F8wfbo:Gr4MMV0-9wI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=yHof_F8wfbo:Gr4MMV0-9wI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=yHof_F8wfbo:Gr4MMV0-9wI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=yHof_F8wfbo:Gr4MMV0-9wI:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2009/07/19/spring-abstractwizardformcontroller-how-to-manipulate-pages-at-runtime/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2009/07/19/spring-abstractwizardformcontroller-how-to-manipulate-pages-at-runtime/</feedburner:origLink></item>
		<item>
		<title>Nokia Ovi Store – Device and Application Heterogeneity</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/jjKqNc3HwKQ/</link>
		<comments>http://www.francesco.iovine.name/blog/2009/07/03/nokia-ovi-store-device-and-application-heterogeneity/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 17:50:56 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[mobile]]></category>
		<category><![CDATA[nokia]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/?p=115</guid>
		<description><![CDATA[ 

Its name is Ovi Store, has been announced at the Mobile World Congress 2009 (Barcelona) in February, and on May 26 it went live for all Nokia users in the world. More than 50 Nokia devices were compatible with the service from day one and Nokia estimated that around 50 million people with Nokia [...]]]></description>
			<content:encoded><![CDATA[<p><span id="ucPreviewMsg_lblMessage" class="PreviewMsgText visualIEFloatFix"> </span></p>
<p><img class="size-medium wp-image-183 alignleft" title="nokia-ovi-logo" src="http://www.francesco.iovine.name/blog/wp-content/uploads/2009/07/nokia-ovi-logo-300x190.jpg" alt="nokia-ovi-logo" width="180" height="114" /></p>
<p>Its name is <a href="https://store.ovi.com/" target="_blank">Ovi Store</a>, has been announced at the <a href="http://www.mobileworldcongress.com/" target="_blank">Mobile World Congress</a> 2009 (Barcelona) in February, and on May 26 it went live for all Nokia users in the world. More than 50 Nokia devices were compatible with the service from day one and Nokia estimated that around 50 million people with Nokia devices would be able to benefit for Ovi Store. Initial number of applications was 20.000 and new applications creation is propelled by an high percentage of money going to developers. Moreover the Nokia N97 will be the first to come out with Ovi Store pre-installed.</p>
<p>The <a href="http://www.globalintelligence.com/group/" target="_blank">Global Intelligence Alliance Group</a> conducted an interesting <strong>analysis on  mobile market places</strong>. Different market places have been compared in terms of:</p>
<ol>
<li>time to market</li>
<li>the ability to attract developers</li>
<li>the rate of device adoption</li>
<li>an efficient interface and user experience</li>
<li>having a critical mass of attractive applications.</li>
</ol>
<p>to get the following rankings table:</p>
<table style="border: 1px solid; height: 313px;" border="0" width="500">
<tbody>
<tr>
<td style="border: 1px solid ; text-align: center">Application Marketplace</td>
<td style="border: 1px solid ; text-align: center"><strong>iPhone Apps Store </strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Android Marketplace </strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Ovi Apps Store</strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Windows Mobile Skymarket </strong></td>
<td><strong>Blackberry Apps Storefront </strong></td>
<td><strong>webOS Software Store </strong></td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center">Manufacturer</td>
<td style="border: 1px solid ; text-align: center"><strong>Apple</strong></td>
<td style="border: 1px solid ; text-align: center"><strong>OHA</strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Nokia</strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Microsoft</strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Research In Motion</strong></td>
<td style="border: 1px solid ; text-align: center"><strong>Palm</strong></td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center">Time to market</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">0</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">0</td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center">Attracting developers</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">1</td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center">Device adoption / rollout</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">0</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">0</td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center">Interface / user experience</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">2</td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center">Number, variety and appeal of apps</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">1</td>
<td style="border: 1px solid ; text-align: center">0</td>
<td style="border: 1px solid ; text-align: center">2</td>
<td style="border: 1px solid ; text-align: center">0</td>
<td style="border: 1px solid ; text-align: center">0</td>
</tr>
<tr>
<td style="border: 1px solid ; text-align: center"><strong> Summary</strong></td>
<td style="border: 1px solid ; text-align: center"><strong> 9</strong></td>
<td style="border: 1px solid ; text-align: center"><strong> 7</strong></td>
<td style="border: 1px solid ; text-align: center"><strong> 7</strong></td>
<td style="border: 1px solid ; text-align: center"><strong> 6</strong></td>
<td style="border: 1px solid ; text-align: center"><strong> 5</strong></td>
<td style="border: 1px solid ; text-align: center"><strong> 3</strong></td>
</tr>
</tbody>
</table>
<p>Source: Global Intelligence Alliance. Points are allocated as follows: 2 – strong, 1 – medium, 0 – weak based on assessment/expectations of all application stores along the parameters.</p>
<p>It&#8217;s interesting to note that Nokia&#8217;s rank is two points lower than iPhone Apps Store&#8217;s, but equal to Android Marketplace&#8217;s. Further information in the <a href="http://www.globalintelligence.com/insights-analysis/press-releases/2009/apple-emerges-ahead-of-oha-s-android-and-nokia-s-o/" target="_blank">Global Intelligence Alliance&#8217;s article</a>.</p>
<p>What distinguish Nokia Ovi Store from the other marketplaces is the <strong>device and application heterogeneity</strong> Nokia had to manage and offers. Despite iPhone Apps Store, that is clearly made for one phone, Nokia Ovi Store covers more than 50 Nokia devices, Series 40 and Series 60 included, and because of this for each mobile application the Ovi Store needs to indicate the device compatibility. Moreover, even if every application you can find inside the Ovi Store behaves and looks like it has been developed using the same technology, the same programming language, it doesn&#8217;t ! In fact, a Nokia application you download from Ovi Store might be:</p>
<ol>
<li>A Nokia Symbian Mobile Application</li>
<li>A Java Application (MIDlet)</li>
<li>A Nokia WRT Widget</li>
</ol>
<p>This might be seen as an advantage for the developer because she/he has the chance to choose the technology which likes more or which better fits to application features or customer requirements. And maybe it is, we&#8217;ll see what happens in the next few months.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=jjKqNc3HwKQ:xMuOFWJ8K8k:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=jjKqNc3HwKQ:xMuOFWJ8K8k:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=jjKqNc3HwKQ:xMuOFWJ8K8k:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=jjKqNc3HwKQ:xMuOFWJ8K8k:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=jjKqNc3HwKQ:xMuOFWJ8K8k:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=jjKqNc3HwKQ:xMuOFWJ8K8k:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=jjKqNc3HwKQ:xMuOFWJ8K8k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=jjKqNc3HwKQ:xMuOFWJ8K8k:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=jjKqNc3HwKQ:xMuOFWJ8K8k:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2009/07/03/nokia-ovi-store-device-and-application-heterogeneity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2009/07/03/nokia-ovi-store-device-and-application-heterogeneity/</feedburner:origLink></item>
		<item>
		<title>Addicted to Twitter</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/65kLk6BqlJo/</link>
		<comments>http://www.francesco.iovine.name/blog/2009/06/21/addicted-to-twitter/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 18:47:31 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[blaugh]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/?p=173</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a rel="bookmark" href="http://blaugh.com/2008/03/12/addicted-to-twitter"><img class="comic" title="Addicted to Twitter" src="http://blaugh.com/cartoons/120308_twitter_addicted.gif" alt="Addicted to Twitter" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=65kLk6BqlJo:ylWam7c_pCU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=65kLk6BqlJo:ylWam7c_pCU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=65kLk6BqlJo:ylWam7c_pCU:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=65kLk6BqlJo:ylWam7c_pCU:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=65kLk6BqlJo:ylWam7c_pCU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=65kLk6BqlJo:ylWam7c_pCU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=65kLk6BqlJo:ylWam7c_pCU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=65kLk6BqlJo:ylWam7c_pCU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=65kLk6BqlJo:ylWam7c_pCU:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2009/06/21/addicted-to-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2009/06/21/addicted-to-twitter/</feedburner:origLink></item>
		<item>
		<title>My widget-based and social network-oriented web site</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/b7THf_WucgI/</link>
		<comments>http://www.francesco.iovine.name/blog/2009/06/16/my-widget-based-and-social-network-oriented-web-site/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 23:46:27 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2009/06/16/my-widget-based-and-social-network-oriented-web-site/</guid>
		<description><![CDATA[Long time no post. I&#8217;ve been busy with a lot of things, such as MSc dissertation and work. Yes, I found a job, I&#8217;m a mobile software developer now. I work for Opentech ENG.
However in this post I just want to show you my new widget-based and social network-oriented personal web site.
http://www.francesco.iovine.name/
To achieve this, I [...]]]></description>
			<content:encoded><![CDATA[<p>Long time no post. I&#8217;ve been busy with a lot of things, such as MSc dissertation and work. Yes, I found a job, I&#8217;m a mobile software developer now. I work for <a href="http://www.opentecheng.com/">Opentech ENG</a>.</p>
<p>However in this post I just want to show you my new <em>widget-based</em> and <em>social network-oriented</em> personal web site.</p>
<p><a href="http://www.francesco.iovine.name/">http://www.francesco.iovine.name/</a></p>
<p>To achieve this, I used the badge creation feature provided by each social network I&#8217;m on, which are Facebook, Flickr, Twitter and LinkedIn. In details:</p>
<ul>
<li><a href="http://www.facebook.com/badges.php">Facebook Badges</a>. Highly customisable but doesn&#8217;t work so good yet. In my case the HTML code generator created a wrong code, so I had to pick up HTML code directly from the preview badge ! ^^&#8217;</li>
<li><a href="http://www.flickr.com/badge.gne">Flickr Badge</a>. Available both in HTML and in Flash. Highly customisable, works fine !</li>
<li><a href="http://twitter.com/badges">Twitter Badge</a>. The HTML badges are customisable only via CSS stylesheet. Flash badges are both interactive and display-only, pretty but almost not customisable.</li>
<li>LinkedIn doesn&#8217;t provide a badge creation feature, so I used a linked banner.</li>
</ul>
<p><span style="text-decoration: line-through;">In order to create widgets from my blog feeds, I used <a href="http://customrss.googlepages.com/">CustomRSS</a>, an highly customizable Google Gadget.</span></p>
<p><strong>UPDATE 21/06/2009</strong>: I added graphical effects to achieve a presentation fashion. I used <a href="http://docs.jquery.com/Effects">JQuery effects</a>, in particular <em>fadeIn</em>, <em>fadeOut</em> and <em>animate</em> functions.</p>
<p><strong>UPDATE 04/07/2009</strong>: CustomRSS doesn&#8217;t work properly anymore, therefore in order to republish my feeds as HTML I used <a href="http://feedburner.google.com/fb/a/buzzboost" target="_blank">Feedburner BuzzBost</a> at its place.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=b7THf_WucgI:WXe85lbMSMo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=b7THf_WucgI:WXe85lbMSMo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=b7THf_WucgI:WXe85lbMSMo:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=b7THf_WucgI:WXe85lbMSMo:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=b7THf_WucgI:WXe85lbMSMo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=b7THf_WucgI:WXe85lbMSMo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=b7THf_WucgI:WXe85lbMSMo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=b7THf_WucgI:WXe85lbMSMo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=b7THf_WucgI:WXe85lbMSMo:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2009/06/16/my-widget-based-and-social-network-oriented-web-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2009/06/16/my-widget-based-and-social-network-oriented-web-site/</feedburner:origLink></item>
		<item>
		<title>Abusing Google…</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/4lwWy9VkG3o/</link>
		<comments>http://www.francesco.iovine.name/blog/2007/12/20/abusing-google-2/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 22:37:43 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2007/12/20/abusing-google/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img id="image111" src="http://www.francesco.iovine.name/blog/wp-content/uploads/2007/12/abusing_google.jpg" alt="Abusing Google" /></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=4lwWy9VkG3o:8u1SgME5frM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=4lwWy9VkG3o:8u1SgME5frM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=4lwWy9VkG3o:8u1SgME5frM:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=4lwWy9VkG3o:8u1SgME5frM:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=4lwWy9VkG3o:8u1SgME5frM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=4lwWy9VkG3o:8u1SgME5frM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=4lwWy9VkG3o:8u1SgME5frM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=4lwWy9VkG3o:8u1SgME5frM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=4lwWy9VkG3o:8u1SgME5frM:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2007/12/20/abusing-google-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2007/12/20/abusing-google-2/</feedburner:origLink></item>
		<item>
		<title>Software Architecture: Perspectives on a Maturing Discipline</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/GSUcx3qSnhs/</link>
		<comments>http://www.francesco.iovine.name/blog/2007/07/14/software-architecture-perspectives-on-a-maturing-discipline/#comments</comments>
		<pubDate>Sat, 14 Jul 2007 18:54:39 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
		
		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2007/07/14/software-architecture-perspectives-on-a-maturing-discipline/</guid>
		<description><![CDATA[This is the title of the seminar held in Rome at the University &#8220;Tor Vergata&#8221;, on June 19 2007, by Philippe Kruchten, the Director of Process Development (RUP) at Rational Software (IBM) and Professor of Software Engineering at University of British Columbia in Vancouver, Canada.
It was a very interesting seminar due to the fact that [...]]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="156" align="left" id="image110" alt="University of Rome Tor Vergata" src="http://www.francesco.iovine.name/blog/wp-content/uploads/2007/07/uniroma2.gif" />This is the title of the seminar held in Rome at the University &#8220;Tor Vergata&#8221;, on June 19 2007, by <a title="http://philippe.kruchten.com/" target="_blank" href="http://philippe.kruchten.com/">Philippe Kruchten</a>, the Director of Process Development (RUP) at Rational Software (IBM) and Professor of Software Engineering at University of British Columbia in Vancouver, Canada.</p>
<p>It was a very interesting seminar due to the fact that software architecture was still something vague for me (i.e. a computer engineering student much interested in software engineering but who has never handle with projects big enough to  need a significant effort in making the architecture).</p>
<p>In his seminar, first of all Kruchten tried to give <strong>a definition of <em>Software Architecture</em></strong> coming to the following conclusion:</p>
<blockquote><p>Software architecture encompasses the significant decisions about:</p>
<ul>
<li>the organization of a software system,</li>
<li>the selection of the structural elements and their interfaces by which the system is composed together with their behaviour as specified in the collaboration among those elements,</li>
<li>the composition of these elements into progressively larger subsystems,</li>
<li>the architectural syle that guides this organization, these elements and their interfaces, their collaborations, and their composition.</li>
</ul>
<p>Software architecture is not only concerned with structure and behaviour, but also with usage, functionality, performance, resilience, reuse, comprehensibility, economic and technological constraints and tradeoffs, and aesthetics.</p></blockquote>
<p>Although this definition of Software Architecture seems to be comprehensive, surely it is not so easy to understand at the first reading. <strong>A simpler definition</strong> could be the following:</p>
<blockquote><p>Architecture is about making decision.</p></blockquote>
<p>Then Kruchten focused on <strong>what architects actually do</strong>.</p>
<blockquote><p>The life of a software architect is a long (and sometimes painful) succession of suboptimal decisions made partly in the dark.</p></blockquote>
<p>Architects should spend their working time in the following manner:</p>
<ul>
<li>50% Architecting (design, validation, prototyping, documenting, etc.)</li>
<li>25% Getting input (from user requirement, other architecture, technology)</li>
<li>25% Providing Information (communicating architecture, assisting other stakeholders).</li>
</ul>
<p>The right balance among these activities is very important in order to not fall in typical situations in which architects don&#8217;t know anything about existing technology, or don&#8217;t communicate their work to designers.</p>
<p>It&#8217;s clear that <strong><em>decision</em></strong> is the key word for Software Architecture, therefore Decision Models, Decision Visualizations and Design Decision Capture Mechanisms are the key tools for architects. Refining models, languages and mechanisms concerning decisions is the purpose of Software Engineering Research in this area.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GSUcx3qSnhs:0RN2-6fWqTk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GSUcx3qSnhs:0RN2-6fWqTk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GSUcx3qSnhs:0RN2-6fWqTk:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GSUcx3qSnhs:0RN2-6fWqTk:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GSUcx3qSnhs:0RN2-6fWqTk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GSUcx3qSnhs:0RN2-6fWqTk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GSUcx3qSnhs:0RN2-6fWqTk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GSUcx3qSnhs:0RN2-6fWqTk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GSUcx3qSnhs:0RN2-6fWqTk:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2007/07/14/software-architecture-perspectives-on-a-maturing-discipline/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2007/07/14/software-architecture-perspectives-on-a-maturing-discipline/</feedburner:origLink></item>
		<item>
		<title>Work Life Balance</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/GA_EA8NrqjI/</link>
		<comments>http://www.francesco.iovine.name/blog/2007/06/04/work-life-balance/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 14:16:29 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2007/06/04/work-life-balance/</guid>
		<description><![CDATA[«If you ever admired those colleagues who stayed in office for more than 10 hours day by day, you should consider the fact that after a specific amount of work time bug rates increase dramatically and work results tend to reach lowest levels. Thus, working too hard for a long period of time could even [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>«If you ever admired those colleagues who stayed in office for more than 10 hours day by day, you should consider the fact that after a specific amount of work time bug rates increase dramatically and work results tend to reach lowest levels. Thus, working too hard for a long period of time could even have a negative effect.» <a title="Michael Stal's Blogger Page" href="http://stal.blogspot.com/2007/05/work-life-balance.html" target="_blank">Michael Stal</a></p></blockquote>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GA_EA8NrqjI:ZPRX6N4Bsi8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GA_EA8NrqjI:ZPRX6N4Bsi8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GA_EA8NrqjI:ZPRX6N4Bsi8:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GA_EA8NrqjI:ZPRX6N4Bsi8:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GA_EA8NrqjI:ZPRX6N4Bsi8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GA_EA8NrqjI:ZPRX6N4Bsi8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GA_EA8NrqjI:ZPRX6N4Bsi8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=GA_EA8NrqjI:ZPRX6N4Bsi8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=GA_EA8NrqjI:ZPRX6N4Bsi8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2007/06/04/work-life-balance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2007/06/04/work-life-balance/</feedburner:origLink></item>
		<item>
		<title>The PASSI Design Process</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/ELvPajx2yzU/</link>
		<comments>http://www.francesco.iovine.name/blog/2007/06/01/the-passi-design-process/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 19:35:43 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2007/06/01/the-passi-design-process/</guid>
		<description><![CDATA[PASSI (a Process for Agent Societies Specification and Implementation) is a step-by-step requirement-to-code methodology for designing and developing multi-agent societies integrating design models and concepts from both OO software engineering and artificial intelligence approaches using the UML notation. The models and phases of PASSI encompass anthropomorphic representation of system requirements, social viewpoint, solution architecture, code [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>PASSI (a Process for Agent Societies Specification and Implementation) is a step-by-step requirement-to-code methodology for designing and developing multi-agent societies integrating design models and concepts from both OO software engineering and artificial intelligence approaches using the UML notation. The models and phases of PASSI encompass anthropomorphic representation of system requirements, social viewpoint, solution architecture, code production and reuse, and deployment configuration supporting mobility of agents. The design process with PASSI is supported by PTK (PASSI ToolKit) which is composed by an add-in for Rational Rose and a tool for reusing patterns of agents. </em>[<a href="http://mozart.csai.unipa.it/passi/" target="_blank">The PASSI Design Process</a>]<em><br />
</em></p></blockquote>
<p>I have recently followed the PASSI process to develop an Architecture for Context-Dependent Information Systems, as a component of the middleware layer (the layer between the transport and the application layer). JADE has been the framework I used to work with agents.</p>
<blockquote><p><em>JADE (Java Agent DEvelopment Framework) is a software framework fully implemented in Java language. It simplifies the implementation of multi-agent systems through a middle-ware that claims to comply with the FIPA specifications and through a set of tools that supports the debugging and deployment phase. The agent platform can be distributed across machines (which not even need to share the same OS) and the configuration can be controlled via a remote GUI. The configuration can be even changed at run-time by moving agents from one machine to another one, as and when required. The only system requirement is the Java Run Time version 1.4 or later. </em>[<a href="http://jade.tilab.com/" target="_blank">JADE Homepage</a>]<em><br />
</em></p></blockquote>
<p>I must say that I&#8217;m impressed with how much the PASSI process can be so powerful in its semplicity. Have a look at <a href="http://mozart.csai.unipa.it/passi/" target="_blank">the PASSI Home Page</a> to find out how the steps you have to follow are easy to understand and to put in practice. The partition in five models allows designers to look at the multi-agent system in different ways. The models are: System Requirements Model, Agent Society Model, Agent Implementation Model, Code Model, and Deployment Model. For more information have a look at <a href="http://mozart.csai.unipa.it/passi/Phases.htm" target="_blank">the PASSI lifecycle</a>.</p>
<p>Looking at the documentation, it would seem that PASSI is a waterfall process, but it is not. <strong>PASSI is iterative, sequential and top-down</strong>, as the authors (M.Cossentino and C.Potts) write in paragraph 2.2 of <a href="http://www.cc.gatech.edu/classes/AY2002/cs6300_fall/ICSE.pdf" target="_blank">the research paper</a> about it. There are two kinds of iteration in PASSI. The first one is related to requirement elicitation and involves dependencies among the System Requirements Model, the Agent Society Model and the Agent Implementation Model. The second type of iteration is related to Multi-Agent System Implementation and takes place inside the Agent Implementation Model in the manner shown in figure.</p>
<div style="text-align: center"><img id="image106" src="http://www.francesco.iovine.name/blog/wp-content/uploads/2007/05/passi_iteration.jpg" alt="passi_iteration.jpg" /></div>
<p>PASSI has been very helpful to me for developing a well-structured agent-based software application. In particular the <strong>Deployment Model</strong> helped me to get the picture of the software I was on the point to develop. I&#8217;ve been run the Deployment Configuration phase (the only one of Deployment Model) during the phases of Agent Implementation Model because I needed to understand how effectively components (placed in different containers) could communicate among themselves. Moreover, since the application I developed implied agent mobility, I needed some deployments diagrams to describe any constraints on migration and mobility, in order to describe the behaviours of module providing mobility.</p>
<p>PASSI is without doubt a good process to follow but the online documentation about iterations and phases overlap is not clear enough. That&#8217;s why I have just written this post! <img src='http://www.francesco.iovine.name/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=ELvPajx2yzU:AlocHcH_eOM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=ELvPajx2yzU:AlocHcH_eOM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=ELvPajx2yzU:AlocHcH_eOM:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=ELvPajx2yzU:AlocHcH_eOM:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=ELvPajx2yzU:AlocHcH_eOM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=ELvPajx2yzU:AlocHcH_eOM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=ELvPajx2yzU:AlocHcH_eOM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=ELvPajx2yzU:AlocHcH_eOM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=ELvPajx2yzU:AlocHcH_eOM:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2007/06/01/the-passi-design-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2007/06/01/the-passi-design-process/</feedburner:origLink></item>
		<item>
		<title>WEP is fine…</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/K8I1DibmdK0/</link>
		<comments>http://www.francesco.iovine.name/blog/2007/04/03/wep-is-fine/#comments</comments>
		<pubDate>Tue, 03 Apr 2007 22:17:58 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2007/04/03/wep-is-fine/</guid>
		<description><![CDATA[&#8220;WEP suffers from two fundamental deficiencies: it was poorly designed and it was poorly implemented. Other than that, it’s fine.&#8221;
H. Berghel and J. Uecker. Wireless Infidelity II: Airjacking.  Communications of the ACM, Volume 47, Issue 12, pages 15-20, December 2004.
]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>&#8220;<a target="_blank" title="Wired Equivalent Privacy" href="http://en.wikipedia.org/wiki/Wired_Equivalent_Privacy">WEP</a> suffers from two fundamental deficiencies: it was poorly designed and it was poorly implemented. Other than that, it’s fine.&#8221;</em></p></blockquote>
<p>H. Berghel and J. Uecker. <a title="paper" target="_blank" href="http://merlot.usc.edu/cs530-s07/papers/Berghel04b.pdf">Wireless Infidelity II: Airjacking</a>.  Communications of the ACM, Volume 47, Issue 12, pages 15-20, December 2004.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=K8I1DibmdK0:8KKYcwoAqbY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=K8I1DibmdK0:8KKYcwoAqbY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=K8I1DibmdK0:8KKYcwoAqbY:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=K8I1DibmdK0:8KKYcwoAqbY:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=K8I1DibmdK0:8KKYcwoAqbY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=K8I1DibmdK0:8KKYcwoAqbY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=K8I1DibmdK0:8KKYcwoAqbY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=K8I1DibmdK0:8KKYcwoAqbY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=K8I1DibmdK0:8KKYcwoAqbY:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2007/04/03/wep-is-fine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2007/04/03/wep-is-fine/</feedburner:origLink></item>
		<item>
		<title>Thank you Gmail !</title>
		<link>http://feedproxy.google.com/~r/franciov_professional/~3/O-4wrC-ZmB4/</link>
		<comments>http://www.francesco.iovine.name/blog/2007/03/29/thank-you-gmail/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 15:16:32 +0000</pubDate>
		<dc:creator>franciov</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.francesco.iovine.name/blog/2007/03/29/thank-you-gmail/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div style="text-align: center"><a href="http://gmail.google.com/" target="_blank"><img id="image102" src="http://www.francesco.iovine.name/blog/wp-content/uploads/2007/03/gmail_spam.jpg" alt="Gmail" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/franciov_professional?a=O-4wrC-ZmB4:MiuW8fjyd8M:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=O-4wrC-ZmB4:MiuW8fjyd8M:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=O-4wrC-ZmB4:MiuW8fjyd8M:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=O-4wrC-ZmB4:MiuW8fjyd8M:wF9xT3WuBAs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=O-4wrC-ZmB4:MiuW8fjyd8M:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=O-4wrC-ZmB4:MiuW8fjyd8M:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=O-4wrC-ZmB4:MiuW8fjyd8M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/franciov_professional?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/franciov_professional?a=O-4wrC-ZmB4:MiuW8fjyd8M:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/franciov_professional?i=O-4wrC-ZmB4:MiuW8fjyd8M:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.francesco.iovine.name/blog/2007/03/29/thank-you-gmail/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.francesco.iovine.name/blog/2007/03/29/thank-you-gmail/</feedburner:origLink></item>
	</channel>
</rss>
