<?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; Apache</title>
	<atom:link href="http://www.alessandro.vincelli.name/tag/apache/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>YouEat techs</title>
		<link>http://www.alessandro.vincelli.name/2010/02/17/youeat-techs/</link>
		<comments>http://www.alessandro.vincelli.name/2010/02/17/youeat-techs/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 11:37:23 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[youeat]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://www.alessandro.vincelli.name/?p=131</guid>
		<description><![CDATA[YouEat is an open source application. You can check the code at http://code.google.com/p/youeat/. YouEat is a Java application built only with open-source software: Apache Wicket, for the web interface Spring Framework is the glue for all the components Hibernate is the JPA implementation Apache Lucene to implement the internal search engine Apache Maven is the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alessandro.vincelli.name/wp-content/uploads/2010/02/logo-mela-small.png"><img class="size-full wp-image-138 alignright" title="logo-mela-small" src="http://www.alessandro.vincelli.name/wp-content/uploads/2010/02/logo-mela-small.png" alt="" width="80" height="80" /></a>YouEat is an open source application. You can check the code at <a title="YouEat project code" href="http://code.google.com/p/youeat/">http://code.google.com/p/youeat/</a>.</p>
<p>YouEat is a Java application built only with open-source software:</p>
<ul>
<li>Apache Wicket, for the web interface</li>
<li>Spring Framework is the glue for all the components</li>
<li>Hibernate is the JPA implementation</li>
<li>Apache Lucene to implement the internal search engine</li>
<li>Apache Maven is the dev manager</li>
<li>JUnit is test suite</li>
<li>PostgreSQL is the database engine</li>
</ul>
<p>My idea is create an <em>easy to read</em> application&#8230; therefore any feedback is well accepted <img src='http://www.alessandro.vincelli.name/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandro.vincelli.name/2010/02/17/youeat-techs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JackWicket</title>
		<link>http://www.alessandro.vincelli.name/2009/03/18/jackwicket/</link>
		<comments>http://www.alessandro.vincelli.name/2009/03/18/jackwicket/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 13:38:43 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[jackrabbit]]></category>
		<category><![CDATA[jackrabbit ocm]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://www.alessandro.vincelli.name/?p=97</guid>
		<description><![CDATA[I published a website and a demo with my last personal work that I called Jackwicket. In this project I put together Apache Wicket and Apache Jackrabbit OCM. My target was create easyly and quickly powerful interactive webapps, and I think that Wicket and Jackrabbit  are very good technologies to achieve this target. You can [...]]]></description>
			<content:encoded><![CDATA[<p>I published a website and a demo with my last personal work that I called Jackwicket.<br />
In this project I put together Apache Wicket and Apache Jackrabbit OCM.<br />
My target was create easyly and quickly powerful interactive webapps, and I think that Wicket and Jackrabbit  are very good technologies to achieve this target.</p>
<p>You can find more info below:</p>
<p><a title="Jackwicket demo" href="http://demo.alessandro.vincelli.name/jackwicket/" target="_blank">Demo</a></p>
<p><a title="Jackwicket website" href="http://www.alessandro.vincelli.name/project-jackwicket/" target="_self">Project website</a></p>
<p>I will be very happy to know your opinion and to receive suggestions or contributions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandro.vincelli.name/2009/03/18/jackwicket/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>

