<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>www.jugpadova.it: Category Programmazione</title>
    <link>http://www.jugpadova.it/articles/category/programmazione</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Java User Group [Padova]</description>
    <item>
      <title>Debugging tests of a Maven project in NetBeans</title>
      <description>&lt;p&gt;Occasionally I experienced some problems in debugging test classes using NetBeans with Maven projects. Simply, the debugger started but didn&amp;#8217;t attach to the running tests.&lt;/p&gt;


	&lt;p&gt;Eventually I discovered the reason!&lt;/p&gt;


	&lt;p&gt;I used to configure the surefire plugin with:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;plugin&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;groupId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;groupId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;artifactId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;maven-surefire-plugin&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;artifactId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;configuration&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;skip&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;false&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;skip&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;useFile&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;useFile&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;forkMode&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;once&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;forkMode&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="comment"&gt;&amp;lt;!-- always, once or never --&amp;gt;&lt;/span&gt;
        &lt;span class="comment"&gt;&amp;lt;!-- &amp;lt;reportFormat&amp;gt;plain&amp;lt;/reportFormat&amp;gt; --&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;argLine&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;-Xmx512M&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;argLine&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;configuration&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;plugin&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The problem is the &lt;code&gt;argLine&lt;/code&gt; parameter. It will override the parameters the Mevenide plugin will pass for debugging tests. So, I commented it in my configuration:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;plugin&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;groupId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;groupId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;artifactId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;maven-surefire-plugin&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;artifactId&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;configuration&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;skip&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;false&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;skip&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;useFile&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;useFile&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;forkMode&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;once&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;forkMode&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="comment"&gt;&amp;lt;!-- always, once or never --&amp;gt;&lt;/span&gt;
        &lt;span class="comment"&gt;&amp;lt;!-- &amp;lt;reportFormat&amp;gt;plain&amp;lt;/reportFormat&amp;gt; --&amp;gt;&lt;/span&gt;
        &lt;span class="comment"&gt;&amp;lt;!--argLine&amp;gt;-Xmx512M&amp;lt;/argLine--&amp;gt;&lt;/span&gt; &lt;span class="comment"&gt;&amp;lt;!-- don't use if you want to debug tests in NetBeans --&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;configuration&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;plugin&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;...and now I can debug my tests!&lt;/p&gt;
</description>
      <pubDate>Wed, 20 Feb 2008 11:30:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b0ff11e9-ed4b-438c-8d7a-074b62a507ab</guid>
      <author>Lucio Benfante</author>
      <link>http://www.jugpadova.it/articles/2008/02/20/debugging-tests-of-a-maven-project-in-netbeans</link>
      <category>Tips &amp; Tricks</category>
      <category>Programmazione</category>
      <category>maven</category>
      <category>test</category>
      <category>debug</category>
      <category>netbeans</category>
    </item>
    <item>
      <title>JUG Events</title>
      <description>&lt;p&gt;&lt;span class="caps"&gt;JUG&lt;/span&gt; Events è finalmente online!&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.jugevents.org"&gt;www.jugevents.org&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;A parte l&amp;#8217;utilità dell&amp;#8217;applicazione per il nostro e gli altri &lt;span class="caps"&gt;JUG&lt;/span&gt;, mi preme qui sottolineare che è la prima applicazione sviluppata dal &lt;span class="caps"&gt;JUG&lt;/span&gt; Padova, e spero non l&amp;#8217;ultima.&lt;/p&gt;


	&lt;p&gt;Gli sviluppatori di &lt;span class="caps"&gt;JUG&lt;/span&gt; Events siamo stati principalmente &lt;a href="http://benfante.blogspot.com"&gt;io&lt;/a&gt; ed &lt;a href="http://enricogi.blogspot.com/"&gt;Enrico&lt;/a&gt;, con il supporto di Paolo F. Ma l&amp;#8217;applicazione usa il nostro framework &lt;a href="http://www.parancoe.org"&gt;Parancoe&lt;/a&gt;, quindi gran parte del merito va anche a tutti quelli che hanno contribuito e partecipano al suo sviluppo.&lt;/p&gt;
