<?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>Democratic ambitions... and software dev juices &#187; javaflow</title>
	<atom:link href="http://www.alessandro.vincelli.name/tag/javaflow/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alessandro.vincelli.name</link>
	<description>by alessandro vincelli</description>
	<lastBuildDate>Mon, 09 Jan 2012 10:02:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Apache Cocoon &#8211; Control Flow</title>
		<link>http://www.alessandro.vincelli.name/2007/12/06/apache-cocoon-control-flow/</link>
		<comments>http://www.alessandro.vincelli.name/2007/12/06/apache-cocoon-control-flow/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 17:19:40 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Italiano]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[applesflow]]></category>
		<category><![CDATA[Cocoon]]></category>
		<category><![CDATA[Control Flow]]></category>
		<category><![CDATA[flowscript]]></category>
		<category><![CDATA[javaflow]]></category>

		<guid isPermaLink="false">http://www.alessandro.vincelli.name/?p=4</guid>
		<description><![CDATA[La mancanza di stato Quando si sviluppa una applicazione web, si deve fare i conti con una caratteristica del protocollo HTTP: la mancanza di stato. Non c&#8217;è nessuna informazione sulla storia delle request/response intercorse tra un client ed un server. Questo rende problematico lo sviluppo di applicazioni web complesse. Da un lato la mancanza di [...]]]></description>
			<content:encoded><![CDATA[<p><strong>La mancanza di stato</strong></p>
<p>Quando si sviluppa una applicazione web, si deve fare i conti con una caratteristica del protocollo HTTP: la mancanza di stato. Non c&#8217;è nessuna informazione sulla storia delle request/response intercorse tra un<br />
client ed un server. Questo rende problematico lo sviluppo di applicazioni web complesse.</p>
<p>Da un lato la mancanza di stato garantisce un&#8217;ottima scalabilità dell&#8217;applicazione,<br />
poichè non c&#8217;è la necessità di mantenere un servizio o una servlet<br />
per ogni utente. D&#8217;altro canto l&#8217;onere di gestire lo stato della conversazione<br />
passa tutto sullo spalle dello sviluppatore.</p>
<p align="justify">Si può pensare ad una applicazione<br />
web come una coppia di request/response come nella figura seguente:
</p>
<p align="justify"><a href="http://www.alessandro.vincelli.name/wp-content/uploads/2007/12/cont_modello_req_resp.png" title="Modello request/response"><img src="http://www.alessandro.vincelli.name/wp-content/uploads/2007/12/cont_modello_req_resp.thumbnail.png" alt="Modello request/response" /></a></p>
<p>Con questo modello il controllo sta tutto nel browser. L&#8217;applicazione si<br />
attiva solo in corrispondenza di richieste fatte dal browser. Questo modello<br />
funziona bene se le richieste sono piccole e indipendenti, ma entra in crisi<br />
in contesti complessi. Basta pensare ad un carrello elettronico, se si fa un<br />
doppio click sul pulsante di invio del form, troveremo due oggetti identici nel<br />
nostro carrello.</p>
<p><strong>Continuation</strong></p>
<p>L&#8217;idea alla base della <em>continuation</em> è la seguente: ad ogni richiesta del client,<br />
lasciare al framework il compito di caricare e salvare lo stato, all&#8217;inizio e alla fine di ogni richiesta.</p>
<p>Cocoon mette a disposizione tre implementazioni della <em>continuation</em>:<br />
una in JavaScript basata su Rhino JavaScript di Mozilla detta<br />
<strong>flowscript</strong>, due in Java:  <strong>JavaFlow</strong> e l&#8217;<strong>Apples Flow</strong>.<br />
Per capire come funziona la <em>continuazione</em> vediamo subito<br />
un esempio in  <strong>JavaFlow</strong>:</p>
<ol>
<li> import org.apache.cocoon.components. flow. java.AbstractContinuable;</li>
<li> import org.apache.cocoon.components. flow. java.VarMap;</li>
<li> public class CalculatorFlow extends AbstractContinuable {</li>
<li> public void doCalculator() {</li>
<li> sendPageAndWait(&#8220;getNumberA.html&#8221;) ;</li>
<li> float a = Float .parseFloat(getRequest() .getParameter(&#8220;a&#8221;)) ;</li>
<li> sendPageAndWait(&#8220;getNumberB.html&#8221;) ;</li>
<li> float b = Float .parseFloat(getRequest() .getParameter(&#8220;a&#8221;)) ;</li>
<li> sendPageAndWait(&#8220;getOperator.html&#8221;) ;</li>
<li> String op = getRequest() .getParameter(&#8220;operator&#8221;) ;</li>
<li> i f (op. equals(&#8220;plus&#8221;)) {</li>
<li> sendPage(&#8220;page/calculator?result&#8221;, new VarMap() .add(&#8220;result&#8221;, a + b))</li>
<li>;</li>
<li> } else i f (op. equals(&#8220;minus&#8221;)) {</li>
<li> sendPage(&#8220;page/calculator?result&#8221;, new VarMap() .add(&#8220;result&#8221;, a ? b))</li>
<li>;</li>
<li> } else i f (op. equals(&#8220;multiply&#8221;)) {</li>
<li> sendPage(&#8220;page/calculator?result&#8221;, new VarMap() .add(&#8220;result&#8221;, a  b))</li>
<li>;</li>
<li> } else i f (op. equals(&#8220;divide&#8221;)) {</li>
<li> i f (b == 0f )</li>
<li> sendPageAndWait(&#8220;page/calculator?message&#8221;, new VarMap() .add(&#8220;</li>
<li>message&#8221;, &#8220;Error: Cannot divide by zero!&#8221;)) ;</li>
<li> sendPage(&#8220;page/calculator?result&#8221;, new VarMap() .add(&#8220;result&#8221;, a / b))</li>
<li>;</li>
<li> } else {</li>
<li> sendPageAndWait(&#8220;page/calculator?message&#8221;, new VarMap() .add(&#8220;message&#8221;</li>
<li>, &#8220;Error: Unkown operator !&#8221;)) ;</li>
<li> }</li>
<li> }</li>
<li>}</li>
</ol>
<p>Quando un client richiede l&#8217;applicazione calcolatrice viene avviata la funzione<br />
<em>doCalculator</em>. Alla linea 5 del listato c&#8217;è la funzione speciale<br />
<em>sendPageAndWait</em>; questa funzione è in grado di invocare pagine web,<br />
selezionado una pipeline, e di passare dei parametri, una mappa di parametri<br />
come si vede alla riga 15 dove c&#8217;è l&#8217;altra funzione speciale <em>sendPage</em>. Quando<br />
la funzione <em>sendPageAndWait</em> invia una pagina, viene bloccata l&#8217;esecuzione<br />
del thread fino a quando l&#8217;utente cliccando su un link non invia una nuova<br />
richiesta al server. Intercettata la richiesta, l&#8217;applicazione riparte dal punto<br />
in cui si era fermata, e continua l&#8217;esecuzione del programma, riga 6 del listato, catturando il parametro passato dalla pagina. Al passo seguente viene inviata una seconda pagina al client e rimane in attesa.<br />
<u>E&#8217; evidente che con questo approccio possiamo scrivere il flusso di controllo<br />
di un&#8217;applicazione web come quello di un normale programma.</u></p>
<p>La <em>continuation</em><br />
può semplificare molto lo sviluppo di applicazioni web. Lo schema<br />
senza stati può esser ridisegnato<br />
come in figura seguente:</p>
<p><a href="http://www.alessandro.vincelli.name/wp-content/uploads/2007/12/cont_modello_flow.png" title="Modello ?Applicazione?"><img src="http://www.alessandro.vincelli.name/wp-content/uploads/2007/12/cont_modello_flow.thumbnail.png" alt="Modello ?Applicazione?" /></a></p>
<p>Quando un utente avvia una applicazione è il webserver che ha il controllo.<br />
Una applicazione web, invece di essere un insieme di richieste in<br />
ordine casuale, diviene una conversazione con l&#8217;utente unificata e controllata.<br />
I vantaggi offerti da questo approccio possono esser così schematizzati:</p>
<ul>
<li> assenza di stato tra le richieste. Il framework può identicare una singola <em>continuation</em> dalla URL e salvarla in sessione. Di conseguenza l&#8217;architettura di comunicazione non viene appesantita, anzi nella pratica Cocoon si limita a passare un solo ID alfanumerico che serve ad identificare la <em>continuation</em>.</li>
<li>il modello di programmazione è di tipo stateful, ossia con informazioni<br />
sullo stato. Il framework è in grado di riportarsi in ogni momento ad<br />
ogni stadio del suo ciclo di vita.</li>
<li>è possibile invalidare la <em>continuation</em>, questo può essere utile, per<br />
esempio, nei casi di invii multipli dello stesso form.</li>
<li>il pulsante indietro del browser non crea problemi visto che il<br />
framework, si occupa di ripristinare anche gli stati precedenti.</li>
</ul>
<p>Uno svantaggio è che il framework utilizza molta memoria per gestire<br />
la <em>continuation</em>. Questo è da tenere in considerazione per fare un uso oculato<br />
delle risorse. E&#8217; comunque da segnalare che ormai la <em>continuation</em><br />
in cocoon è una implementazione matura; a conferma di questo ci sono le<br />
esperienze pratiche da me maturate negli ultimi due anni, non si sono mai<br />
verificati decadimenti delle prestazioni e/o condizioni di out of memory anche<br />
in condizioni di stress per il framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandro.vincelli.name/2007/12/06/apache-cocoon-control-flow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