</description>
      <pubDate>Mon, 03 Sep 2007 16:01:28 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4b67890f-9fa5-421e-b7a1-5281d6e09563</guid>
      <author>Lucio Benfante</author>
      <link>http://www.jugpadova.it/articles/2007/09/03/jug-events</link>
      <category>Software</category>
      <category>Programmazione</category>
    </item>
    <item>
      <title>Tomcat 5.5.20 and JavaMail Sessions</title>
      <description>&lt;p&gt;&lt;em&gt;You&amp;#8217;ll find an article in italian on the same topic in &lt;a href="http://benfante.blogspot.com/2007/03/tomcat-castrato.html"&gt;my personal blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://tomcat.apache.org"&gt;Tomcat&lt;/a&gt; you can define a JNDI Resource for a JavaMail session putting the following code in you Context definition:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;Resource&lt;/span&gt; &lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;mail/Session&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="attribute"&gt;auth&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Container&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="attribute"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;javax.mail.Session&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="attribute"&gt;mail.smtp.host&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;localhost&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And in you web.xml:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;resource-ref&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;res-ref-name&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;mail/Session&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;res-ref-name&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;res-type&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;javax.mail.Session&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;res-type&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;res-auth&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;Container&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;res-auth&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;resource-ref&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then you can use it in you code:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_java "&gt;Context initCtx = new InitialContext();
Session session =
    (Session) envCtx.lookup(&amp;quot;java:comp/env/mail/Session&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Using Tomcat 5.5.20 (and 5.5.17, and 5.5.23&amp;#8230;and maybe other versions) the last statement will produce a &lt;code&gt;ClassNotFoundException: org.apache.naming.factory.MailSessionFactory&lt;/code&gt;. The cause is obviously that class is missing from the &lt;code&gt;common/lib/naming-factory.jar&lt;/code&gt; distributed by Tomcat. I don&amp;#8217;t know if it was a (repeated) problem in building Tomcat. Luckly the source code of that class is still present in the source distribution of Tomcat. Simply it isn&amp;#8217;t included in the build process if you don&amp;#8217;t have the &lt;a href="http://java.sun.com/products/javamail/"&gt;JavaMail&lt;/a&gt; and the &lt;a href="http://java.sun.com/products/javabeans/jaf/"&gt;JavaBeans Activation Framework&lt;/a&gt; in the build classpath. So I re-built the &lt;code&gt;naming-factory.jar&lt;/code&gt; file and substituted in &lt;code&gt;common/lib&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can rebuild your own JAR, or download my new &lt;a href="http://snipurl.com/nfjar"&gt;naming-factory.jar&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I discovered this problem (bug?) installing &lt;a href="http://www.liferay.com/"&gt;LifeRay&lt;/a&gt; 4.1.2 using the WAR distribution. On the contrary the LifeRay-Tomcat bundle contains the correct &lt;code&gt;naming-factory.jar&lt;/code&gt; yet. The LifeRay error in this case is more obscure. It reports a &lt;code&gt;javax.naming.NameNotFoundException: Name mail is not bound in this Context&lt;/code&gt;! Of course the JNDI Resource is correctly configured. This happens because LifeRay try to guess the JNDI name of the resource, that changes for the different application servers. So that exception comes from one of the attempts, and the real problem is lost and hidden. So, if you&amp;#8217;ll see a such message, don&amp;#8217;t spend time re-re-re-configuring your JNDI resources&amp;#8230;but patch Tomcat!&lt;/p&gt;</description>
      <pubDate>Tue, 13 Mar 2007 07:40:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8264d2f3-ac82-4f1e-9212-4686009a2acc</guid>
      <author>Lucio Benfante</author>
      <link>http://www.jugpadova.it/articles/2007/03/13/tomcat-5-5-20-and-javamail-sessions</link>
      <category>Tips &amp; Tricks</category>
      <category>Programmazione</category>
      <category>Tomcat</category>
      <category>JavaMail</category>
      <category>JNDI</category>
      <category>bug</category>
      <trackback:ping>http://www.jugpadova.it/articles/trackback/21441</trackback:ping>
    </item>
    <item>
      <title>Un DAO in DUE minuti</title>
      <description>&lt;p&gt;&lt;a href="https://parancoe.dev.java.net"&gt;Parancoe&lt;/a&gt; è un framework Web pensato per scrivere rapidamente applicazioni Web &amp;#8220;di tutti i giorni&amp;#8221;, cioè applicazioni senza requisiti particolari, quelle che nel 90% dei casi viene richiesto di sviluppare. Lo scopo quindi non è avere un framework iper-flessibile, capace di adattarsi a tutti i requisiti possibili, ma un framework che renda &lt;em&gt;molto&lt;/em&gt; semplice la vita al programmatore sviluppando quel particolare tipo di applicazioni.&lt;/p&gt;

&lt;p&gt;Il suo modulo di persistenza segue la stessa filosofia e permette di ottenere in pochi minuti le classi per accedere ai dati (DAO - Data Access Object) dell&amp;#8217;applicazione, memorizzati in un database relazionale.&lt;/p&gt;

&lt;p&gt;Ad esempio, supponiamo di avere una classe persistente &lt;code&gt;Person&lt;/code&gt;, mappata sul DB mediante &lt;a href="http://www.hibernate.org"&gt;Hibernate&lt;/a&gt;. Per ottenere il suo DAO con Parancoe è sufficiente scriverne l&amp;#8217;interfaccia:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_java "&gt;@Dao(entity=Person.class)
public interface PersonDao extends GenericDao&amp;lt;Person, Long&amp;gt; {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&amp;#8230;e scriverne una semplice configurazione per Spring:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="namespace"&gt;parancoe&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="tag"&gt;dao&lt;/span&gt; &lt;span class="attribute"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;personDao&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="attribute"&gt;interface&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;org.parancoe.example.dao.PersonDao&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Già così avete ottenuto un DAO con i seguenti metodi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Long create(Person newInstance);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Person read(Long id);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;void update(Person transientObject);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;void delete(Person persistentObject);&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notate che non sono metodi &amp;#8220;generici&amp;#8221;, ma usano il tipo dell&amp;#8217;oggetto persistente, quindi non sono necessari cast.&lt;/p&gt;

&lt;p&gt;Ma si può andare oltre. Supponiamo che abbiate bisogno di un metodo per ottenere la lista delle persone con un determinato nome e cognome. Con &lt;a href="https://parancode.dev.java.net"&gt;Parancoe&lt;/a&gt; è sufficiente modificare l&amp;#8217;interfaccia, aggiungendo tale metodo:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_java "&gt;@Dao(entity=Person.class)
public interface PersonDao extends GenericDao&amp;lt;Person, Long&amp;gt; {
    List&amp;lt;Person&amp;gt; findByFirstNameAndLastName(
        String firstName, String lastName);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Questo è tutto: non è necessario scrivere l&amp;#8217;implementazione di tale metodo, nè modificare la configurazione del DAO.&lt;/p&gt;

&lt;p&gt;Per saperne di più leggete &lt;a href="http://wiki.java.net/bin/view/Projects/ParancoePersistenceTutorial"&gt;questo tutorial&lt;/a&gt; nel &lt;a href="http://wiki.java.net/bin/view/Projects/Parancoe"&gt;wiki&lt;/a&gt; del progetto.&lt;/p&gt;

&lt;p&gt;Se poi volete contribuire, anche solo per dare suggerimenti su come proseguire nello sviluppo, commentate questo articolo e visitate il sito del progetto:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://parancoe.dev.java.net"&gt;http://parancoe.dev.java.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Potete anche iscrivervi alle mailing-list del progetto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://parancoe.dev.java.net/servlets/ProjectMailingListList"&gt;https://parancoe.dev.java.net/servlets/ProjectMailingListList&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Aggiornato 28/12/2006:&lt;/em&gt; è cambiato il modo di configurare i bean DAO.&lt;/p&gt;
</description>
      <pubDate>Sat, 09 Dec 2006 06:40:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:8d98ed18-32b0-4934-83dc-88850497b5d1</guid>
      <author>Lucio Benfante</author>
      <link>http://www.jugpadova.it/articles/2006/12/09/un-dao-in-due-minuti</link>
      <category>Software</category>
      <category>Programmazione</category>
      <category>Parancoe</category>
      <category>persistence</category>
      <category>framework</category>
      <category>DAO</category>
      <trackback:ping>http://www.jugpadova.it/articles/trackback/11508</trackback:ping>
    </item>
    <item>
      <title>Java 7</title>
      <description>&lt;p&gt;No, non avete letto male, non è ancora uscita la release ufficiale di Java 6, che già si pensa a cosa inserire in Java 7.&lt;/p&gt;


	&lt;p&gt;In questi giorni si è aperta nella blogosfera che ruota attorno a Java una piccola guerra di religione sulla necessità o meno di inserire le chiusure nel linguaggio.&lt;/p&gt;
&lt;p&gt;Per chi è avezzo di Smalltalk, Ruby o anche C# il concetto di chiusura è familiare. Per chi invece ha visto solo Java, il concetto è nuovo (o quasi).&lt;/p&gt;


	&lt;p&gt;Brevemente un &lt;a href="http://www.martinfowler.com/bliki/Closure.html"&gt;closure&lt;/a&gt;  è una funzione dichiarata all&amp;#8217;interno di un&amp;#8217;altra funzione della quale condivide le variabili. 
&lt;a href="http://gafter.blogspot.com/2006/09/closures-for-java-version-01.html"&gt;Neil Gafter&lt;/a&gt;  (già co-autore del Collection Framework) propone che questo tipo di costrutto sia inserito anche all&amp;#8217;interno di Java.&lt;/p&gt;


	&lt;p&gt;Il concetto non è completamente nuovo perché in Java esistono già dei costrutti simili, le classi interne anonime, che svolgono grossomodo lo stesso compito, con due differenze, secondo Gafter, importanti:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Le classi interne anonime possono lavorare con variabili del metodo che le contiene solo se queste sono dichiarate &lt;code&gt;final&lt;/code&gt;.&lt;/li&gt;
		&lt;li&gt;La sintassi che si ottiene con le chiusure è più semplice e pulita.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;Vediamo un piccolo esempio del secondo punto. Supponiamo di avere un metodo che ha il compito di sottomettere un task ad un altro thread (usando &lt;code&gt;java.util.concurrent.Executor&lt;/code&gt;).&lt;/p&gt;


	&lt;p&gt;Con le classi anonime scriveremmo il seguente codice:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;void sayHelloInAnotherThread(Executor ex) {
    ex.execute(new Runnable() {
        public void run() {
            System.out.println(&amp;quot;hello&amp;quot;);
        }
    });
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;mentre con le chiusure potremmo scrivere (la sintassi è ancora oggetto di discussione):&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;void sayHelloInAnotherThread(Executor ex) {
    ex.execute(() {
        System.out.println(&amp;quot;hello&amp;quot;);
    });
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;La questione è aperta. Anche &lt;a href="http://blogs.sun.com/jag/entry/the_black_hole_theory_of"&gt;James Gosling&lt;/a&gt; ha espresso dubbi circa la vera utilità di tale feature.&lt;/p&gt;


	&lt;p&gt;Staremo a vedere.&lt;/p&gt;</description>
      <pubDate>Wed, 13 Sep 2006 12:55:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9342b67a-9682-4e38-a335-46399c98e2e9</guid>
      <author>Andrea Nasato</author>
      <link>http://www.jugpadova.it/articles/2006/09/13/java-7</link>
      <category>Programmazione</category>
      <category>java</category>
      <category>closures</category>
      <category>Gosling</category>
      <trackback:ping>http://www.jugpadova.it/articles/trackback/4295</trackback:ping>
    </item>
    <item>
      <title>Bug storico...</title>
      <description>&lt;p&gt;...presente nel &lt;span class="caps"&gt;JDK&lt;/span&gt;, e probabilmente nella maggior parte delle implementazioni di algoritmi con approccio &amp;#8220;divide et impera&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Quanti di noi non hanno mai scritto questa semplice e innocente riga di codice (con &lt;code&gt;low&lt;/code&gt; e &lt;code&gt;high&lt;/code&gt; di tipo &lt;code&gt;int&lt;/code&gt;)?&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;int mid = (low+high)/2;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Il problema è che la somma dei due interi può risultare in un overflow&amp;#8230;gosh&amp;#8230;&lt;/p&gt;


	&lt;p&gt;L&amp;#8217;implementazione corretta sarebbe qualcosa di simile a:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;int mid = low + ((high-low)/2);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Provate a cercare in qualunque libro di algoritmi e vedrete che anche i grandi sbagliano. Io ho guardato in &lt;a href="http://www.awprofessional.com/title/0201896850" title="Volume 3"&gt;&amp;#8216;The Art of Computer Programming&amp;#8217;&lt;/a&gt;), e anche l&amp;#8217;implementazione dell&amp;#8217;algoritmo di ricerca binaria di &lt;a href="http://www-cs-faculty.stanford.edu/~knuth/"&gt;Donald E. Knuth&lt;/a&gt; soffre dello stesso bug.&lt;/p&gt;


	&lt;p&gt;Per quanto riguarda il &lt;span class="caps"&gt;JDK&lt;/span&gt;, il bug si trova (almeno) nel metodo &lt;code&gt;binarySearch&lt;/code&gt; della classe &lt;code&gt;java.utils.Arrays&lt;/code&gt;. A me non è mai capitato, ma ve l&amp;#8217;immaginate la sorpresa (per non dire altro) di vedervi sollevare un ArrayIndexOutOfBoundsException da un metodo di quella classe?&lt;/p&gt;


	&lt;p&gt;L&amp;#8217;annuncio e la discussione del bug li fa lo stesso autore della classe, Josh Bloch, in questo &lt;a href="http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html"&gt;blog&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Fri, 16 Jun 2006 07:03:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7f51b64c-cec4-4722-a2f4-027b31a9f1fd</guid>
      <author>Lucio Benfante</author>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico</link>
      <category>Programmazione</category>
      <category>bug</category>
      <category>binary</category>
      <category>search</category>
      <category>overflow</category>
      <trackback:ping>http://www.jugpadova.it/articles/trackback/923</trackback:ping>
    </item>
  </channel>
</rss>
