<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6360124077734709632</id><updated>2011-08-13T13:33:15.694+02:00</updated><category term='GWT'/><category term='IDEA'/><category term='MVC'/><category term='derby'/><category term='Hibernate'/><category term='HSQLDB'/><category term='gwt-ext'/><category term='Threads'/><category term='RPC'/><category term='Java'/><category term='JSTM4GWT'/><category term='Groovy'/><category term='XSTM'/><category term='Google'/><category term='Constraint'/><category term='GORM'/><category term='Echo2'/><category term='Enunciate'/><category term='Maven'/><category term='Validation'/><category term='MyGWT'/><category term='ORM'/><category term='Ruby On Rail'/><category term='Eclipse'/><category term='HMVC'/><category term='Grails'/><category term='JSTM'/><category term='Spring'/><category term='POJO'/><category term='Size'/><category term='DAO'/><category term='Cooee'/><category term='database'/><title type='text'>Sviluppo Tesi FrameworK Java-Ajax</title><subtitle type='html'>Diario di bordo di un tesista informatico.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-3629157785122523148</id><published>2009-11-12T16:16:00.002+01:00</published><updated>2009-11-12T17:06:58.016+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Size'/><category scheme='http://www.blogger.com/atom/ns#' term='Validation'/><category scheme='http://www.blogger.com/atom/ns#' term='Constraint'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails validation, un incongruenza nella constraint size</title><content type='html'>Dopo mesi che non mi faccio più sentire (l'elezione a sindaco ha decisamente influito) ecco che mi ripropongo a voi.&lt;br /&gt;Sembra difficile crederlo, ma siete davvero in molti quelli che seguite il blog... anche se poco aggiornato.&lt;br /&gt;D'altronde in Italia non sono molti quelli che programmano in GWT e Grails, e in particolare con una combinazione di entrambi.&lt;br /&gt;&lt;br /&gt;Oggi forse abbiamo trovato un incongruenza, o almeno qualcosa di poco intuitivo, nella validazione di grails.&lt;br /&gt;Era un qualcosa che avevamo già intuito in passato, oggi abbiamo fatto alcuni test e possiamo essere sicuri di questo comportamento. Stiamo usando grails 1.2M4, ma credo il comportamento sia simili almeno per grails 1.0 in avanti.&lt;br /&gt;&lt;br /&gt;In effetti la documentazione è poco chiara sulle constraint, in particolare proprio sull'interazione della constraint size con nullable e blank, verso i quali ha una frase piuttosto criptica:&lt;br /&gt;&lt;blockquote&gt;Currently this constraint cannot be used in addition to blank or nullable, a custom validator may be added to perform this kind of constraints.&lt;/blockquote&gt;&lt;br /&gt;Il che apparentemente significherebbe, se il mio inglese non mi tradisce, che la constraint size non si può usare in aggiunta a nullable e blank... ma la cosa risulta falsa, infatti, prendiamo ad esempio questa classe&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Prova {&lt;br /&gt;    static constraints = {&lt;br /&gt;  prova1(size:0..16)&lt;br /&gt;  prova2(size:1..16)&lt;br /&gt;    }&lt;br /&gt; String prova1&lt;br /&gt; String prova2&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;e questo codice in un controller:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  Prova provaA = new Prova()&lt;br /&gt;  provaA.validate()&lt;br /&gt;  println "Validazione ProvaA"&lt;br /&gt;  provaA.errors.each {println it}&lt;br /&gt;&lt;br /&gt;  Prova provaB = new Prova()&lt;br /&gt;  provaB.prova1 = ""&lt;br /&gt;  provaB.prova2 = ""&lt;br /&gt;  provaB.validate()&lt;br /&gt;  println "Validazione ProvaB"&lt;br /&gt;  provaB.errors.each {println it}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;si ha questo output&lt;br /&gt;&lt;blockquote&gt;Validazione ProvaA&lt;br /&gt;org.springframework.validation.BeanPropertyBindingResult: 2 errors&lt;br /&gt;Field error in object 'Prova' on field 'prova2': rejected value [null]; codes [Prova.prova2.nullable.error.Prova.prova2,Prova.prova2.nullable.error.prova2,Prova.prova2.nullable.error.java.lang.String,Prova.prova2.nullable.error,prova.prova2.nullable.error.Prova.prova2,prova.prova2.nullable.error.prova2,prova.prova2.nullable.error.java.lang.String,prova.prova2.nullable.error,Prova.prova2.nullable.Prova.prova2,Prova.prova2.nullable.prova2,Prova.prova2.nullable.java.lang.String,Prova.prova2.nullable,prova.prova2.nullable.Prova.prova2,prova.prova2.nullable.prova2,prova.prova2.nullable.java.lang.String,prova.prova2.nullable,nullable.Prova.prova2,nullable.prova2,nullable.java.lang.String,nullable]; arguments [prova2,class Prova]; default message [La proprietà [{0}] della classe [{1}] non può essere null]&lt;br /&gt;Field error in object 'Prova' on field 'prova1': rejected value [null]; codes [Prova.prova1.nullable.error.Prova.prova1,Prova.prova1.nullable.error.prova1,Prova.prova1.nullable.error.java.lang.String,Prova.prova1.nullable.error,prova.prova1.nullable.error.Prova.prova1,prova.prova1.nullable.error.prova1,prova.prova1.nullable.error.java.lang.String,prova.prova1.nullable.error,Prova.prova1.nullable.Prova.prova1,Prova.prova1.nullable.prova1,Prova.prova1.nullable.java.lang.String,Prova.prova1.nullable,prova.prova1.nullable.Prova.prova1,prova.prova1.nullable.prova1,prova.prova1.nullable.java.lang.String,prova.prova1.nullable,nullable.Prova.prova1,nullable.prova1,nullable.java.lang.String,nullable]; arguments [prova1,class Prova]; default message [La proprietà [{0}] della classe [{1}] non può essere null]&lt;br /&gt;Validazione ProvaB&lt;br /&gt;org.springframework.validation.BeanPropertyBindingResult: 0 errors&lt;/blockquote&gt;&lt;br /&gt;Non avendo dichiarato nessun'altra contraint oltre a size, come per ogni proprietà della classe, si dovrebbe sottointendere "nullable: true"&lt;br /&gt;E infatti sembrerebbe così, nel tentativo su ProvaA abbiamo i due errori sul valore nullo&lt;br /&gt;&lt;br /&gt;Il size sulla stringa è inteso come un controllo sulla lenght() della stringa stessa. quindi può trarre in inganno il size(0..16) che potrebbe far pensare di aver concesso alla stringa un lenght 0... quindi come non avergli dato valore, quindi come aver sottinteso nullable:true&lt;br /&gt;Ma non è così&lt;br /&gt;&lt;br /&gt;Altra cosa strana è il size(1..0)... concedere ad una stringa lunghezza minima di 1, potrebbe far pensare di costringere la stringa ad avere un valore diverso dal valore vuoto, in parole povere di aver sottointeso "blank: false", ma non è così&lt;br /&gt;come si vede dall'output precedente, un assegnazione prova2="" è accettata... anche se palesemente un lenght su una stringa = "" sarebbe 0.&lt;br /&gt;&lt;br /&gt;Comportamento strano, non credete?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-3629157785122523148?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/3629157785122523148/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=3629157785122523148' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/3629157785122523148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/3629157785122523148'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2009/11/grails-validation-un-incongruenza-nella.html' title='Grails validation, un incongruenza nella constraint size'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6114155083710220773</id><published>2009-05-22T14:54:00.002+02:00</published><updated>2009-05-22T15:03:36.385+02:00</updated><title type='text'>Accedere al DataSource di grails da dovunque</title><content type='html'>Mi è riservito dover riaccedere al datasource da un qualcosa che non fosse un controller o un service.&lt;div&gt;Infatti nel nostro progetto abbiamo una classe utility che deve avere accesso al database, per poter fare una query con HQL...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Per poterlo fare bisogna:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH&lt;br /&gt;import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA&lt;br /&gt;def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)&lt;br /&gt;def dataSource= ctx.dataSource&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;e ora nel dataSource si ha una classe di tipo: &lt;a href="http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/jdbc/datasource/DriverManagerDataSource.html" style="text-decoration: none;"&gt;http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/jdbc/datasource/DriverManagerDataSource.html&lt;/a&gt;&lt;/div&gt;e ora si può accedere alla connessione così:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def sql = new Sql((Connection)dataSource.getConnection())&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Con grails 1.1 si può fare più semplicemente&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import org.codehaus.groovy.grails.commons.ApplicationHolder as AH&lt;br /&gt;def static ctx = AH.application.mainContext&lt;br /&gt;def dataSource= ctx.dataSource&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Per poi continuare come scritto prima&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6114155083710220773?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6114155083710220773/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6114155083710220773' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6114155083710220773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6114155083710220773'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2009/05/accedere-al-datasource-di-grails-da.html' title='Accedere al DataSource di grails da dovunque'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2436230082990509887</id><published>2009-04-30T15:17:00.002+02:00</published><updated>2009-04-30T17:45:42.239+02:00</updated><title type='text'>Database Naming convention</title><content type='html'>Alcune convenzioni largamente utilizzate (in gran parte usate anche da grails e hibernate) per i nomi nei database.&lt;br /&gt;Ho trovato questo libro, SQL Programming Style by Joe Celko&lt;div align="center"&gt;&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:-webkit-monospace;font-size:13px;"&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=michjackfans-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0120887975&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/div&gt;Che sembrerebbe essere interessante e si basa sullo standard &lt;a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=35347"&gt;ISO/IEC 11179-5:2005&lt;/a&gt;, che da quanto letto è lo standard per la "naming convention" in senso lato.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo standard iso, riassumento, dice tra le altre cose&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;1. Be unique (within any data dictionary in which it appears).&lt;/div&gt;&lt;div&gt;2. Be stated in the singular.&lt;/div&gt;&lt;div&gt;3. State what the concept is, not only what it is not.&lt;/div&gt;&lt;div&gt;4. Be stated as a descriptive phrase or sentence(s).&lt;/div&gt;&lt;div&gt;5. Contain only commonly understood abbreviations.&lt;/div&gt;&lt;div&gt;6. Be expressed without embedding definitions of other data elements&lt;/div&gt;&lt;div&gt;or underlying concepts.&lt;/div&gt;&lt;div&gt;7. Tables, sets, and other collections shall be named with a collective,&lt;/div&gt;&lt;div&gt;class, or plural name.&lt;/div&gt;&lt;div&gt;8. Procedures shall have a verb in their name.&lt;/div&gt;&lt;div&gt;9. A copy (alias) of a table shall include the base table name as&lt;/div&gt;&lt;div&gt;well as the role it is playing at that time.&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Elenco qui, invece, alcune delle convenzioni trovate nel libro&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Lunghezza dei nomi (tutti): dovrebbe essere inferiore ai 30 caratteri. Molti dbms sql accettano sino a 128 caratteri (come MS SQL) ma considerando il limite di oracle di 30 caratteri, conviene che tutti i nomi usati siano inferiori a questo limite. Comunque sembra una cifra più che sufficiente.&lt;/li&gt;&lt;li&gt;Evitare i caratteri speciali, come ad esempio $, #, @, alcuni dmbs li supportano, ma non tutti.&lt;/li&gt;&lt;li&gt;I nomi delle tabella è buona norma scriverli "capitalizzati" (prima lettera maiuscala, il resto minuscolo). Tutto il resto (nomi colonne, ecc...) tutto minuscolo. Questa però pare essere una convenzione piuttosto controversa.&lt;/li&gt;&lt;li&gt;Per nomi composti (sia tabella sia colonna) usare l'undescore come separatore, e non le "camel words" (cioè come in java, le parole attaccate capitalizzate, come NomeTabella). Per i nomi di tabella usare parole capitalizzate.&lt;/li&gt;&lt;li&gt;Essere coerenti nella scelta se usare nomi di tabella al singolare o al plurale. Ci sono alcune correnti di pensiero, alcuni pensano sia meglio usare nomi al plurale, dopotutto una tabella contiene in se solitamente più di un entità. Però nella modellazione una tabella rappresenta un oggetto, quindi espresso al sigolare. Inoltre scrivere tutto al singolare evita i problemi derivati proprio dalle particolare regole nel rendere plurarle una parola (person diventa people). Il libro consiglia nomi al plurale, anche se molti altri (e io mi aggiungo a questi) consigliano nomi al singolare.&lt;/li&gt;&lt;li&gt;Evitare i prefissi, soprattutto nei nomi di tabelle. Alcuni usano anteporre table_ o tbl_ ai nomi di colonne, ma è inutile, anzi scomodo. Sconsigliato anche anteporre il nome della tabella a tutte le colonne della tabella stessa.&lt;/li&gt;&lt;li&gt;Le tabelle di relazione dovrebbero avere nomi che riassumano al relazione stessa. Per esempio un'ipotetica relazione di "matrimonio" tra la tabella "uomo" e la tabella "donna" dovrebbe chiamarsi "matrimonio", e non "uomo_donna". Se non possibile, si usano i nomi della tabelle unite dall'underscore.&lt;/li&gt;&lt;li&gt;Le chiavi primarie, dove possibile, dovrebbero essere degli standard industriali, come per esempio l'ISBN, o simili.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2436230082990509887?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2436230082990509887/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2436230082990509887' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2436230082990509887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2436230082990509887'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2009/04/database-naming-convention.html' title='Database Naming convention'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4420605458388701621</id><published>2009-02-19T11:27:00.002+01:00</published><updated>2009-02-19T11:32:23.209+01:00</updated><title type='text'>Grails Are Not Configured</title><content type='html'>Non è la prima volta che mi capita questo errore, e non è la prima volta che perdo decine di minuti per risolverlo... mi dimentico sempre la soluzione.&lt;div&gt;In questi giorni ho importato ed esportato svariati progetti... e quindi spesso ci sono incompatibilità con le configurazioni degli stessi (librerie, jdk, facet bla bla).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A volte capita che, nel tentare di far partire/compilare un progetto Intellij Idea segnali "Grails are not configured"&lt;/div&gt;&lt;div&gt;Per risolvere il problema bisogna verificare che:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ci sia il Grails JDK configurato correttamente, per fare questo bisogna accedere alla struttura del progetto (ctr+alt+shift+s, oppure F4 se si clicca sulla root del progetto nel project explorer) , andare su moduli-&gt; grails e verificare che sia richiamato un jdk di grails&lt;/li&gt;&lt;li&gt;sia settata, sia in IDEA che in windows la variabile GRAILS_HOME&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;e tutto dovrebbe risolversi :-D&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4420605458388701621?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4420605458388701621/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4420605458388701621' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4420605458388701621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4420605458388701621'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2009/02/grails-are-not-configured.html' title='Grails Are Not Configured'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2069849316373902180</id><published>2009-02-13T09:58:00.003+01:00</published><updated>2009-02-13T10:32:17.164+01:00</updated><title type='text'>Novità in ambito GWT: Smart GWT, aggiornamenti a GWT-EXT e GWTMosaic</title><content type='html'>Negli ultimi mesi sono venute alla luce importanti novità nel modno di gwt.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alcuni aggiornamenti alle librerie&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; GWT-EXT&lt;/span&gt;: siamo ora alla&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; 2.0.6&lt;/span&gt;, anche se nella home è dichiarata ancora la 2.0.5&lt;/div&gt;&lt;div&gt;Questa versione la trovate da un link posto in questo post: &lt;a href="http://gwt-ext.com/forum/viewtopic.php?f=12&amp;amp;t=3624"&gt;http://gwt-ext.com/forum/viewtopic.php?f=12&amp;amp;t=3624&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Attenti però, le prime versioni di questo pacchetto avevano una struttura directory che richiamava la versione precedente.&lt;/div&gt;&lt;div&gt;Purtroppo questa release, anzi, in realtà anche quella precedente, è stata accompagnata da una notizia che ci ha un po' scioccati: GWT-EXT non verrà più aggiornato... o meglio, verranno corretti comunque eventuali bachi e, forse, mantenuta la compatibilità con futuri rilasci di GWT e di nuovi browser, ma di fatto lo sviluppo è fermo... questo perchè gli sviluppatori hanno deciso di propendere per lo sviluppo di una nuova tecnologia non più basata sulle librerie ext-JS.&lt;/div&gt;&lt;div&gt;Infatti viene caldamente consigliato al conversione a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;SmartGWT&lt;/span&gt;: &lt;a href="http://www.jroller.com/sjivan/entry/smartgwt_1_0_released"&gt;http://www.jroller.com/sjivan/entry/smartgwt_1_0_released&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Queste nuove librerie grafiche si basano sul framework SmartClient, che non ha, almeno per ora, i problemi delle licenze di EXT-js.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Molti più widget, un buon supporto al pattern MVC e una nuova e interessante struttura dati (molto simile sotto certi aspetti a quella che abbiamo sviluppato per la mia tesi).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Per ora non intendiamo migrare, ma in un futuro probabilmente lo faremo.&lt;/div&gt;&lt;div&gt;Comunque, di fatto, uno dei problemi di gwt-ext rimane: il codice che il sorgente deve scaricare è enorme, poichè tutto richiama librerie javascript che vanno comunque totalmente scaricate dal browser (e parliamo di 700K minimo, esclusa l'applicazione in sè).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pochi giorni fa è stata rilasciato un nuovo aggiornamento di GWT-Mosaic, che ora si fa davvero interessante, si è arrivati alla versione 0.1.8 (&lt;a href="http://groups.google.com/group/gwt-mosaic/browse_thread/thread/a114236cb7faaa37#"&gt;http://groups.google.com/group/gwt-mosaic/browse_thread/thread/a114236cb7faaa37#&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;Questo piccolosissima libreria gwt, piccolissima se paragonata a GWT-Ext o SmartGwt, è molto interessante perchè si appoggia nativamente e interamente su GWT... cioè non richiama codice javascript che il browser deve scaricare, ma lascia tutto in pasto al compilatore java-to-javascript di GWT... questo permettere di mettere in codice javascript (e quindi tutto peso che il browser deve scaricare) solo quello che in realtà si programma... e questo è un notevole vantaggio per applicazioni piccole o medio piccole&lt;/div&gt;&lt;div&gt;La differenza è notevolissima: per un mini progetto (giusto qualche pannello e qualche pulsante) con gwt mosaic, il codice (tra pagina html con js embedde e css) che il browser deve scaricare è di 92K, tra l'altro probabilmente molto riducibili, perchè si hanno due css da 28 k e molto probabilmente sono io l'imbranato che non ha capito come usarne solo uno, datyo che sono quasi identici, quindi possiamo dire che si arriverebbe a meno di 70 KB&lt;/div&gt;&lt;div&gt;Con gwt ext invece si tratterebbe di almeno 2MB (tra pagina html con js embedde, altri js e css) , poichè comunque bisogna scaricare il core  in js (che sono le librerie ext) di 770KB, più i js dell'applicazione, circa 10 KB, più almeno 100KB di css (in questo caso obbligatori)&lt;/div&gt;&lt;div&gt;insomma... si va dai 80-90 KB con gwtmosaic agli 800-900 di gwt-ext.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;certo, per grandi applicazioni le dimensioni di un progetto gwt-ext non cambiamo moltissimo in proporzione (il nostro helpdesk, che è abbastanza corposo, arriva a 900-1000KB totali), però la differenza è enorme.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2069849316373902180?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2069849316373902180/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2069849316373902180' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2069849316373902180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2069849316373902180'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2009/02/novita-in-ambito-gwt-smart-gwt.html' title='Novità in ambito GWT: Smart GWT, aggiornamenti a GWT-EXT e GWTMosaic'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-5413420742880449994</id><published>2009-01-20T10:39:00.003+01:00</published><updated>2009-01-20T11:22:24.521+01:00</updated><title type='text'>Latex</title><content type='html'>Ho iniziato ad impaginare al tesi con latex... in realtà non ho ancora terminato di scriverla, mi manca uno dei due capitoli centrali...&lt;div&gt;ma almeno inizio a scrivere seriamente il tutto.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Prendo appunti su alcuni settaggi:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voglio usare una doppia bibliografia, così da costrurire la classica bibliografia, e successivamente, una sitografia&lt;/div&gt;&lt;div&gt;Uso ovviamente bibtex, decisamente comodo&lt;/div&gt;&lt;div&gt;lo affianco al pacchetto multibib&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;quindi nella classe caricata all'inizio del documento, scrivo questi due comandi&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;\usepackage{multibib}&lt;/div&gt;&lt;div&gt;\newcites{sito}{Sitografia}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;dove il newcites introduce proprio la seconda bibliografia e una serie di comandi (simili a quelli di bibtex, ma con l'aggiunta ad onuno del suffisso "sito") appositi&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;all'interno del documento principale, subito dopo al creazione della bibliografia, creo la sitografia in questo modo&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;\bibliography{bibliografia} % inserisce la bibliografia e la prende in questo caso d bibliografia.bib&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;%sitografia, prendendo i dati da sitografia.bib, dentro il quale uso "misc"%&lt;/div&gt;&lt;div&gt;\bibliographystylesito{alpha}&lt;/div&gt;&lt;div&gt;\bibliographysito{sitografia} &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All'interno del documento, usando il normale comando \cite citerò i documenti della bibliografia normale, usando il comando \citosito, utilizzo al sitografia&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Per poter avere anche la sitografia, però, non posso usare il comodo comando preimpostato all'interno di TeXnicCenter "Build and View" (che compila tutto, crea il pdf, e lo visualizza), ma devo andare di riga di comando&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;latex tesi&lt;/div&gt;&lt;div&gt;bibtex tesi&lt;/div&gt;&lt;div&gt;bibtex sito&lt;/div&gt;&lt;div&gt;latex tesi&lt;/div&gt;&lt;div&gt;latex tesi&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;e qui si produce il file dvi&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;con il comando&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;dvips primo.dvi -o&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;si produce il file PostScript ps&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-5413420742880449994?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/5413420742880449994/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=5413420742880449994' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5413420742880449994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5413420742880449994'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2009/01/latex.html' title='Latex'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7103465956182529838</id><published>2008-12-29T16:00:00.002+01:00</published><updated>2008-12-29T16:06:14.230+01:00</updated><title type='text'>Effective Java</title><content type='html'>Da qualche settimana siamo fermi sullo sviluppo del framework (e quindi anche la mia tesi), ne ho approfittato, oltre che per migliorare il prototipo già funzionanente presso un nostro cliente, e per implementare nuove features richieste dal cliente stesso, per studiarmi uno dei libri che mi ero ripromesso di studiare: Effective Java.&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px; white-space: pre-wrap; "&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0321356683&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px; white-space: pre-wrap;"&gt;Interessante direi, molto utile in qualche consiglio, meno in altri, ma direi un must.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px; white-space: pre-wrap;"&gt;Alcuni dei consigli trovati nel libro li ho già "implementati" nel framework, migliorando alcuni aspetti che erano già stati realizzati. E sicuramente molti altri ci saranno in seguito utili.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px; white-space: pre-wrap;"&gt;Lo consiglio a tutti, soprattutto a chi come me non è espertissimo nella programmazione di grandi progetti.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7103465956182529838?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7103465956182529838/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7103465956182529838' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7103465956182529838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7103465956182529838'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/12/effective-java.html' title='Effective Java'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4114539555973447805</id><published>2008-11-25T11:42:00.003+01:00</published><updated>2008-11-25T14:49:15.688+01:00</updated><title type='text'>TeePee</title><content type='html'>Dopo un po' di giorni senza post, forse è il caso di aggiornare un po' chi segue questo blog (e guardando dalle statistiche di google analytics non siete nemmeno pochi, lasciatemi gongolare, dai).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nell'ultimo mese ci siamo dati completamente allo sviluppo del framework che fino dall'inizio volevamo sviluppare. Prima d'ora era poco più che un abbozzo, ma l'esperienza fatta nello sviluppare l'applicazione che già dei clienti stanno usando, ci ha permesso di trovare i reali bisogni di cui necessitiamo, e le carenze dei framework esistenti.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Il mio collega e correlatore ha gettato le basi, su cui ho costruito il resto, sempre sotto la sua supervisione.&lt;/div&gt;&lt;div&gt;Abbiamo anche deciso di rendere disponibile questo core del framework, rilasciandolos su google code con licenza &lt;span class="Apple-style-span"  style="  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:arial;"&gt;&lt;a href="http://www.gnu.org/licenses/lgpl.html" rel="nofollow" style="color: rgb(0, 0, 204); "&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;GNU Lesser General Public License&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Il tutto lo trovate qui: &lt;a href="http://code.google.com/p/teepee/"&gt;http://code.google.com/p/teepee/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Ovviamente attualmente non si trova molto online, tranne il codice nudo e crudo, ma presto, anche ai fini della tesi, rilasceremo i javadoc e qualche file esplicativo, oltre a quelche schema UML.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A tale proposito, qualcuno ha quelche strumento (opensource o freeware) da consigliare? Per ora ho provato &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;violetUML, non male, ma di fatto non utile nei sequence diagram&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ArgoUml, buono per il reverse enginering, mi ha generato tutti i diagramma di classe per tutti le classi del progetto, niente male, fa risparmiare tempo... ma poi poco usabile per creare i diagrammi&lt;/li&gt;&lt;li&gt;Visual Paradigm... niente male, ma a pagamento&lt;/li&gt;&lt;li&gt;StarUml... quello che sto usando ora, opensource, non male, ma i grafici non sono personalizzabili al 100%... alcune cose rimangono standard, come i punti di ancoraggio delle linee, frecce e simili.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4114539555973447805?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4114539555973447805/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4114539555973447805' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4114539555973447805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4114539555973447805'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/11/teepee.html' title='TeePee'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2887839711191196913</id><published>2008-10-08T15:43:00.003+02:00</published><updated>2008-10-08T16:01:51.563+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAO'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Ancora su Orm</title><content type='html'>Sono riuscito nel tentativo del salvataggio di una chiamata con hibernate/orm... ho in pratica trovato il modo per superare, più o meno, le restrizioni evidenziate in questo post(&lt;a href="http://lamiatesi-fdl.blogspot.com/2008/08/alcuni-problemi-con-gli-id-composti-e-i.html"&gt;Alcuni problemi con gli id composti e i valori di default con Hibernate&lt;/a&gt;).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In pratica ho usato degli DAO molto più semplici... che non considerano in pratica le relazioni molti a molti... in pratica, all'interno della classe che rappresenta la tabella nel database, ogni riferimento a chiavi esterne... è memorizzato come un campo qualsiasi, ignorando assolutamente se nei DAO esiste una classe che potrebbe sostiurire il campo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In pratica, prima, per esempio, se nella tabella chiamata evavo un campo id_imp che era ovviamente una chiava esterna per la tabella imp, il DAO era costituito come un field costituito da un elemento stesso della classe Imp... che a suo volta però al suo interno aveva un ID composito rappresentato dalla classe ImpId... ed è questo che pareva creare dei problemi.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ora, con questi nuovi DAO più semplici, in un caso come quello sopra, id_imp è rappresentato nella classe Chiamata dal field chiamato idImp rappresentato da una semplice stringa... posso quindi assegnarli una semplice stringa... che rappresenta poi l'id chiave esterna di imp (imp ha il campo id come stringa)&lt;/div&gt;&lt;div&gt;In pratica come dovrei fare se usassi SQL.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Così sono riuscito a memorizzare senza problemi una chiamata assegnando tramite gli strumenti di HIBernate tutti i valori che mi interessano.&lt;/div&gt;&lt;div&gt;In realtà qualcosa di diverso c'è... tutti i campi sono memorizzati come dati primitivi, String, char, int, date... cioè come la definzione del campo nel database... tranne alcuni (pochissimi) come per esempio HdTipoContab, che è memorizzato ancora come classe... questo perchè (credo) proprio al tabella hd_tipo_contab non ha id composto (come invece il 99% delle altre tabelle) e quindi è comuinque molto semplice usarlo... anche se ho dovuto aggiungere un costruttore alla classe così come era stata creata automaticamente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Questi DAO semplificati li ho ottenuti usando sempre Hibernate Tool, plugin di Eclipse, selezionando perà nel file di configurazione hibernate.revenge.xml solo el tabelle vere e proprie, ignorando le varie view presenti nel database, e selezionando, all'atto della creazione del codice, nessuna opzione particolare (quindi non selezionando"generate basyc typed composite id", nè "Decect optimistic lock columns", nè "detect many-to-many tables"), e nella schermata exporters, non ho selezionato nessuna delle opzioni in alto (quindi non ho selezionato nè "Use java 5 sintax" nè "Generate EJB3 annotations") e come exporters ho selezionato "domain code" (che genera le classi java che poi utilizzo), "Hibernate xml mapping .hbm.xml" (che genera i file xml per specificare ogni singola classe), "DAO Code" (che a quanto pare genera delle classi java chiamata come le precedenti+home... non so esattamente a cosa siano necessari, pare sempre ad hibernate), sia "Hibernate Xml Configuration, cfg.xml" che genera un nuovo hibernate.cfg.xml con i riferimenti ai file .hbm.xml che vengono generati.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2887839711191196913?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2887839711191196913/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2887839711191196913' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2887839711191196913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2887839711191196913'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/10/ancora-su-orm.html' title='Ancora su Orm'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2338190529159064508</id><published>2008-09-21T16:16:00.009+02:00</published><updated>2008-09-23T19:00:37.131+02:00</updated><title type='text'>OpenLaszlo e Flex</title><content type='html'>OpenLaszlo e Flex sono stati due dei framwerok di sviluppo di RIA che avevamo inzialmente preso in considerazione. Li scartammo quasi immediatamente per il legame che questi framweork hanno (o meglio, nel caso di Laszlo, avevano) con Flash e per lo sviluppo in Javascript/Actionscript, e non Java.&lt;br /&gt;&lt;br /&gt;Flex è un framework rilasciato da Adobe per la creazione di ria con un linguaggio markup proprio, MXML, basato su XML, utilizzato per descrivere il layout dell'interfaccia utente e i comportamenti, mentre ActionScript 3, linguaggio di programmazione orientato agli oggetti, utilizzato per creare la logica client. Il tutto compilato poi per la creazione di oggetti SWF per l'esecuzione tramite Flash Player.&lt;br /&gt;&lt;br /&gt;OpenLazlo oper in maniera piuttosto simile, anch'esso con un linguaggio simil XML condito con un linguaggio di programmazione, Javascript, anch'esso poi compilato in file SWF.&lt;br /&gt;Attualmente però  la nuova versione di OpenLaszlo supporta anche la possibilità di sviluppare ria anche senza l'uso di flash, ma con dhtml/ajax (come gwt, in poche parole), ma questo supporto è stato introdotto solo con la versione 4.1, rilasciata a Luglio 2008... decisamente molto più tardi di quando la nostra scelta di frawork base su cui lavolare è caduta su GWT.&lt;br /&gt;&lt;br /&gt;E' comunque interessante dare uno sguardo a questa tecnologia.&lt;br /&gt;Grossomdo il paradigma di programmazione non è così distante da GWT... si programma in un linguaggio, il framework mette a disposizione un compilatore che processa i file sorgente e produce del codice che verrà poi eseguito sul client.&lt;br /&gt;Il linguaggio di programmazione usato per OpenLaszlo è un markup language, LZX, linguaggio risultante dalla fusione di aspetti dichiarativi, derivanti dall' XML, con altri tipici della programmazione imperativa Object-Oriented, derivanti da JavaScript. Nei file sorgenti di OpenLaszlo infatti si utilizza una sintassi molto simile a quella di un classico file XML, con riferimenti alle API messe a disposizione del framwork, con l'aggiunta di codice JavaScript.&lt;br /&gt;Il compilatore poi, processando questi file sorgenti, crea un file SWT (quindi un file per Macromedia Flash), che possa quindi essere eseguito da qualsiasi browser con il Flash Player. Recentemente è stato anche introdotto il supporto per la compilazione di codice slegato da Flash,&lt;br /&gt;generando quindi codice DHTML/AJAX.&lt;br /&gt;Comunque sia, il codice simil-Javascript scritto nei file LZX non è quello eseguito dal browser, ma viene intepretato dal compilatore e resituito come codice actionscript di Flash, nel caso si vada poi ad utilizzare la tecnologia di Macoromedia, o generando del nuovo codice Javascript nel caso di utilizzo del classico AJAX.&lt;br /&gt;&lt;br /&gt;Pro:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La realizzazione dell'interfaccia utente risulta abbastanza semplice da realizzare, lineare e abbastanza riusabile. Il tutto viene realizzato con una serie di tag LZX che definiscono i componenti dell'interfaccia, la loro posizione, e le loro carattaristiche, il tutto riutilizzabile con la logica della programmazione ad oggetti.&lt;br /&gt;Per esempio questo codice&lt;br /&gt;&amp;lt; canvas&amp;gt;&lt;br /&gt;&amp;lt;button onclick="vw.setWidth(200)"&amp;gt;Expand&lt;br /&gt;Width&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;button x="120"&lt;br /&gt;onclick="vw.setWidth(100)"&amp;gt;Reset&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;view id="vw" y="30" width="100" height="100"&amp;gt;&lt;br /&gt;&amp;lt;!-- onwidth is sent anytime width is changed --&amp;gt;&lt;br /&gt;&amp;lt;handler name="onwidth"&amp;gt;&lt;br /&gt;this.setAttribute('bgcolor', (this.width&lt;br /&gt;&amp;gt; 100 ? red : blue));&lt;br /&gt;&amp;lt;/handler&amp;gt;&lt;br /&gt;&amp;lt;/view&amp;gt;&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;permette la creazione di due pulsanti, e relativi eventi.&lt;/li&gt;&lt;li&gt;Ci sono a disposizione numerevoli componenti, personalizzabili e riusabili, e le api, lmanoe per quanto riguarda l'implementazione con flash, è ben supportata e testata&lt;/li&gt;&lt;/ul&gt;Contro&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Per dare un minimo di interattività alla pagina bisogna comunque utilizzare dell'actionscript, quindi bisogna conoscere questo linguaggio&lt;/li&gt;&lt;li&gt;Il supporto DHTML non è ancora maturo... quindi si può produrre stabilmente solo con flash, e quindi ci si lega troppo a questo prodotto&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fonti:&lt;br /&gt;OpenLaszlo White Paper: http://www.openlaszlo.org/whitepaper/LaszloWhitePaper.pdf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2338190529159064508?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2338190529159064508/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2338190529159064508' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2338190529159064508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2338190529159064508'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/09/openlaszlo-e-flex.html' title='OpenLaszlo e Flex'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6526561348164492199</id><published>2008-08-29T11:52:00.003+02:00</published><updated>2008-08-29T15:07:42.916+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>Gwt-Log</title><content type='html'>Una delle cose più noiose nel logging con applicazioni GWT è che, lato client, non si riesce ad usare nativamente la console di loggin, ne quella di GWT in Hosted mode, nè quella del server. Il che diventa noioso, poichè spesso si ha la necessita di avere un minimo di tracciabilità delle attività svolte dal codice, e si vuole subito avere un feddback con il loggin, ma con gwt, almeno lato client, sono sempre stato obbligare ad usare i fastidiosi "windows alert".&lt;br /&gt;Certo, da una parte hanno la loro utilità, come quella di bloccare, di fatto, l'esecuzione dell'applicazione e questo può avere un suo aspetto positivo... ma sono troppo invadenti... e soprattutto se ce si li dimentica nel codice, passando poi il prodotto al cliente, si posson avere situazioni imbarazzanti.&lt;br /&gt;&lt;br /&gt;Ho trovato, in questi giorni, una libreria davvero interessante per il loggin con GWT&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://code.google.com/p/gwt-log/"&gt;GWT-LOG&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Che gestisce in maniera del tutto trasparente il loggin su più livelli... infatti, lasciando fare tutto a lui (ci sono comunque dei setting da poter usare per disabilitare/abilitare i vari tipi di logger), si può avere il log lato server (anche gli errori lato client possono essere spediti in amniera del tutto trasparente al server con rpc), con la normale console errore del server (errori lato server, come con il normale System.out o System.err), sia nella console dell'Hosted Browser di GWT (come con il classico GWT.log)(client e server), sia un log da leggere con al console di &lt;a href="http://getfirebug.com/"&gt;FireBug&lt;/a&gt; (un ottima estensione di Fiorefox), sia con un interessante "finestrella div" che compare all'interno delal applicazione stessa, un div semitrasparente draggabile...&lt;br /&gt;Insomma, si può fare veramente di tutto e con in pratica nessuna riga di codice particolare... si importa la libreria nel progetto, si inseriscono alcune righe nel file gwt.xml... e basta usare Log(stringa) e via che si logga dappertutto.&lt;br /&gt;Stupendo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aggiornamento: Strani Errori&lt;/span&gt;&lt;br /&gt;Ieri sembrava funzionare tutto perfettamente, mentre oggi, aggiornando il progetto a GWT 1.5, cambiando quindi librerie eccetera, ho forse commesso qualche errore... e non si compilava più il modulo gwt... continuava a lamentarsi che non trovava la libreria di gwt-log, in particolare che non trovava il file di confiugurazione gwt.xml del progetto gwt-log&lt;br /&gt;L'errore era:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [echo] Module: com.fdlservizi.sse.HelpDeskGWT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java] Loading module 'com.fdlservizi.sse.HelpDeskGWT'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java]    Loading inherited module 'com.allen_sauer.gwt.log.gwt-log'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java]       [ERROR] Unable to find 'com/allen_sauer/gwt/log/gwt-log.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java]    [ERROR] Line 7: Unexpected exception while processing element 'inherits'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java] com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java]     at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:225)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     [java]     at com.google.gwt.dev.cfg.ModuleDefSchema$BodySchema.__inherits_begin(ModuleDefSchema.java:194)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[...]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Non so per quale motivo, ma ignorava totalmente la presenza della libreria, che invece avevo normalmente selezionato tar le librerie esterne in IntelliJ Idea.&lt;br /&gt;Poi, guardando bene il forum di grails (in particolare &lt;a href="http://www.nabble.com/grails-1.0.1-with-gwt0.2.4-td15976497.html"&gt;questa discussione&lt;/a&gt;), non ho capito bene perchè, ho scoperto che dovevo inserire tale libreria nella directory &lt;root&gt;/lib/gwt.&lt;br /&gt;Cosa mai fatta, anche perchè eventualmente le librerie le avrei messe in &lt;root&gt;/lib, dentro al quale la directory gwt non esisteva nemmeno.&lt;br /&gt;Ora invece, con l file messo lì dentro, funziona senza problemi.... misteri di grails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6526561348164492199?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6526561348164492199/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6526561348164492199' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6526561348164492199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6526561348164492199'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/08/gwt-log.html' title='Gwt-Log'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7885795997902060954</id><published>2008-08-22T11:05:00.004+02:00</published><updated>2008-08-22T11:59:40.000+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='POJO'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Alcuni problemi con gli id composti e i valori di default con Hibernate</title><content type='html'>Stamattina, dopo aver passato due giorni a studiarmi il "paradigma di programmazione" per le GUI usato in sap (potrebbe tornarci utili, è uno interessante punto di riferimento a cui potremmo ispirarci), sono tornato a fare qualche esperimento con Hibernate.&lt;br /&gt;In particolare ho continuato a giocare con le select e gli insert con le nostre classi POJO create per ORM.&lt;br /&gt;&lt;br /&gt;Ho generato una pagina gsp di esperimento, con alcuni tasti gwt che usano una rpc, che "stimola" sue servizi lato server, uno per la ricerca delle classi (sempre "chiamata") e una per salvarla.&lt;br /&gt;Nessun problema nella ricerca di chiamata, sia con il findall, il list, il find, i criteria, eccetera...&lt;br /&gt;Bhe, in realtà ci sono dei problemi quando nel database ci sono dei null di troppo... ma è un problema correlato a quello che descvrivo qui in seguito.&lt;br /&gt;&lt;br /&gt;Infatti nel momento dell'inserimento abbiamo trovati i primi problemi. Essendo il nostro database costruito con delle doppie chiavi primarie (ogni tabella ha un id, nemmeno numerico autoincrementale, come sarebbe meglio fosse, ma come stringa, correlato sempre ad un altro campo presente in ogni tabella "az" che fa riferimento ad una tabella, az), ogni volta che noi abbiamo una chiave esterna, questa chiave esterna è anch'essa costruita con due campi... e anche al tabella a cui facciamo riferimento ha un id primario composto. Questo comporta che nel ricavare i dati di uno di queste colonne, devo fare un doppio passaggio. Nella colonna ricavo l'id delal classe associata, nella quale ricavo poi l'id, che è quello che viee di fatto immagazzinato nella colonna stessa.&lt;br /&gt;Ma all'atto dell'inserimento questo doppio passaggio non funziona. In pratica non riesco a memorizzare i campi se sono chiavi secondarie esterne... e questo ovviamente è un grosso problema. Il fatto è che non tutto il database è costruito in maniera perfetta, per esempio la tabella chiamata non ha riferimenti di chiave secondarie che puntano ad azienda, altre colonne sì... quindi il toll per il reverse enginering è andato un po' in pappa e non riesce a gestire in maniera completa queste doppie chiavi.&lt;br /&gt;Il tutto dovrebbe risolversi attuando una modifica al database che già volevamo attuare, cioè eliminare totalmente tutte le chiavi primarie composte con quel campo az, che di fatto non serve a nulla. Era stato introdotto tempo addietro quando il programma doveva essere multiazienda, cosa che è stata in seguito abbandonata.&lt;br /&gt;Non toglieremo nella tabelle il campo az (presente in tutte) e nemmeno la tabella az (per retrocompatibilità, alcune query presenti qua e là nel programma fanno riferimento a questa colonna), ma modificheremo tutte le chiavi primarie, facendole diventare uniche e non più composte (composte cioè dal solo campo id) e elimineremo ogni chiave secondaria esterna, in ogni tabella, che faccia riferimento ad az.&lt;br /&gt;&lt;br /&gt;Stamattina mi sono accorto però di un nuovo problema... la generazione automatica delle classi di dominio POJO, usate da Hibernate, non ha tenuto conto dei valori di default impostati nel database... essendo in sql server sono impostate con delle costraint di questo tipo&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ALTER TABLE [dbo].[chiamata] ADD  DEFAULT ('N') FOR [libretto]&lt;/span&gt;&lt;br /&gt;in questo caso la colonna libretto della tabella chiamata è impostata con un valore di default = N (tra l'alro la colonna ha come proprietà il poter accettare valori null).&lt;br /&gt;In hibernate di fatto non esistono modi per specificare nel file di mapping delle classi i valori di default... esisterebbe ma non è portabile sui vari databasi, prchè bisognerebbe specificare il formato di colonna, diverso per ogni tipologia di database, qundi da evitare.&lt;br /&gt;Di fatto, in una situazione del genere, se si vuole memorizzare nel database una classe di dominio per la quale non si specificano valori per un determinato fields, se questo accetta nel mapping valori null, hibernate lo inizializza automaticamente con null... infatti hibernate, quando deve memorizzare una classe sul database, nella query sql insert, specifica tutti i campi della classe stessa che nella proprietà del mapping abbiano &lt;span style="font-style: italic;"&gt;insert=true&lt;/span&gt;&lt;br /&gt;Ovviamente, se questa proprietà non viene specificata, hibernate automaticamente le popola con il valore null se la proprietà stessa l'accetta, o con al string avuota nel caso sia specificata not null&lt;br /&gt;Questo significa che di fatto vengono ignorati i valori di default specificati nel database, perchè di fatto al database arriva una query con quei campi specificati... quindi inserisce quelli e non i valori che lui ha come default.&lt;br /&gt;Se per esempio voglio forzare il database ad inserire i valori di dafault, dovrei fare in modo che hibernate non gli passi proprio quel campo... cosa possibile da fare, basta specificare insert=false&lt;br /&gt;&lt;property name="libretto" type="java.lang.Character" insert="false"&gt;&lt;br /&gt;           &lt;column name="libretto" length="1"&gt;&lt;br /&gt;&lt;/column&gt;&lt;br /&gt;facendo così hibernate ignora il campo libretto, e il database, non ricevendolo nella query insert, lo inserisce con il valore di default&lt;br /&gt;Così facendo però non è possibile inserire alcun valore... quindi se io volessi, all'atto della insert, specificare un valore per quella propietà, di fatto questa viene ignorata.&lt;br /&gt;&lt;br /&gt;Nel nostro caso, in effetti, c'è un modo molto semplice per risolvere il problema... basta mettere nel costruttore della classe di dominio il valore di default, o nel mio caso, dato che per le classi di dominio che vengono utilizzate anche lato client gwt, devo costruire una determinata classe che viene poi serializzata ed usata nel passaggio dati nella rpc, dichiaro quel dato field con il valore di default, così facendo, anche se lato client non viene specificato alcun valore, di fatto hibernate lo riceve con il valore preimpostato e lo passa al database.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;public class DatiChiamata implements IsSerializable {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    public String id;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    public String apertaDa;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    public String tipoChiamata;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    public String gradoDisservizio;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    [...]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    public String noteAssegnazione;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    public String libretto = "N";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    [...]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;/property&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7885795997902060954?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7885795997902060954/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7885795997902060954' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7885795997902060954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7885795997902060954'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/08/alcuni-problemi-con-gli-id-composti-e-i.html' title='Alcuni problemi con gli id composti e i valori di default con Hibernate'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7242938181914501755</id><published>2008-08-07T15:16:00.002+02:00</published><updated>2008-08-07T17:24:38.683+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAO'/><category scheme='http://www.blogger.com/atom/ns#' term='POJO'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>JAVA DAO, ORM, POJO</title><content type='html'>Abbiamo deciso di approfondire lo studio di Hibernate, effettivamente potrebbe esserci molto di aiuto, sia per la normale interrogazione di database (sia in selezione che in salvataggio) sia perché potrebbe evitarci i problemi di compatibilità con i due database che vogliamo supportare: Oracle e SQL Server.&lt;br /&gt;&lt;br /&gt;Abbiamo deciso di non affidarci totalmente a GORM (Grails Object Relational Mapping) perchè groovy si rileva meno performante in alcune condizioni, e abbiamo paura che sia limitante nel futuro.&lt;br /&gt;&lt;br /&gt;Quindi la scelta ricade sulla creazione di un ORM tramite JAVA DAO (Java Data Access Object) create con delle classi java POJO (Plain Old Java OBject).&lt;br /&gt;Questo significa mappare tutto il nostro database con delle semplici classi java che devvano rispecchiare determinate carrateristiche.&lt;br /&gt;In particolare Hibernate non ha richieste eccessive, ma secondo la logica del convention over configuration, è sempre meglio cercare di rispettare&lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en/html/persistent-classes.html"&gt; più richieste possibili&lt;/a&gt;, tra le quali:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ogni classe dovrebbe avere un suo identificare univoco, chiamato Id (e qui per noi è un problema... perchè in pratica ogni tabella del nostro database ha un id composto da due campi stringa... decisamente lontano dagli standard che prevedono un id numerico autoincrementale... lo so lo so)&lt;/li&gt;&lt;li&gt;Ogni classe dovrebbe prevedere un costruttore a zero argomenti, che sarà utilizzato da Hibernate per istanziare la classe&lt;/li&gt;&lt;li&gt;Tutti i campi della tabella dovrebbero essere trasformari in campi della classe. Quindi ogni classe dovrebbe avere una serie di campi da considerare persistenti (quindi direttamente mappabilis ul database), preferibilmente da settare come privati, e quindi definire i getter e i setter per ognuno di questi campi. In particolare ogni campo dopvra rispettare le classiche convenzioni ORM, quindi nel caso di un nome campo (o tabella) composto d apiù nomi uniti con l'underscore, si dovrà converire con nome univoco con le lettere maiuscole per ogni parola che lo compone... esempio il campo data_di_nascita sarà convertito in dataDiNascita. Inoltre per convenzione Hibernate si aspetta di trovare i getter e i setter così composti getDataDiNascita e setDataDiNascita.&lt;/li&gt;&lt;li&gt;Le classi non dovrebbero essere dichiarate &lt;span style="font-style: italic;"&gt;final&lt;/span&gt;, o in tal caso caso, dovrebbero implementare un interfaccia che dichiara tutti i metodi pubblici.&lt;/li&gt;&lt;li&gt;Nel caso di id composti conviene dichiarare l'id della classe come istanza di un'altra classe, convenzionamente chiamata nomeclasseId, nella quale vengono specificati i singoli campi delal chiave primaria composta.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ci siamo affidati, per la stesura di queste classid i dominio, ad &lt;a href="http://www.hibernate.org/255.html"&gt;Hibernate Tool&lt;/a&gt;, un plugin per Eclipse appositamente studiato dallo staff di hibernate.&lt;br /&gt;Seguendo i &lt;a href="http://www.wikihow.com/Generate-Hibernate-Pojo-Classes-from-DB-Tables"&gt;consigli di questa pagina&lt;/a&gt;, abbiamo proceduto con questi passi&lt;br /&gt;&lt;ul&gt;&lt;li&gt;dopo aver installato il plugin per eclipse (semplicemente scompattato lo zip preso dalla pagina di cui supra), ho creato un progetto grails, vuoto, con la classica procedura (nuova directory, &lt;span style="font-style: italic;"&gt;grails create-app&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Ho messo nella cartella lib del progetto il jar con il driver jdbs del database sqlserver (jtds-1.2.2.jar preso su &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=33291"&gt;sourceforge)&lt;/a&gt;. Avviato eclipse ho importato il progetto appena creato.&lt;/li&gt;&lt;li&gt;tasto destro sul progetto, ho creato un nuovo file di configurazione per hibernate: File -&gt; New -&gt; Other -&gt; Hibernate -&gt; Hibernate Configuration File.&lt;br /&gt;Il file di configurazione l'ho salvato nella directory grails-app/config/hibernate&lt;br /&gt;Come dialect ho scelto SQL Server, che poi sarà salvato nel file come &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt;&lt;br /&gt;Come classe del driver ho scelto net.sourceforge.jtds.jdbc.Driver&lt;br /&gt;Come connection url jdbc:jtds:sqlserver://localhost/Sacci_Gabry;instance=SQLEXPRESS (ho instalato il database in locale)&lt;br /&gt;Il resto ho lasciato in bianco&lt;/li&gt;&lt;li&gt;ancora tasto destro e quindi ho settato al configuarazione della console di Hibernate (File -&gt; New -&gt; Other -&gt; Hibernate -&gt; Hibernate Console Configuration)&lt;br /&gt;Ho lasciato tutto come proposto, inserendo però nel classpath la lib inserita prima nella directory lib del progetto (il driver jdbc)&lt;/li&gt;&lt;li&gt;ancora tasto destro e quindi ho creato un file per il reverse enginering (di fatto quello che poi creerà i file) [File -&gt; New -&gt; Other -&gt; Hibernate -&gt; Hibernate Reverse Engineering File(reveng.xml) ]&lt;br /&gt;Il file l'ho inserito come prima in grails-app/config/hibernate&lt;br /&gt;dopo aver selezionato la configurazione e aspettato che il database venisse letto, ho selezionato solo le tabelle del dbo&lt;/li&gt;&lt;li&gt;Fatto questo ho fatto partire la compilazione (Lunch -&gt; Hibernate Code Generation -&gt; Open Hibernate Code Generation Dialog)&lt;br /&gt;Come outpout folder ho scelto src\java, e come nome di package gorm&lt;br /&gt;Come exporter ho selezionato le domain code, hibernate xml mappings, hibernate xml configuration, e lo Schema Documentation (decisamente opzionale, ma carino, genera della documentazione html interessante e facile da consultae)&lt;br /&gt;La generazione del codice impiega un po' ad eseguirsi.&lt;/li&gt;&lt;li&gt;A questo punto bisogna spostare qualche file per seguire le convenzioni hibernate/grails&lt;br /&gt;Il file hibernate.cfg.xml appena generato, diverso dal precedente in quanto conteiene tutti i riferimenti ai file di maping, va spostato nella directori config/hibernate, sovrascrivendo quindi il precedente&lt;br /&gt;Tutti i file hbl.xml vanno spostati nella stessa directorty grails-app/config/hibernate&lt;/li&gt;&lt;/ul&gt;A questo punto tutto è pronto per lavorare... si possono visualizzare e quindi utilizzare le view di eclipse predisposte per hibernate, consultare il database, la session factory, fare query HQL ecc..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7242938181914501755?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7242938181914501755/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7242938181914501755' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7242938181914501755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7242938181914501755'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/08/java-dao-orm-pojo.html' title='JAVA DAO, ORM, POJO'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1085754356047922810</id><published>2008-07-29T14:53:00.005+02:00</published><updated>2008-07-29T15:36:48.348+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GORM'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Hibernate, session, Dynamic Methods + Inject</title><content type='html'>Ci siamo accorti che così come utilizziamo noi sql, creiamo una differente connessione al database per ogni servizio, cosa non molto gradevole in effetti.&lt;br /&gt;Infatti, sino ad ora, abbiamo raramente usato GORM e Hibernate, data la "stramba" costruzione del database già esistente per il programma (id stringa, più campi per chiavi primarie, eccetera), e quindi risulta più "facile" usare sql diretto piuttosto che gorm e hibernate. Quindi usiamo &lt;span style="font-style: italic;"&gt;groovy.sql.Sql&lt;/span&gt; per la creazione di query sql on the fly.&lt;br /&gt;Abbiamo tentanto la strada della memorizzazione delle sessioni nella session http, cosa che funziona, ma rende poco pratica la gestione delle sessioni stesse, perchè ogni volta che serve richiamare la connessione, bisogna scrivere svariate righe di codice, per ogni metodo dei dervizi che utilizzano sql...&lt;br /&gt;Per farlo abbiamo usato questa strategia: nella prima connessione al database creata, quella del login, creiamo un istanza SQL come normalmente si dovrebbe fare in ogni service&lt;br /&gt;&lt;span style="font-style: italic;"&gt;import groovy.sql.Sql&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def sql = Sql.newInstance("jdbc:jtds:sqlserver://192.168.0.22/sacco;instance=SQLSSE", "sa", "fdl", "net.sourceforge.jtds.jdbc.Driver")&lt;/span&gt;&lt;br /&gt;e poi la memorizziamo nella sessione come altre informazioni (user, profilo, eccetera)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def session = RCH.currentRequestAttributes().session&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;session.connessioneDB = sql&lt;/span&gt;&lt;br /&gt;E il tutto sembra funzionare... per poi richiamare questa connessione sql, basta fare in ogni servizio&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def session = RCH.currentRequestAttributes().session&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def sql= session.connessioneDB&lt;/span&gt;&lt;br /&gt;per poi usare l'oggetto sql normalmente (quindi sql.execute eccetera)&lt;br /&gt;Questo portava anche al vantaggio si avere la stringa di connessione al database in uan sola classe, e non in ogni servizio (maggiore mantenibilità)&lt;br /&gt;&lt;br /&gt;Abbiamo quindi provato un'altra strada... essendoci hibernate comodamente pronto nel framework grails, abbiamo provbato ad usare le sessioni di hibernate per fare una cosa simile, in più abbiamo provato ad utilizzare i metodi dinamici di groovy iniettando nei servizi un oggetto sql già pronto all'uso... il tutto funziona... solo che non usando nativamente hibernate (ma lo usiamo solo per ricavare connessioni e non per gestire gli accessi al database) pare che non si riescano a recuparare connessioni univoche... ma che hibernate ne crei una nuova ogni volta che viene invocato con il metodo che più avanti spieghiamo.&lt;br /&gt;E' stato comunque interessante provare questo approccio perchè ci ha permesso di verificare la possibilità di iniettare metodi (e proprietà) in svariate classi (singole, nominali, tutti i servizi, i controller, le classi di dominio eccetera)... ed addirittura provare la creazione di plugin (che pare essere l'unica strada efficace per effettuare l'iniettamento di metodi dinamici)&lt;br /&gt;Questo approccia, nonostante non persegue il fine di riutilizzare una connessione unica, ha il vataggio di mettere a disposizione l'oggetto sql ad ogni servizio, senza riga di codice alcuna, e di utilizzare il file DataSource.groovy normalmente presente nei progetti grails... così si possono utilizzare i tre environment di questo file (development, production, test)&lt;br /&gt;&lt;br /&gt;Abbiamo quindi creato un nuovo plugin in (seguendo la procedura indicata qui: &lt;a href="http://docs.codehaus.org/display/GRAILS/The+Plug-in+Developers+Guide"&gt;http://docs.codehaus.org/display/GRAILS/The+Plug-in+Developers+Guide&lt;/a&gt;), dentro al quale abbiamo inserito il seguente codice:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def doWithDynamicMethods = {applicationContext -&gt;&lt;br /&gt;     System.err.println("il metodo dinamico è partito1");&lt;br /&gt;     def sf = applicationContext.sessionFactory    &lt;br /&gt;     com.fdlservizi.sse.SSEService.metaClass.getDbConn = {-&gt;&lt;br /&gt;         def sessione = sf.currentSession&lt;br /&gt;         def connessione = sessione.connection()&lt;br /&gt;         return connessione&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Il quale inietta nella classe SSEService il metodo gerDbConn. In Grails inoltre vige la convenzione che ad ogni metodo get e set, corrisponda immediatamente, anche se non dichiarata, la relativa proprietà... quindi, specificando per una determinata classe il metodo getProprietà e/o setProprietà, automaticamente si può richiamare il metodo getProprietà semplicemente definendo: def proprietà (oppure utilizzando direttamente proprietà)&lt;br /&gt;&lt;br /&gt;La classe SSEService, posta nella directory src/groovy/com.fdlservizi.sse/ è così composta&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package com.fdlservizi.sse&lt;br /&gt;&lt;br /&gt;import groovy.sql.Sql&lt;br /&gt;import java.sql.Connection&lt;br /&gt;&lt;br /&gt;class SSEService {&lt;br /&gt;  &lt;br /&gt;   Sql getSql(){&lt;br /&gt;def globalSql = new Sql((Connection)dbConn)&lt;br /&gt;       globalSql.execute("set dateformat ymd")&lt;br /&gt;       System.err.println("connection = " + (Connection)dbConn);&lt;br /&gt;       return globalSql&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   Connection getConnection(){&lt;br /&gt;       System.err.println("connection = " + dbConn);&lt;br /&gt;       return dbConn&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   org.hibernate.impl.SessionImpl getDbSession(){&lt;br /&gt;       return dbSess&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In questa classe, quindi, per quello detto prima, semplicemente richiamando "dbConn", è come se richiamassimo getDbConn iniettato dal plugin.&lt;br /&gt;Questa classe la usiamo poi per estendere ogni servizio che intenda usare una connessione sql... in questo modo, all'interno del servizio, possiamo semplicemente usare la sintassi che fino a quel momento usavamo, senza mai dichiarare l'oggetto sql.... perchè di fatto iniettato nella classe che estendono, quindi ereditato&lt;br /&gt;&lt;br /&gt;In ogni servizio infatti si può tranquillamente scrivere, per esempio&lt;br /&gt;&lt;span style="font-style: italic;"&gt;sql.eachRow("select * from imp_tipo")&lt;/span&gt;&lt;br /&gt;e si sottoindente &lt;span style="font-style: italic;"&gt;GetSql&lt;/span&gt;, che a sua volta, sottointende &lt;span style="font-style: italic;"&gt;getDbConn&lt;/span&gt;, che a sua volta sottointende &lt;span style="font-style: italic;"&gt;applicationContext.sessionFactory.currentSession.connection()&lt;/span&gt; che restituisce la connessione di hibernate (presa dal file DataSource.groovy)&lt;br /&gt;Questo però, come detto prima, al contrario delle nostre aspettative, sembra aprire sempre nuove connessioni.&lt;br /&gt;Inoltre, nella classe SSEService, facciamo ad ogni richiesta di connessione, l'esecuzione del setdateformat, necessario per l'esecuzione delle nostre query, anche questo vantaggio notevole, dato che senza questo accorgimento bisognava eseguirla, in ogni servizio che utilizzava le date (DateTime, TimeStamp) e simili nelle query.&lt;br /&gt;&lt;br /&gt;Abbiamo comunque deciso di concetrarci ora allo studio del dialetto di Hibernate, per utilizzare direttamente le sue potenzialita, demandando l'uso di sql diretto solo nei momenti in cui sarà strettamente necessario. Questo ci permetterà, presumibilmente, di demandare ad hibernate la gestione del pool di connession al database e le differenze tra i due database che dovremmo abdare a supportare (sql server e oracle).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1085754356047922810?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1085754356047922810/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1085754356047922810' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1085754356047922810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1085754356047922810'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/07/hibernate-session-dynamic-methods.html' title='Hibernate, session, Dynamic Methods + Inject'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-444075177080930552</id><published>2008-06-26T09:38:00.006+02:00</published><updated>2008-09-19T10:28:45.065+02:00</updated><title type='text'>Versioning</title><content type='html'>Sto provando ora l'utilizzo delle versioni per i progetti grails.&lt;br /&gt;Da riga di comando, si può manipolare il file application.properties, settando quindi la versione, con&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails set-version n&lt;/span&gt;&lt;br /&gt;dove n sta per il numero di versione.&lt;br /&gt;Questo va a modificare la proprietà app.version all'interno del file sopracitato.&lt;br /&gt;&lt;br /&gt;Successivamente si può utilizzare questo numero, all'interno dei progetti grails, con&lt;br /&gt;&lt;br /&gt;da un controller con&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;def version = grailsApplication.metadata['app.version']&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="code"&gt;&lt;pre&gt;Oppure con le righe&lt;br /&gt;&lt;br /&gt;&lt;span class="java-keyword"&gt;import&lt;/span&gt; grails.util.*&lt;br /&gt;def grailsVersion = GrailsUtil.grailsVersion&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;Oppure, all'interno di pagine gsp, con&lt;br /&gt;&lt;br /&gt;&lt;g:meta name="app.version"&gt;&lt;br /&gt;&lt;br /&gt;Una volta che è stata settata al versione dell'applicazione, la creazione del war con il comando&lt;br /&gt;grails war&lt;br /&gt;rifletterà questi cambiamenti, nominando il war come nomeapplicazione.n.war, dove n sarà il numero di versione (in realtà questo per ora non succede, non so perchè, rimane sempre con il numero di versione 0.1; sul forum mi hanno consigliato di usare il comando &lt;/g:meta&gt;&lt;span style="font-style: italic;"&gt;grails clean&lt;/span&gt; prima di &lt;span style="font-style: italic;"&gt;grails war&lt;/span&gt;, ma nulla&lt;g:meta name="app.version"&gt;)&lt;br /&gt;&lt;br /&gt;Durante il deploy si può inoltre specificare la directory di deploy, in quanto, di default, viene messo in una directory con lo stesso nome del war.&lt;br /&gt;Per farlo basta usare il comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;asadmin deploy --contextroot /HelpDesk nomewar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Prima però bisogna fare l'undeploy dell'eventuale app già installata in quella directory, lo si fa con&lt;br /&gt;&lt;span style="font-style: italic;"&gt;asadmin undeploy nomeapp&lt;/span&gt;&lt;br /&gt;nel nostro caso&lt;/g:meta&gt;&lt;br /&gt;&lt;div style="font-style: italic;" class="msg Nth"&gt;asadmin undeploy HelpDeskGwt.1.2.6&lt;/div&gt;&lt;g:meta name="app.version"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AGGIORNAMENTO del 1 Luglio&lt;br /&gt;&lt;/span&gt;Ho trovato l'errore del war... era colpa mia, nel file di configurazione config.groovy avevo inserito una riga di codice:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails.war.destFile = """HelpDeskGwt-0.1.war"""&lt;/span&gt;&lt;br /&gt;e questo forzava il nome del war... ora funziona tutto&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/g:meta&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-444075177080930552?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/444075177080930552/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=444075177080930552' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/444075177080930552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/444075177080930552'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/06/versioning.html' title='Versioning'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4165051276323461611</id><published>2008-06-13T16:44:00.002+02:00</published><updated>2008-06-13T16:46:53.840+02:00</updated><title type='text'>Anche in Italia si muove qualcosa</title><content type='html'>Negli ultimi giorni anche il gruppo (mailing list su yahoo gropuc: &lt;a href="http://it.groups.yahoo.com/group/Grails-IT/"&gt;http://it.groups.yahoo.com/group/Grails-IT/&lt;/a&gt;) italiano di Grails si sta animando, e oggi è stato rilasciato un tutorial interessante (mannaggia... se ci fosse stato un mesetto fa, avrei faticato molto meno)&lt;br /&gt;&lt;br /&gt;Questo il messaggio integrale&lt;br /&gt;&lt;br /&gt;Ciao,&lt;br /&gt;&lt;br /&gt;ieri è stato pubblicato su Mokabyte il primo articolo su Grails e Groovy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.mokabyte.it/cms/article.run?articleId=DYG-V69-HKE-Z3O_7f000001_10553237_7391cad5" target="_blank"&gt;http://www2.mokabyte.it/cms&lt;wbr&gt;/article.run?articleId=DYG-V69&lt;wbr&gt;-HKE-Z3O_7f000001_10553237&lt;wbr&gt;_7391cad5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Per come è fatto Grails, una Demo vale più di mille parole. Anche&lt;br /&gt;l'articolo riprende questa impostazione alla "sporchiamoci subito le&lt;br /&gt;mani", nei prossimi numeri andrò più in profondità sui vari argomenti&lt;br /&gt;chiave.&lt;br /&gt;&lt;br /&gt;Ovviamente, qualsiasi domanda o suggerimento per i prossimi numeri è&lt;br /&gt;bene accetto.&lt;br /&gt;&lt;br /&gt;Buon weekend!&lt;br /&gt;&lt;br /&gt;Brando&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4165051276323461611?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4165051276323461611/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4165051276323461611' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4165051276323461611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4165051276323461611'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/06/anche-in-italia-si-muove-qualcosa.html' title='Anche in Italia si muove qualcosa'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1876180166778829368</id><published>2008-06-12T12:23:00.003+02:00</published><updated>2009-02-02T14:58:17.737+01:00</updated><title type='text'>Alcuni Errori - bug risolti, da ricordare</title><content type='html'>Durante lo sviluppo della nostra interfaccia sono emersi dei comportamenti strani di Gwt o GET-EXT o grails...&lt;br /&gt;Forse dipendenti dalla mia scarsa esperienza, o forse da veri e propri buchi... non so&lt;br /&gt;&lt;br /&gt;Elenco qui quelli che ho risolto, così da ricordarmi in futuro&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Normalmente grails si accorge di ogni modifica effettuata ai file sorgenti e tenta la ricompilazione dei file necessari. Non ne sappiamo bene i motivi, ma così come è impostato Grails e il plugin di gwt, se si modificano dei file lato client di gwt, non sempre parte la compilazione. O meglio, sembra partire sempre, ma sembra che non vengano cancellati i file che gwt ha creato la compilazione precedente. Di fatto quindi le modifiche non vengono prese.&lt;br /&gt;&lt;br /&gt;Ho perso ore prima di capire questo problema... e pensavo che none ro capace di programmare, non mi capacitavo del perchè non vedevo le modifiche che avevo progettato... ed ecco poi risolto l'arcano... il problema, almeno questa volta, non ero io.&lt;br /&gt;&lt;br /&gt;RISOLTO:&lt;br /&gt;Francesco ha trovato al soluzione... obbligare lo script del plugin di gwt a ricompilare tutto.&lt;br /&gt;Questo lo si ottiene aggiungendo alla riga 76 del filke _Internal.groovy del plugin il seguente codice&lt;br /&gt;gwtForceCompile = true&lt;br /&gt;Avendo quindi questo codice:modules.each { moduleName -&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; gwtForceCompile = true&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;if (!gwtForceCompile &amp;amp;&amp;amp;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;GU.environment != GA.ENV_PRODUCTION &amp;amp;&amp;amp;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;  neW File("${outputPath}/${moduleName}/${moduleName}.nocache.js").exists()) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; // We can skip this module.&lt;br /&gt;        &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; }&lt;br /&gt;&lt;br /&gt;In più, per evitare il problema derivante dal "Java Heap Speace" abbiamo modificato il comando&lt;br /&gt; java(classname: 'com.google.gwt.dev.GWTCompiler', fork: 'true')&lt;br /&gt;sempre nello stesso file con&lt;br /&gt; java(classname: 'com.google.gwt.dev.GWTCompiler', fork: 'true',maxmemory: "512m")&lt;br /&gt;&lt;br /&gt;Se si hanno poi dei problemi con il jar di getext (non ho capito bene in quali casi avviene il problema, ma in alcune circostanze è così) va aggiunta anche questa riga di codice&lt;br /&gt;pathElement(location: "${basedir}/lib/gwtext.jar")&lt;br /&gt;nella zona della dichiarazioni del classhpath&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mai modificare un file di servizio lato server quando l'applicazione è up, perchè se per caso si aggiorna la pagina dell'aplicazione, grails si accorge che qualcosa è stato modificato, tenta la ricompilazione ma CANCELLA deliberatamente i file del servizio lato client. Non so bene perchè succeda, forse è provocato dalla modifica al plug in che abbiamo fatto (che forza la compilazione del modulo gwt, per risolvere il baco di cui sopra). Bisogna prima fermare l'appplicazione, o distruggere il server, poi ricompilare.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Attenzione con la gestione degli ascoltatori dei pulsanti, se poi li si vogliono abilitare e disabilitare. Non so se è un paco gi GWT o GWT-EXT (i button e i listener che utilizzo sono di GWT-EXT) o se è un normale comportamento... sta di fatto che se si aggiunge un ascoltatore ad un pulsante con una ascoltatore anonimo (come quasi sempre si fa), se ad un certo punto lo si disabilita, pare scomparire l'ascoltatore associato, quindi anche se lo si riabilita, non ascolta più nulla.&lt;br /&gt;Nel mio codice infatti avevo questo&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-family:Georgia,serif;"&gt;salvaButton.addListener(new&lt;/span&gt;&lt;/code&gt; &lt;code&gt;ButtonListenerAdapter&lt;/code&gt;(){&lt;br /&gt;&lt;code&gt;public void onClick(Button  button, EventObject e) {&lt;br /&gt;              [...]             &lt;br /&gt;          }&lt;br /&gt;&lt;/code&gt;});&lt;br /&gt;&lt;br /&gt;Trasformato poi in&lt;br /&gt;&lt;br /&gt;&lt;code&gt;salvaButton.addListener(new AscoltatoreBottoneSalva());&lt;br /&gt;&lt;br /&gt;private class AscoltatoreBottoneSalva extends ButtonListenerAdapter{&lt;br /&gt;          public void onClick(Button  button, EventObject e) {&lt;br /&gt;              [...]             &lt;br /&gt;          }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1876180166778829368?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1876180166778829368/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1876180166778829368' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1876180166778829368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1876180166778829368'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/06/alcuni-errori-bug-risolti-da-ricordare.html' title='Alcuni Errori - bug risolti, da ricordare'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-555455685943031352</id><published>2008-06-10T11:43:00.003+02:00</published><updated>2008-06-13T10:43:44.668+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt-ext'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Giornata di aggiornamenti</title><content type='html'>Stamane è giornata di aggiornamenti.&lt;br /&gt;Novità non indifferente, in ufficio abbiamo aperto la nuova macchina del caffè, una gaggia, tutta automatica, con il caffè in grani... scusate se è poco... la macchinetta di prima quasi ci esplodeva in mano ogni volta che l'accendevamo...&lt;br /&gt;Bella bella...&lt;br /&gt;vabbhe, torniamo alle cose importanti (perchè, il caffè non lo è? sì, è essenziale nella vita di un programmatore, ma forse non ai fini di questo blog)&lt;br /&gt;&lt;br /&gt;Stamattina ho aggiornato sia Grails che Groovy&lt;br /&gt;Di &lt;a href="http://groovy.codehaus.org/"&gt;Groovy &lt;/a&gt;è stata rilasciata la versione 1.5.6, avevo installato sino ad ora la 1.5.5... d fatto nulla di che, solo qualche bugfix e migliorie varie...&lt;br /&gt;Di &lt;a href="http://grails.org/1.0.3%20Release%20Notes"&gt;Grails&lt;/a&gt; è stata recentemente rilasciata la &lt;a href="http://grails.org/1.0.3%20Release%20Notes"&gt;1.0.3&lt;/a&gt;, con alcuni bug fix, il supporto al tipo Enum, e un nuovo modo operativo, l'interactive mode, e migliore supporto all'internalizzazione i18n.&lt;br /&gt;Oltre aver installato grails ho anche aggiornato il nostro progetto con la nuova release, dopotutto è semplice... basta il comando &lt;span style="font-style: italic;"&gt;grails update&lt;/span&gt; nella directory del progetto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AGGIORNAMENTO di Giovedì 12&lt;/span&gt;&lt;br /&gt;Oggi ho aggiornato anche gwt-ext, di cui hanno rilasciato al versione 2.0.4&lt;br /&gt;Alcune importanti migliorie sono presenti in questo aggiornamento, come il supporto a firefox3, che con la nuova verisone, dava alcuni problemi (firefox3 è+ molto più compatibile agli standard w3c di firefox2 e ie7... questo per assurdo creava problemi).&lt;br /&gt;In questo aggiornamento c'è anche una nuova componente, pagebus... non so esattamente cosa sia, non ho capito, si orienta su nuove tecnologie presenti in opera, firefox, e safari. Comunque proprio questo aggiornamento ha iniziato a crearmi dei problemi.&lt;br /&gt;Non in fase di compilazione, tutto filava liscio, ma Intellij IDEA ha iniziatoa  darmi strani errori... in tutti i file mi continuava a dire&lt;br /&gt;class blabla is defined in module 'com.gwtext.Pagebus' witch is not inherited in in module 'nome dle modulo del mio progetto'&lt;br /&gt;ho aggiunto questa riga&lt;br /&gt;&lt;inherits name="com.gwtext.Pagebus"&gt;&lt;br /&gt;al file nomemodulo.gwt.xml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-555455685943031352?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/555455685943031352/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=555455685943031352' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/555455685943031352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/555455685943031352'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/06/giornata-di-aggiornamenti.html' title='Giornata di aggiornamenti'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1279492895418888442</id><published>2008-06-06T17:18:00.002+02:00</published><updated>2008-06-06T17:26:24.677+02:00</updated><title type='text'>Rieccomi</title><content type='html'>Dopo quasi un mese senza aggiornamenti, rieccomi.&lt;br /&gt;Ho avuto poco tempo da dedicare al blog, nonostante le mie intenzione, a causa del sovraccarico di lavoro che la consegna di un progetto che mi coinvolgeva in prima persona ha portato.&lt;br /&gt;Infatti, proprio durante lo studio sulla possibile accoppiata Grails+GWT (e GWT-Ext) si è conretizzata la possibilità di utilizzare proprio queste tecnologie per lo sviluppo di uno dei lavori richiesti da un cliente della fdl servizi.&lt;br /&gt;Bisognava infatti rivedere un "HelpDesk" (una sorta di gestioen di ticket-aiuto) per la gestione di una centrale termica di un noto ospedale milanese.&lt;br /&gt;Il tutto ovviamente deve essere usufruibile via web, e quale migliore occasione per testare queste tecnologie?&lt;br /&gt;&lt;br /&gt;Il risultato? decisamente buono&lt;br /&gt;A parte molti problemi nati qua e là durante il percorso, e quasi integralmente risolti, abbiamo ottenuto un interfaccia fresca, veloce e razionale, molto più performante di quello che pensavamo. Le rpc di GWT, integrate lato server con servizi groovy-grails, hanno una risposta davvero buono e lo scambio di dati tra client e server, anche attraverso "internet" e non solo uan rete intranet, è davvero buona, anche quando si tratta di compilare una griglia con migliaia di stringhe al suo interno.&lt;br /&gt;&lt;br /&gt;Presto metterò online alcuni stralci di codice, in particolare per quanto riguarda la realizzazione delle RPC (come mi è stato richiesto da altri ragazzi che mi hanno scritto via mail per problemi riguardati lo sviluppo di RPC in GWT).&lt;br /&gt;Parlerò inoltre della delegazione, da preferire in alcuni casi all'ereditarietà... anche se questo pattern, risolvendomi alcuni problemi e semplificandomi alcuni dettagli, mi ha portato a problematiche che non ho ancora risolto, che spero di annullare ocn lo studio di alcuni pattern proposti dai libri che ho già nominato in passato sul blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1279492895418888442?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1279492895418888442/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1279492895418888442' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1279492895418888442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1279492895418888442'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/06/rieccomi.html' title='Rieccomi'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1689696495488258872</id><published>2008-05-07T16:01:00.006+02:00</published><updated>2008-05-08T14:42:43.188+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails + GWT</title><content type='html'>Ho finito di leggere ed applicare l'esempio del libro "&lt;a href="http://lamiatesi-fdl.blogspot.com/2008/04/getting-started-with-grails.html"&gt;Getting started with Grails&lt;/a&gt;"... sembra proprio essere un gran bel framwork, ottimo per lo sviluppo di service web, praticamente fa tutto lui e grazie alla convention over configuration il codice da scrivere è davvero poco. Eseguendo la logica del MVC sembra non sia difficile integrare, come parte "view" del client dei moduli GWT.&lt;br /&gt;&lt;br /&gt;Quindi ora passo allo studio proprio dell'integrazione di Grails con GWT.&lt;br /&gt;Esiste un plugin per grails, già esistente nella normale installazione di Grails: &lt;a href="http://grails.org/GWT+Plugin"&gt;http://grails.org/GWT+Plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Purtroppo sul sito di codehouse il plugin, o meglio, l'integrazione effettiva di gwt e grails non sono ben documentate, anzi...&lt;br /&gt;Per prima cosa l'installazione del plugin nei singoli progetti grails non è veloce, almeno la prima volta: eseguito nel progetto racetack, quello che ho creato studiando GSWG, il comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails install-plugin gwt&lt;/span&gt;&lt;br /&gt;ho dovuto aspettare quasi 10 minuti prima che si "ripulisse la cache"... di cosa non so bene.&lt;br /&gt;&lt;br /&gt;Ho quindi creato il modulo gwt, chiamandolo Racetrack, seguendo la classica regola dei nomi del package, quindi con il comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails create-gwt-module com.fdlservizi.Racetrack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seguendo la logica che quella che voglio fare è una view al progetto già esistente e funzionante, ho creato la pagina hosting del modulo gwt pensandola proprio come una view al controller "race".&lt;br /&gt;La convenzione del plug in di gwt vuole che con il comando &lt;span style="font-style: italic;"&gt;grails create-gwt-page &lt;page&gt; &lt;module&gt;&lt;/module&gt;&lt;/page&gt;&lt;/span&gt;, dove &lt;page&gt; è la pagina hosting con il relativo path, se la pagina è indicata come una gsp e come indirizzo ha una singola cartella, questa viene interpretata come un &lt;span style="font-style: italic;"&gt;controller view&lt;/span&gt;, altrimenti viene trattata come una normale pagina web.&lt;br /&gt;Quindi ho eseguito il comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails create-gwt-page race/gwt.gsp &lt;/span&gt;&lt;span style="font-style: italic;"&gt;com.fdlservizi.Racetrack&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Tutto ciò dovrebbe avermi creato i file di configurazione necessari per il funzionamento del modulo gwt, e la pagina hosting dove mettere poi i widget gwt.&lt;br /&gt;Con il comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails run-gwt-client&lt;/span&gt;&lt;br /&gt;parte l'esecuzione dell'hosted mode di gwt, quindi parte anche il "browser" interno di gwt... va però precisato, e io me ne sono accorto dopo un po' di imprecazione, che deve essere attivo il server web... quindi da IDEA prima faccio partire il progetto racetrack e poi eseguo il comando &lt;span style="font-style: italic;"&gt;run-gwt-client&lt;/span&gt; (ovviamente questo e i comandi precedenti vanno fatti all'interno del path del progetto racetrack)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edit 8 Maggio&lt;/span&gt;&lt;br /&gt;Iniziano i primi problemi... in pratica, come indicato nella &lt;a href="http://grails.org/GWT+Plugin"&gt;pagina del plugin di gwt&lt;/a&gt;, per poter usare map e list in gwt, bisogna specificare nel servizio di grails il tipo di ritorno di queste liste o mappe. In teoria questo lo si dovrebbe fare con &lt;span style="font-style: italic;"&gt;@CollectionTypeArg&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;@MapTypeArg&lt;/span&gt; ma qui casca l'asino. Il mio ambiente non vede le classi per queste annotation... viene questo errore&lt;br /&gt;&lt;/page&gt;"unable to find class for annotation"&lt;br /&gt;Ho chiesto aiuto nella &lt;a href="http://www.nabble.com/Problem-with-gwt-plugin%3A-unable-to-find-class-for-annotation-td17124299.html"&gt;mailing list di Nabble Grails User&lt;/a&gt;&lt;br /&gt;Vediamo se ottengo aiuto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edit&lt;/span&gt;&lt;br /&gt;Pausa pranzo finita e per ora nessun aiuto. Ho cercato di arrangiarmi e qualcosa, forse, ho risolto. Smattendo a destra e a manca no trovato dove risiede la classe delle annotazioni del plug in di gwt... in pratica nella directory del porgetto, sotto plugin in, vi è la directory in cui vi sono due jar. Uno di questi è grails-gwt-util.jar&lt;br /&gt;Ho importato questa libreria da IDEA, andando in Setting -&gt; Project Setting -&gt; Library -&gt; Attach Classes -&gt; e ho selezionato il jar di cui sopra.&lt;br /&gt;Poi nel file in cui voglio usare le annotazioni ho importato il riferimento alle annotazioni con&lt;br /&gt;&lt;span style="font-style: italic;"&gt;import org.codehaus.groovy.grails.plugins.gwt.annotation.CollectionTypeArg&lt;/span&gt;&lt;br /&gt;Non so se è il metodo corretto, nè perchè abbia dovuto farlo (presupponevo che il plugin di GWT almeno importasse le jar necessarie al suo funzionamento), ma sembra funzionare.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1689696495488258872?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1689696495488258872/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1689696495488258872' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1689696495488258872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1689696495488258872'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/05/grails-gwt.html' title='Grails + GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6096000264929709046</id><published>2008-05-02T16:39:00.005+02:00</published><updated>2008-05-07T16:18:54.244+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDEA'/><category scheme='http://www.blogger.com/atom/ns#' term='HSQLDB'/><title type='text'>Si passa ad Intellij Idea</title><content type='html'>I problemi che ho esposto in questo post &lt;a href="http://lamiatesi-fdl.blogspot.com/2008/04/lo-scaffolding-non-funziona.html"&gt;Lo Saffolding non funziona&lt;/a&gt; ho poi scoperto non dipendono dalla mia ignoranza in materia grails o java... ma dal plugin di eclipse per grails che funziona male... e corrompe i file e l'ambiente.&lt;br /&gt;&lt;br /&gt;Quindi ho installato, per il momento la trial version, di &lt;a href="http://www.jetbrains.com/idea/"&gt;Intellij Idea&lt;/a&gt;, (altro IDE per Java) che sembra avere un integrazione con grails molto molto migliore.&lt;br /&gt;&lt;br /&gt;Installato intellij Idea, ho installato i plug in per grails e groovy (che si trovano praticamente comunque già elencati in IDEA)  e di fatto ho tutto pronto per lavorare.&lt;br /&gt;Da IDEA posso creare il progetto grails direttamente dall'IDE, senza quindi usare la riga di comando come ho fatto sino ad ora.&lt;br /&gt;&lt;br /&gt;Abbiamo poi creato un repository di subversion... e qui magari creerò un post apposito per questo fantastico tools.&lt;br /&gt;&lt;br /&gt;Ho ripreso poi, reiniziandolo da capo, il tutorial del libro &lt;a href="http://lamiatesi-fdl.blogspot.com/2008/04/getting-started-with-grails.html"&gt;Getting Started With Grails&lt;/a&gt;, ovviamente apportando le modifiche dovute al cambiamento di versione con grails, che mano a mano segnalo nel post apposito.&lt;br /&gt;&lt;br /&gt;Ho usato, invece di MYSQL, sempre il database in Java che ha nativamente grails con se, con la differenza che invece di usare la memoria ram, uso file su disco... questo lo si ottiene semplicemente cambiando l'url di memorizzazione nel file DataSource.groovy da&lt;br /&gt;&lt;span style="font-style: italic;"&gt;url = "jdbc:hsqldb:mem:devDB"&lt;/span&gt;&lt;br /&gt;a&lt;br /&gt;&lt;span style="font-style: italic;"&gt;url = "jdbc:hsqldb:file:devDB"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Una delle cose che attualmente pare non sia possibile fare direttamente da IDE e il comando grails generate-all per ripetere la compilazione dei controllers e per effettuare nuovamente lo scaffolding... questo attualmente lo sto eseguendo ancora da riga di comando&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6096000264929709046?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6096000264929709046/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6096000264929709046' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6096000264929709046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6096000264929709046'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/05/si-passa-ad-intellij-idea.html' title='Si passa ad Intellij Idea'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2474139320711066647</id><published>2008-04-30T17:35:00.005+02:00</published><updated>2008-05-07T16:19:16.582+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Lo scaffolding non funziona</title><content type='html'>Grails sembra fare praticamente tutto, se si rispettano le varie convenzioni, in pratica si riescono a generare un sacco di file preimpostati... lo scaffolding dovrebbe, per esempio, generare delle pagine web per inserire/aggiornare le classi del dominio.&lt;br /&gt;Come suggerisce Getting Started with Grails, ho isntallato mysql e la libreria per agganciarlo a java, e ho specificato nelal configurazione dell'applicazione racetrack di non usare il database "in memoria" ma mysql.&lt;br /&gt;Qui arrivano i primi problemi... il libro è stato scritto per la versione di grails 0.3.9 mentre ora siamo alla 1.X&lt;br /&gt;Quindi ho dovuto "aggiornare" il codice, il libro infatti dice di modificare il file DevelopmentDataSource in questo modo&lt;br /&gt;&lt;code&gt;class DevelopmentDataSource {&lt;br /&gt;boolean pooling = true&lt;br /&gt;String dbCreate = "update"&lt;br /&gt;String url = "jdbc:mysql://localhost/racetrack_dev"&lt;br /&gt;String driverClassName = "com.mysql.jdbc.Driver"&lt;br /&gt;  String username = "jason"&lt;br /&gt;  String password = ""&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;ma questo file non esiste... però all'interno della directory conf vi è il file DataSource.groovy che sembrerebbe integrare i vari ambienti, cioè sviluppo, produzione, test&lt;br /&gt;ho modificato questo file così (seguendo un po' la logica e un po' quello che c'è scritto sul sito di groovy nella sezione getting started)&lt;br /&gt;&lt;code&gt;environments {&lt;br /&gt;development {&lt;br /&gt;  dataSource {&lt;br /&gt;    dbCreate = "create-drop" // one of 'create', 'create-drop','update'&lt;br /&gt;    //url = "jdbc:hsqldb:mem:devDB"&lt;br /&gt;    //aggiunto qui sotto da gabriele, e quella sopra commentata&lt;br /&gt;    String url = "jdbc:mysql://localhost/racetrack_dev"&lt;br /&gt;    String driverClassName = "com.mysql.jdbc.Driver"&lt;br /&gt;    String username = "gabry"&lt;br /&gt;    String password = ""&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;test {&lt;br /&gt;  dataSource {&lt;br /&gt;    dbCreate = "update"&lt;br /&gt;    url = "jdbc:hsqldb:mem:testDb"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;production {&lt;br /&gt;  dataSource {&lt;br /&gt;    dbCreate = "update"&lt;br /&gt;    url = "jdbc:hsqldb:file:prodDb;shutdown=true"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Fatto questo però, i problemi non finiscono. Infatti, così come sono messe le cose, dopo aver creato i controller con la riga di comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;grails create-controllers&lt;/span&gt;&lt;br /&gt;sia per &lt;span style="font-style: italic;"&gt;Race &lt;/span&gt;che per &lt;span style="font-style: italic;"&gt;Registration &lt;/span&gt;(e sembra funzionare tutto), sostituendo dei due controller la riga&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def index = { }&lt;/span&gt;&lt;br /&gt;con la riga&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def scaffold = Race &lt;/span&gt;&lt;br /&gt;(o Registration per la classe RegistrationController), facendo partire&lt;br /&gt;grails run-app&lt;br /&gt;dovrebbe automaticamente crearmi le pagine per la gestione delle classi di dominio... ma puntato il browser su &lt;span style="font-style: italic;"&gt;http://localhost:8080/racetrack&lt;/span&gt; vedo sì i link ai due controller, ma invece di mostrarmi la paginetta con le classi... mi mostra un noioso errore che non capisco come risolvere (incollato in fondo al topic).&lt;br /&gt;Ho comunque chiesto aiuto nella community di Napple&lt;br /&gt;&lt;a href="http://www.nabble.com/Error-with-%22Getting-Started-with-Grails%22-sample%3A-scaffold-td16981748.html" framed_href="http://www.nabble.com/Error-with-%22Getting-Started-with-Grails%22-sample%3A-scaffold-to16981748.html" new_threaded_href="http://www.nabble.com/Error-with-%22Getting-Started-with-Grails%22-sample%3A-scaffold-tt16981748.html" new_chron_href="http://www.nabble.com/Error-with-%22Getting-Started-with-Grails%22-sample%3A-scaffold-tc16981748.html" classic_href="http://www.nabble.com/Error-with-%22Getting-Started-with-Grails%22-sample%3A-scaffold-ts16981748.html"&gt;&lt;span&gt;Error with "Getting Started with Grails" sample: scaffold&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aggiornamento di martedì 2 Maggio&lt;/span&gt;&lt;br /&gt;Ho scoperto che non sono l'unico ad avere questo problema, sempre nella mailing list di Nabble, ho trovato questo&lt;br /&gt;&lt;span&gt;&lt;a href="http://www.nabble.com/Grails-Scaffold-Issues-tp15312790p15312790.html" embed="fixTarget[11861]" target="_top"&gt;&lt;span class="search-result-line1"&gt;Grails Scaffold Issues&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inoltre ho trovato una pagina del sito dell'autore di "Getting Started With Grails", Jason Rudolph, in cui sono state messe alcuni aggiornamenti al codice del libro, dovuti ai cambiamenti che mano a mano sono stati introdotti dalle varie versioni di Grails&lt;br /&gt;&lt;a href="http://jasonrudolph.com/gswg_faq.html"&gt;http://jasonrudolph.com/gswg_faq.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Grails Runtime Exception&lt;br /&gt;Error Details&lt;br /&gt;Message:&lt;br /&gt;Caused by:&lt;br /&gt;Class: Unknown&lt;br /&gt;At Line: [-1]&lt;br /&gt;Code Snippet:&lt;br /&gt;Stack Trace&lt;br /&gt;&lt;br /&gt;java.lang.NullPointerException&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.scaffolding.TemplateGeneratingResponseHandler.handleResponse(TemplateGeneratingResponseHandler.java:104)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.scaffolding.DefaultGrailsScaffolder$ListAction.call(DefaultGrailsScaffolder.java:113)&lt;br /&gt;&lt;br /&gt;      at groovy.lang.Closure.call(Closure.java:287)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleAction(SimpleGrailsControllerHelper.java:503)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.executeAction(SimpleGrailsControllerHelper.java:394)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(SimpleGrailsControllerHelper.java:233)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(SimpleGrailsControllerHelper.java:154)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest(SimpleGrailsController.java:88)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:251)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)&lt;br /&gt;&lt;br /&gt;      at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)&lt;br /&gt;&lt;br /&gt;      at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:367)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:198)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:185)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:117)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.parsePage(GrailsPageFilter.java:119)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:82)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:142)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)&lt;br /&gt;&lt;br /&gt;      at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:68)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:183)&lt;br /&gt;&lt;br /&gt;      at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:138)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.Server.handle(Server.java:295)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:503)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:827)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:511)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:210)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:379)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:361)&lt;br /&gt;&lt;br /&gt;      at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2474139320711066647?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2474139320711066647/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2474139320711066647' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2474139320711066647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2474139320711066647'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/lo-scaffolding-non-funziona.html' title='Lo scaffolding non funziona'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1428675087402703741</id><published>2008-04-29T15:54:00.011+02:00</published><updated>2008-05-07T14:31:33.867+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Getting Started with Grails</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.infoq.com/resource/minibooks/grails/en/cover/onelinefront.jpg;jsessionid=9EA08C2F08597551DC6C9D4213A4FDFD"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.infoq.com/resource/minibooks/grails/en/cover/onelinefront.jpg;jsessionid=9EA08C2F08597551DC6C9D4213A4FDFD" alt="" border="0" /&gt;&lt;/a&gt;Dopo essermi ben ben infarinato con &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, è ora di passare a &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;, e quindi, dopo aver proceduto all'installazione e alla configurazione del framework, parto con lo "studiare" qualche libro si questo framework. Speriamo che alla fine di queste letture mi convinca (anzi, ci convinciamo) che sia proprio il prodotto che fa per noi.&lt;br /&gt;&lt;br /&gt;Parto con la lettura di un libro trovato online, scaricabile anche gratuitamente sul sito dedicato al minibook: &lt;a href="http://www.infoq.com/minibooks/grails"&gt;http://www.infoq.com/minibooks/grails&lt;/a&gt; oppure acquistabile online sul famoso servizio di POD (Printing On Demand): lulu.com (&lt;a href="http://www.lulu.com/content/618462"&gt;http://www.lulu.com/content/618462&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Come sempre, userò questo post per prendere appunti, ove necessario, su questo libro.&lt;br /&gt;&lt;br /&gt;Sebbene Grails abbia un database embedded, validissimo per i primi esempi "al volo", il libro consiglia, per un qualcosa di più duraturo, un database come mysql, sebbene grails sia compatibile con molti altri, tra cui, per esempio, oracle.&lt;br /&gt;Procedo quindi all'installazione di &lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html#win32"&gt;MySql 5.0&lt;/a&gt; (per rendermi le cose semplici scarico l'autoinstallante, scegliendo l'installazione completa, lasciando le opzioni standard, compreso l'installare il servzio di windows per il server mysql, sulla porta 3306).&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All'interno della definizione del dominio (cioè, in pratica, la definizione delle classi che definiscono di fatto il progetto) del progetto di esempio Racetrack, si definisce la classe Race. All'interno della stessa, nell'elenco dei fields, si ha questa&lt;br /&gt;&lt;code&gt;static hasMany = [registrations:Registration]&lt;/code&gt;&lt;br /&gt;che permette di specificare la relazione uno a molti che intercorre tra &lt;span style="font-style: italic;"&gt;Race &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;Registration&lt;/span&gt;. Quella riga di codice, infatti, dice a Grails che la classe &lt;span style="font-style: italic;"&gt;Race &lt;/span&gt;avrà la proprietà &lt;span style="font-style: italic;"&gt;registrations &lt;/span&gt;che memorizzerà una collezione di oggetti &lt;span style="font-style: italic;"&gt;Registration. &lt;/span&gt;Non serve poi specificare di nuovo l'esistenza del field registrations, perchè è implicita nella riga sopracitata (Grails segue la logica del &lt;a href="http://en.wikipedia.org/wiki/DRY"&gt;DRY &lt;/a&gt;- Don't Repeat Yourself).&lt;br /&gt;La definizione delle relazioni ha diverse configurazioni, specificate dal GORM (&lt;span style="font-style: italic;"&gt;Grails Object Relational Mapping&lt;/span&gt;), tutte reperibili qui: &lt;a href="http://grails.org/GORM+-+Defining+relationships"&gt;http://grails.org/GORM+-+Defining+relationships&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Grails considera tutti le propietà (fields) di una classe come obbligatori, cioè per ogni classe devono essere espressi. Se si vuole specificare che uno dei campi non è obbligatorio, va aggiunta nelle constrains l'opzione &lt;span style="font-style: italic;"&gt;nullable=true&lt;/span&gt; per ogni campo che si vuole specificare come facoltativo&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Sempre seguendo l'esempio di prima, se nella relazione tra due classi, come definita prima, una a molti tra &lt;span style="font-style: italic;"&gt;Race &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;Registration &lt;/span&gt;(cioè una corsa a zero o più registrazioni ad essa associata) possiamo aggiungere il concetto che una &lt;span style="font-style: italic;"&gt;Registration &lt;/span&gt;non esiste se non correlata ad una &lt;span style="font-style: italic;"&gt;Race&lt;/span&gt;. Quindi nella classe Registration aggiungiamo questa riga di codice&lt;br /&gt;&lt;code&gt;static belongsTo = Race&lt;/code&gt;&lt;br /&gt;Cioè creiamo la proprietà &lt;span style="font-style: italic;"&gt;belongsTo &lt;/span&gt;che specifica appunto che l'istanza della classe &lt;span style="font-style: italic;"&gt;Registration &lt;/span&gt;esiste solo se associata ad un'istanza della classe &lt;span style="font-style: italic;"&gt;Race&lt;/span&gt;, e se cancelliamo la &lt;span style="font-style: italic;"&gt;Race&lt;/span&gt;, si cancellano tutte le &lt;span style="font-style: italic;"&gt;Registration &lt;/span&gt;ad essa associate.&lt;/li&gt;&lt;li&gt;Secondo la logica del &lt;a href="http://en.wikipedia.org/wiki/Convention_over_Configuration"&gt;&lt;span style="font-style: italic;"&gt;Convention Over Configuration&lt;/span&gt;&lt;/a&gt;, non serve specificare che le due classi specificate prima sono classi da "memorizzare", perché per convenzione le classi del dominio, come quelle di cui sopra, realizzate nella directory Domain, hanno bisogno della persistenza, e Grails quindi la gestirà in maniera automatica (di default, tramite &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Il concetto del flash message è stato introdotto per permettere il "passaggio di parametri" tra le pagine. Infatti, per memorizzare messaggi di errore/avviso, e per passarseli tra le pagine, non possiamo usare variabili normali di una classe, perchè scomparirebbero all'aggiornamento della pagina (a meno di memorizzarle fisicamente da qualche parte). Usando invece questa variabile automaticamente creata da grails, possiamo passare tra le pagine questi messaggi: &lt;span style="font-style: italic;"&gt;flash.message = "bla bla"&lt;/span&gt;.&lt;br /&gt;Ciò che viene memorizzato nella variabile flash è disponibile durante la richiesta nella quale viene memorizzata e la successiva, quindi anche, per esempio, dopo un redirect della pagina.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cambiamenti da fare al codice del tutorial dovuti ad errori di stampa del libro o necessari per le nuove vesioni di Grails (il libro è stato scritto per grails antecedente lo 0.4 e io attualmente sto usando grails 1.0.x)&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Pagina 13 (25 sul pdf)&lt;br /&gt;La proprietà optional non esiste più da grails 1.0, ora, per dichiarare opzionale un campo, va aggiunta la propietà nullable=true nelle constraints per quel dato campo.&lt;br /&gt;Quindi la riga&lt;br /&gt;&lt;code&gt;static optionals = ["postalAddress", "gender"]&lt;/code&gt;&lt;br /&gt;non va scritta, e si aggiunge invece una constraints nella classe&lt;br /&gt;&lt;code&gt;static constraints = {&lt;br /&gt;postalAddress(nullable:true)&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;ricordandosi ovviamente di mantenere questa constraints anche successivamente&lt;/li&gt;&lt;li&gt;Pagina 21 (33 sul pdf)&lt;br /&gt;Il file &lt;span style="font-style: italic;"&gt;DevelopmentDataSource &lt;/span&gt;non esiste più&lt;br /&gt;Le configurazioni vanno tutte fatte nel file &lt;span style="font-style: italic;"&gt;DataSource.groovy&lt;/span&gt;&lt;br /&gt;Oltretutto io ho deciso di non usare, almeno per ora, mysql, ma di usare HSQLDB, già integrato con grails... l'unica modifica che faccio al file è quella di non memorizzare in memoria principale il file, ma di memorizzarlo a disco.&lt;br /&gt;Quindi le configurazioni per il development che si vogliono introdurre vanno comunque fatte nel file &lt;span style="font-style: italic;"&gt;DataSource.groovy &lt;/span&gt;all'interno di queste righe di codice&lt;br /&gt;[...]&lt;br /&gt;environments {&lt;br /&gt;development {&lt;br /&gt;   dataSource {&lt;br /&gt;       //dbCreate = "create-drop" // one of 'create', 'create-drop','update'&lt;br /&gt;       dbCreate = "update"&lt;br /&gt;       url = "jdbc:hsqldb:file:devDB"&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;[...]&lt;/li&gt;&lt;li&gt;Pagina 25 (37 sul pdf), pagina 27 (39 sul pdf)&lt;br /&gt;La proprietà maxLength non esiste più, va sostituita da maxSize, così, per esempio la riga&lt;br /&gt;&lt;span style="font-style: italic;"&gt;city(maxLength:30,blank:false)&lt;/span&gt;&lt;br /&gt;diventa&lt;br /&gt;&lt;span style="font-style: italic;"&gt;city(maxSize:30,blank:false)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Pagina 35 (47 sul pdf)&lt;br /&gt;Il codice della pagina gjp è proposta è diverso, in realtà qui non c'è nulla da modificare poichè la pagina gsp è stata creata automaticamente dal framework, quindi già aggiornata al codice necessario per il funzionamento.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Pagina 36 (48 sul pdf)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Il codice del controller a cui si fa riferimento è diverso, in realtà qui non c'è nulla da modificare poichè il controller è stata creato automaticamente dal framework, quindi già aggiornata al codice necessario per il funzionamento, con il comando "generate-all".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Pagina 40 (52 sul pdf)&lt;br /&gt;Il messaggio a cui si fa riferimento, &lt;span style="font-style: italic;"&gt;default.invalid.max.length.message&lt;/span&gt;, in realtà è &lt;span style="font-style: italic;"&gt;default.invalid.max.size.message&lt;/span&gt;, dato che, come spiegato prima, il &lt;/span&gt;&lt;span style="font-style: italic;"&gt;maxLength&lt;/span&gt; &lt;span&gt;e &lt;/span&gt;&lt;span style="font-style: italic;"&gt;minLength&lt;/span&gt; sono sostituiti da &lt;span style="font-style: italic;"&gt;maxSize &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;minSize&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Pagina 41 (53 sul pdf)&lt;br /&gt;Non serve più riavviare il server ad ogni cambiamento, grails si accorge da solo e basta salvare le modifiche, e se si ritorna sulla pagina web, riaggiornandola, le si ritrovano subito.&lt;/li&gt;&lt;li&gt;Pagina 41 (53 sul pdf)&lt;br /&gt;In realtà non servirebbe aggiungere questo segnale di avvertimento, perchè le nuove versioni di grails lo aggiungono in maniera automatica, sempre tramite un javascript &lt;span style="font-style: italic;"&gt;onclick&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Pagine 43-45 (55-57 sul pdf)&lt;br /&gt;In realtà anche qui pare non sia necessario aggiungere il flash.massage ad ogni azione, perchè già create in automatico dalla nuove versioni di Grails&lt;/li&gt;&lt;li&gt;Pagina 46 (58 sul pdf)&lt;br /&gt;Come indicato prima la pagina gsp è diversa, ma il codice da rimuovere è facilmente identificabile. Però, oltre rimuovere la colonna id effettivamente inutile, va conservato il link per leggere i dettagli della race. Questo link è proprio conservato nell'id, quindi cancelliamo pure la riga dell'id, ma modifichiamo anche quella del nome in modo da conservare questo link&lt;br /&gt;Cancelliamo quindi:&lt;br /&gt;&lt;g:link action="show" id="${race.id}"&gt;${race.id?.encodeAsHTML()}&lt;/g:link&gt;&lt;br /&gt;E modifichiamo la riga sotto da&lt;br /&gt;${race.name?.encodeAsHTML()}&lt;br /&gt;a&lt;br /&gt;&lt;g:link action="show" id="${race.id}"&gt;${race.name?.encodeAsHTML()}&lt;/g:link&gt;&lt;/li&gt;&lt;li&gt;pagina 102 -103 (114-115 sul pdf)&lt;br /&gt;Il file di configurazione di log4j,  &lt;span style="font-style: italic;"&gt;log4j.production.properties&lt;/span&gt;, non si trova più in &lt;span style="font-style: italic;"&gt;racetrack/web-app/WEB-INF&lt;/span&gt;. Tutte le configurazioni di log4j vanno inserite nel file &lt;span style="font-style: italic;"&gt;Config.groovy&lt;/span&gt; che si trova in &lt;span style="font-style: italic;"&gt;/grails-app/conf&lt;/span&gt;. Inoltre le modifiche da apportare sono diverse da quelle indicate nel libro.&lt;br /&gt;La parte dedicata a log4j del mio file Config.groovy è così diventata:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;log4j {&lt;br /&gt;   appender.stdout = "org.apache.log4j.ConsoleAppender"&lt;br /&gt;   appender.'stdout.layout'="org.apache.log4j.PatternLayout"&lt;br /&gt;   appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'&lt;br /&gt;   appender.errors = "org.apache.log4j.FileAppender"&lt;br /&gt;   appender.'errors.layout'="org.apache.log4j.PatternLayout"&lt;br /&gt;   appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n'&lt;br /&gt;   appender.'errors.File'="stacktrace.log"&lt;br /&gt;   rootLogger="error,stdout"&lt;br /&gt;&lt;br /&gt;   appender.access="org.apache.log4j.FileAppender"&lt;br /&gt;   appender.'access.file'="access.log"&lt;br /&gt;   appender.'access.layout'="org.apache.log4j.PatternLayout"&lt;br /&gt;   appender.'access.layout.ConversionPattern'='%d %p %x [%c] %m%n'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   logger {&lt;br /&gt;       //grails="error"&lt;br /&gt;       StackTrace="error,errors"&lt;br /&gt;       grails.'app.controller.UserController'="warn,access"&lt;br /&gt;       org {&lt;br /&gt;           codehaus.groovy.grails.web.servlet="error"  //  controllers&lt;br /&gt;           codehaus.groovy.grails.web.pages="error" //  GSP&lt;br /&gt;           codehaus.groovy.grails.web.sitemesh="error" //  layouts&lt;br /&gt;           codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping&lt;br /&gt;           codehaus.groovy.grails."web.mapping"="error" // URL mapping&lt;br /&gt;           codehaus.groovy.grails.commons="info" // core / classloading&lt;br /&gt;           codehaus.groovy.grails.plugins="error" // plugins&lt;br /&gt;           codehaus.groovy.grails.orm.hibernate="error" // hibernate integration&lt;br /&gt;           springframework="off"&lt;br /&gt;           hibernate="off"&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   additivity.StackTrace=false&lt;br /&gt;   additivity.grails.app.controller.UserController=false&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1428675087402703741?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1428675087402703741/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1428675087402703741' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1428675087402703741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1428675087402703741'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/getting-started-with-grails.html' title='Getting Started with Grails'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-8979495592905977878</id><published>2008-04-21T09:13:00.012+02:00</published><updated>2008-12-11T21:06:27.481+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy Programming: An Introduction for Java Developers</title><content type='html'>&lt;div align="center"&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0123725070&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" align="middle" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Mi sono procurato questo libro, che viene pubblicizzato anche sul &lt;a href="http://groovy.codehaus.org/"&gt;sito ufficiale&lt;/a&gt; di groovy. In questo post metterò via via i principali concetti, da tenersi bene a mente, che troverò nel libro. I codici presenti nel libro possono essere recuperati nella &lt;a href="http://www.dcs.napier.ac.uk/%7Ekab/groovy/download/download.html"&gt;pagina web&lt;/a&gt; predisposta dall'autore.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Groovy è un linguaggio di scripting, nativamente compatibile con Java e le sue API (dato che sfruttano la stessa JVM, Java Virtual Machine). Può essere usato come collante per applicazioni create con Java, oppure il codice può essere "mischiato" con codice Java senza grossi problemi.&lt;/li&gt;&lt;li&gt;Linguaggi di scripting sono in particolare adeguati per le situazioni in cui bisogna integrare applicazioni già esistenti, manipolare una vasta varietà di entità dinamiche, applicazioni con interfaccia grafica, sono particolarmente adeguati per applicazioni medio-piccole.&lt;/li&gt;&lt;li&gt;I linguaggi come Java sono fortemente tipizzati, per garantire al sicurezza del codice e epr rende agevola la manutenzione di grosse applicazioni. Però così si rende il linguaggio poco adeguato per l'integrazione di componenti differenti, perchè spesso non si sa a priori il tipo di dati da associare ad una variabile, in questo vengono in soccorso i linguaggi di scrripting che spesso sono debolmente tipizzati, appunto come groovy. L'altro lato della medaglia è che con un linguaggio poco tipizzato codice che non solleva errori in compile time potrebbe sollevare eccezzioni, per problemi di tipo, a run time. Questo rende obbligatorio una intensa attività di test per questo tipo di applicazioni.&lt;/li&gt;&lt;li&gt;Tutto in groovy è un oggetto, quindi ogni variabili è un istanza di una certa classe.&lt;/li&gt;&lt;li&gt;Seguono la regola di cui sopra anche i numeri, quindi per esempio, per un dato integer, per esempio il valore 123, possiamo chiamare, per sapere il successivo, il metodo "next" delal classe integer: &lt;span style="font-style: italic;"&gt;123.next()&lt;/span&gt; ottenendo quindi 124. Oppure per sommare due numeri possiamo chiamare il metodo +, passando come parametro il secondo numero, quindi per esempio &lt;span style="font-style: italic;"&gt;123.+(56)&lt;/span&gt; oppure il metodo plus, &lt;span style="font-style: italic;"&gt;123.plus(56)&lt;/span&gt;; fortunatamente groovy prevede l'overloading degli operatori, e quindi possiamo efefttuare la somma nella classica forma &lt;span style="font-style: italic;"&gt;123 + 56&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hsdxMBCxxj0/SAxL0DDTU6I/AAAAAAAABVc/2LvDnpEzN7Y/s1600-h/groovy_numeri.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_hsdxMBCxxj0/SAxL0DDTU6I/AAAAAAAABVc/2LvDnpEzN7Y/s400/groovy_numeri.png" alt="" id="BLOGGER_PHOTO_ID_5191607827995775906" border="0" /&gt;&lt;/a&gt;Da notare come la divisione di due integer risulti SEMPRE in un floating point.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hsdxMBCxxj0/SAxMlzDTU7I/AAAAAAAABVk/CyHumTdj7LE/s1600-h/groovy_numeri_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_hsdxMBCxxj0/SAxMlzDTU7I/AAAAAAAABVk/CyHumTdj7LE/s400/groovy_numeri_2.png" alt="" id="BLOGGER_PHOTO_ID_5191608682694267826" border="0" /&gt;&lt;/a&gt;Da sottolineare come l'operazione modulo (&lt;span style="font-style: italic;"&gt;mod &lt;/span&gt;oppure &lt;span style="font-style: italic;"&gt;%&lt;/span&gt;) può essere chiamata solo su due integer&lt;/li&gt;&lt;li&gt;Sebbene non si debba definire il tipo di una variabile, al variabile stessa deve essere definita tramite la keyword &lt;span style="font-style: italic;"&gt;def&lt;/span&gt;, in rpatica la prima volta che si usa una variabile bisogna dichiararla così&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def age&lt;/span&gt;&lt;br /&gt;oppure facendo subito un assegnamento&lt;br /&gt;&lt;span style="font-style: italic;"&gt;def age = 25&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Le stringe si possono specificare con apice singoli ('), apici doppi (") o addirittura triplici apici - cioè tre volte apici doppi - ("""); con apici tripli si possono specificare stringe multiriga. Con gli apici singoli di specificano stringhe letterali, con le altre due interpretate, cioè ogni espressione in questa forma &lt;span style="font-style: italic;"&gt;${expression}&lt;/span&gt; viene interpretata e viene scritto il risultato, cioè&lt;br /&gt;&lt;code&gt;def age = 25&lt;br /&gt;’My age is ${age}’ // My age is ${age}&lt;br /&gt;“My age is ${age}” // My age is 25&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;La comparazione tra stringhe è fatta in maniera molto simile ai classi metodi dei linguaggi di scripting, capitolo 3.5 e 3.6 del libro.&lt;/li&gt;&lt;li&gt;Evidentemente groovy (o java) è un po' cambiato da quando è stato fatto il libro. Nella parte dedicata all'I/O infatti, in uno degli esempi si da questo codice&lt;br /&gt;&lt;span style="font-style: italic;"&gt;name = System.in.readLine()&lt;/span&gt;&lt;br /&gt;ma risulta deprecato, quindi va sostituito con&lt;br /&gt;&lt;span style="font-style: italic;"&gt;name = new BufferedReader( new InputStreamReader(System.in) ).readLine()&lt;/span&gt;&lt;/li&gt;&lt;li&gt;I metodi sono definiti come le variabili con al parola riservata &lt;span style="font-style: italic;"&gt;def&lt;/span&gt;, esempio&lt;br /&gt;&lt;code&gt;def printName(name) {&lt;br /&gt;println “Name (at entry): ${name}”&lt;br /&gt;name = ‘John’&lt;br /&gt;println “Name (after assignment): ${name}”&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;seguono poi le regole classiche delle funzioni in java&lt;/li&gt;&lt;li&gt;interessante poi l'uso delle parentesi graffe come "funzione"... in pratica possiamo chiamare un pezzo di codice con un determinato nome e poi eseguirlo un po' come se fosse una funzione, qui sotto un esempio con verifica dello scope dei parametri&lt;br /&gt;&lt;br /&gt;def greeting = ‘Hello’&lt;br /&gt;def clos = {param -&gt; println “${greeting} ${param}”}&lt;br /&gt;clos.call(‘world’)&lt;br /&gt;// Now show that changes to this variable change the closure.&lt;br /&gt;greeting = ‘Welcome’&lt;br /&gt;clos.call(‘world’)&lt;br /&gt;def demo(clo) {&lt;br /&gt; def greeting = ‘Bonjour’ // does not affect closure&lt;br /&gt; clo.call(‘Ken’)&lt;br /&gt;}&lt;br /&gt;demo(clos)&lt;br /&gt;&lt;br /&gt;e l'outupt è:&lt;br /&gt;&lt;br /&gt;Hello world&lt;br /&gt;Welcome world&lt;br /&gt;Welcome Ken&lt;/li&gt;&lt;li&gt;La gestione delle classi è praticamente identica a Java, quindi anche in Groovy ogni classe, per ogni fields, ha il setter preimpostato. Cioè, data una classe  con un campo chiamato, per esempio &lt;span style="font-style: italic;"&gt;balance&lt;/span&gt;, di cui creiamo un istanza chiamata, per esempio, &lt;span style="font-style: italic;"&gt;acccount1&lt;/span&gt;, possiamo settare il fields sia con &lt;span style="font-style: italic;"&gt;account1.balance=300&lt;/span&gt; sia con &lt;span style="font-style: italic;"&gt;account.setBalance(300)&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Molte delle cose qui non scritte sono identiche o pressoché identiche a Java.&lt;/li&gt;&lt;li&gt;Il corrispettivo delle JSP per java, in Groovy viene indicato come GSP e il corrispettivo delle servlet viene soprannominato Groovlet, e il funzionamento ne è stato semplificato.&lt;br /&gt;Per ora non approfondisco le Groovlet, preferisco rimandare il tutto a quando mi metto a studiare Grails. Per quanto riguarda le GSP invece va sottolineato che sono un poco meno potenti delle JSP in quanto si riducono ad essere assimilate ad un template Framework. In partica si condisce una pagina html semplice con del codice groovy ( &lt;span style="font-style: italic;"&gt;&lt;% - %&gt;&lt;/span&gt; ) per aggiungere contenuto dinamico, definito altrove (secondo la logica del MVC)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-8979495592905977878?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/8979495592905977878/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=8979495592905977878' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8979495592905977878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8979495592905977878'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/groovy-programming-introduction-for.html' title='Groovy Programming: An Introduction for Java Developers'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hsdxMBCxxj0/SAxL0DDTU6I/AAAAAAAABVc/2LvDnpEzN7Y/s72-c/groovy_numeri.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-5743868138024369266</id><published>2008-04-16T17:11:00.004+02:00</published><updated>2008-04-23T10:55:23.771+02:00</updated><title type='text'>Grails, Groovy On Rails</title><content type='html'>Non faccio a tempo a finire di studiare un framework, che già se ne trova un altro da analizzare... piuttosto impressionate come cosa.&lt;br /&gt;&lt;br /&gt;Non riesco nemmeno a finire di comprendere, come si deve, enunciare che subito salta fuori Grails... un framework completo per lo sviluppo di RIC con il linguaggio Groovy, una sorta di semplificazione di Java (e totalmente compatibile con Java stesso).&lt;br /&gt;&lt;br /&gt;Ho trovato il plug in per integrare groovy e eclipse&lt;br /&gt;&lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;http://groovy.codehaus.org/Eclipse+Plugin&lt;/a&gt;&lt;br /&gt;e sembra funzionare.&lt;br /&gt;Così come l'integrazione con Eclipse del framework&lt;br /&gt;&lt;a href="http://grails.org/Eclipse+IDE+Integration"&gt;http://grails.org/Eclipse+IDE+Integration&lt;/a&gt;&lt;br /&gt;PS: ho attivato l'opzione "Disable Groovy Compiler Generating Class Files" per rendere automatiche alcune funzioni del plugin... da ricordare però che così non funziona il debugging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-5743868138024369266?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/5743868138024369266/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=5743868138024369266' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5743868138024369266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5743868138024369266'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/grails-groovy-on-rails.html' title='Grails, Groovy On Rails'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-982595375971260854</id><published>2008-04-10T14:13:00.007+02:00</published><updated>2008-04-29T16:13:46.521+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Enunciate'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>Enunciate, Maven, GWT, forse Spring, qualcos'altro?</title><content type='html'>Mi sto studiando un po' &lt;a href="http://enunciate.codehaus.org/"&gt;Enunciate&lt;/a&gt;, alla fine sembrerebbe interessante e potrebbe servirci per velocizzare lo sviluppo dei Web Services, evitando di scrivere tanto codice piuttosto ridondante.&lt;br /&gt;&lt;br /&gt;Facendo il primo tutorial, anzi, il secondo, mi sono trovato di fronte ad un po' di difficoltà... si integra maven, con GWT, con enunciate, e volendo pure con spring... quindi insomma, un po' difficile per me che non conosco bene praticamente nessuna di queste tecnologie.&lt;br /&gt;&lt;br /&gt;Comunque, spulciando un po' nei readme di enunciate (nella release ci sono anche 3 esempi) e un po' spulciando in rete, ho trovato come fare.&lt;br /&gt;&lt;br /&gt;Dalla directory principale del sample, dal prompt dei comandi, si lancia maven&lt;br /&gt;&lt;blockquote&gt;mvn -Dgwt.home=/path/to/gwt/home package&lt;/blockquote&gt;ovviamente inserendo il path dell'installazione di gwt&lt;br /&gt;Questo comanda chiede a maven di compilare il progetto... nel progetto infatti c'è già un file pom.xml bello pronto.&lt;br /&gt;&lt;br /&gt;Altrimenti si può chiedere a maven di compilate, far partire il server jetty e pubblicare il tutto, così da renderlo accessibile in locale, con questo comando&lt;br /&gt;&lt;blockquote&gt;mvn -Dgwt.home=/path/to/gwt/home jetty:run-war&lt;/blockquote&gt;e puntando il browser su http://localhost:8080/petclinic/petclinic.html (petclinic è il secondo il progetto che i tutorial di enunciate prendono in considerazione) si vede il tutto all'opera&lt;br /&gt;&lt;br /&gt;Se in più si vuole creare i file per importare il tutto in eclipse, si usa il plugin eclipse di maven, digitando sempre dalla directory root del progetto&lt;br /&gt;&lt;blockquote&gt;mvn eclipse:eclipse&lt;/blockquote&gt;In alcuni casi, non ho capito bene l'agoritmo però, bisogna controllare la path in eclipse... verificando che tutte le librerie siano importate in maniera corretta&lt;br /&gt;&lt;br /&gt;Si può inoltre evitare di scrivere, via riga di comando, il parametro -Dgwt.home (quindi per esempio richiamando il comando con "mvn jetty:run-war") inserendo nel file di configurazione enunciate.xml questo parametro&lt;br /&gt;&lt;blockquote&gt;gwtHome="c:\Programmi\GWT\gwt-windows-1.4.62"&lt;/blockquote&gt;rispettando ovviamente la path della propria installazione di gwt, all'interno della dichiarazione del modulo gwt. Per esempio, nel mio petclinic, il file enunciate.xml, è così composto&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;enunciate&amp;gt;&lt;br /&gt;  &amp;lt;modules&amp;gt;&lt;br /&gt;    &amp;lt;gwt disabled="false"&lt;br /&gt;gwtHome="c:\Programmi\GWT\gwt-windows-1.4.62"&lt;br /&gt;       &lt;br /&gt;rpcModuleName="org.codehaus.enunciate.samples.petclinic.PetClinic"&amp;gt;&lt;br /&gt;      &amp;lt;app&lt;br /&gt;srcdir="src/main/gwt-apps" javascriptstyle="PRETTY"&amp;gt;&lt;br /&gt;      &lt;br /&gt;&amp;lt;module&lt;br /&gt;name="org.codehaus.enunciate.samples.petclinic.app.PetClinicApp"&amp;gt;&lt;br /&gt;      &amp;lt;/app&amp;gt;&lt;br /&gt;    &amp;lt;/gwt&amp;gt;&lt;br /&gt;    &amp;lt;amf disabled="true"&amp;gt;&lt;br /&gt;      &amp;lt;app&lt;br /&gt;srcdir="src/main/flex-apps" name="vets"&lt;br /&gt;mainmxmlfile="src/main/flex-apps/org/codehaus/enunciate/samples/petclinic/flex/vets.mxml"&amp;gt;&lt;br /&gt;    &amp;lt;/amf&amp;gt;&lt;br /&gt;  &amp;lt;/modules&amp;gt;&lt;br /&gt;&amp;lt;/enunciate&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-982595375971260854?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/982595375971260854/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=982595375971260854' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/982595375971260854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/982595375971260854'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/eninciate-maven-gwt-forse-spring.html' title='Enunciate, Maven, GWT, forse Spring, qualcos&apos;altro?'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4799423688216193618</id><published>2008-04-10T11:52:00.004+02:00</published><updated>2008-04-10T12:17:15.893+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google App Engine</title><content type='html'>Ieri, mentre finivo di rivedermi JSON e il supporto di GWT verso questo sistema di "scambio messaggi", mi arriva un alert da google desktop... "Google lancia una nuova iniziativa: Google App Engine"&lt;br /&gt;&lt;br /&gt;Si tratta di un iniziativa interessante, che in poche ore ha scosso un po' il mondo degli sviluppatori... basti pensare che il video rilasciato da google di presentazione di questa tecnologia, quando l'ho visionato per la prima volta io (penso davvero poco dopo che i due blog su google più visitati, &lt;a href="http://blogoscoped.com/archive/2008-04-08-n68.html"&gt;Google Blogoscoped&lt;/a&gt; e &lt;a href="http://googlesystem.blogspot.com/2008/04/google-app-engine-write-your-own-google.html"&gt;Google Operating System&lt;/a&gt;, aveva 427 Views... dopo meno di 20 minuti, ne aveva più di 30mila&lt;br /&gt;&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3Ztr-HhWX1c&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/3Ztr-HhWX1c&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;In pratica google mette a disposizione, inizialmente solo ai primi 10mila sviluppatori (speriamo io sia tra questi, intanto mi sono messo in lista) spazio web (inizialmente 500 MB), banda (non poca), cicli di CPU (non pochi) eccetera, per poter mettere online le proprie applicazioni e testarle, sia in privato, sia di diffonderle al pubblico. Il tutto reso davevro semplice dall'environment che hanno sviluppato. Infatti rilasciano anche un SDK per gli sviluppatori, con una buona documentazione, per rendere di fatto subito disponibili le proprie applicazioni online, con un sacco di strumenti di analisi. Il tutto sotto l'ottima tecnologia di google, con database e sistemi scalari (maggiore traffico ha la tua applicazione, maggiore risorse ti danno).&lt;br /&gt;Il tutto inizialmente solo per il linguaggio Python, ma in futuro (prossima pare) anche in altri linguaggi di programmazione.&lt;br /&gt;&lt;br /&gt;Nel frattempo è nata una discussione tra sviluppatori, proprio all'interno di youtube, nei commenti dei video, per chiedersi come mai google abbia lanciato questo sistema con il supporto al solo linguaggio phyton&lt;br /&gt;Nel video, i tecnini di google, dichiarano che è perchè buona parte dell'infrastruttura di google è proprio fatta in phyton e perchè gli inventori di questo linguaggio di programmazione, se non ho capito male, lavorano proprio, da qualche mese, in google.&lt;br /&gt;La domanda che molti si sono posti, comunque, è perchè non c'è sin dall'inizio Java tra i linguaggi supportati: dopotutto google ha recentemente lanciato, con discreto successo GWT e Android, entrambi applicazioni per lo sviluppo di RIC in Java... quindi?&lt;br /&gt;Alcuni sviluppatori rispondono che... Java non è il futuro, troppo pesante e "lungo" da programmare... e Phython è molto meglio.&lt;br /&gt;Bho, non ho le conoscenze sufficienti per giudicare... ma è strano che google prima lanci due importanti tecnologie per Java e poi la ignori... forse non si vuole legare troppo ad un linguaggio di programmazione?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Google App Engine:  &lt;a href="http://code.google.com/appengine/"&gt;http://code.google.com/appengine/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4799423688216193618?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4799423688216193618/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4799423688216193618' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4799423688216193618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4799423688216193618'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/google-web-engine.html' title='Google App Engine'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-5196014879679454597</id><published>2008-04-08T15:37:00.005+02:00</published><updated>2008-04-09T10:02:13.787+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enunciate'/><title type='text'>Enunciate</title><content type='html'>Non faccio nemmeno a tempo di finire di approfondire (se si può dire approfondire... diciamo rivedere) le GWT-RPC, che già mi trovo di fronte ad un nuovo framework da analizzare!!!&lt;br /&gt;&lt;br /&gt;E sì, giusto ora ho finito i capitoli sull'RPC di GWT in Action, ma stamane Francesco mi ha presentato questo framwork, ENUNCIATE (&lt;a href="http://enunciate.codehaus.org/index.html"&gt;http://enunciate.codehaus.org/index.html&lt;/a&gt;), framework per lo sviluppo di Web Service, che ne semplifica lo sviluppo, sfruttando le tecnologie esistenti per fornire uno stumento per il build, il package, la distribuzione ecc...&lt;br /&gt;&lt;br /&gt;Ora mi rivedo meglio l'utilizzo di GWT-JSON, poi mi studio questo frework, sia sul sito &lt;a href="http://enunciate.codehaus.org/getting_started.html"&gt;http://enunciate.codehaus.org/getting_started.html&lt;/a&gt; sia sul blog dell'autore di enunciate: &lt;a href="http://weblogs.java.net/blog/stoicflame/archive/2008/01/web_service_pro_1.html"&gt;http://weblogs.java.net/blog/stoicflame/archive/2008/01/web_service_pro_1.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-5196014879679454597?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/5196014879679454597/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=5196014879679454597' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5196014879679454597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5196014879679454597'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/enunciate.html' title='Enunciate'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2446067048317524629</id><published>2008-04-03T10:56:00.003+02:00</published><updated>2008-04-03T12:39:52.974+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RPC'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>GWT-RPC</title><content type='html'>Attualmente sono arrivato in una fase di stallo per lo studio di Maven: ho capito cosa è e grossomodo come funziona. Idem, grossomodo, per Spring: ho capito, grossomodo, cosa è e ho un infarinatura su come funziona.&lt;br /&gt;&lt;br /&gt;Ora però mi sono reso conto che è inutile, o comunque troppo complicato, per me studiarmi l'integrazione tra GWT e Spring, che in effetti sembra essere una buona strada, se non so bene come si comportano le RPC in GWT.&lt;br /&gt;&lt;br /&gt;Quindi ho deciso di ritornare sullo studio di GWT, in particolare sull'utilizzo delle sue RPC (GWT-RPC). Una volta studiate, se sarò in grado di utilizzarle in maniera decente, e potrò dire di conoscerle, forse potrò affrontare l'integrazione con Spring senza troppa difficoltà... e se voglio analizzare altri sistemi di dialogo Client-Server, per sapere che strada affrontare, è il caso che conosca bene le RPC per conoscerne vantaggi e svantaggi.&lt;br /&gt;&lt;br /&gt;Ho trovato qualche altro tutorial in rete:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://examples.roughian.com/#Tutorials%7ERPC_To_Java"&gt;RPC To Java Tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/834168c3d6ccc06d/f53f46491131728e"&gt;Java Version of GWT-RPC&lt;/a&gt;, una discussione sul gruppo gwt di google groups&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.brightpages.com/using-google-web-toolkit-rpc-with-asynccreator/"&gt;Using Google Web Toolkit RPC with AsyncCreator&lt;/a&gt;, descrizione di un tool per la generazione automatica di codice per le chiamate asincrone&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://examples.roughian.com/#Tutorials%7ERPC_To_Java"&gt;RPC To Java Tutorial&lt;/a&gt;&lt;br /&gt;Ho provato ad usare questo tutorial. Molto semplice, con poche informazioni e non spiegato benissimo, da però alcuni accorgimenti interessanti per gli "niubbi" di Java e gwt&lt;br /&gt;Ho voluto però implementarlo da zero. Non ho quindi usato il codice online, ma ho creato un progetto in Eclipse da zero e piano piano ho aggiunto il codice.&lt;br /&gt;Nuovo progetto web dinamico&lt;br /&gt;Ho poi aggiunto il modulo GWT (dal progetto, new -&gt; other -&gt; GWT Module)&lt;br /&gt;Ho aggiunto poi il modulo per le rpc (in pratica crea le classi async, imple eccetera, sia per client che per server)  (dal progetto, new -&gt; other -&gt; GWT Remote Service)&lt;br /&gt;Ho aggiunto il codice del tutorial (rinominando però RPCImpl in RPCInterfaceImpl perchè mi pareva più conforme agli standard... usare il nome stesso, aggiungendo prima async e poi impl)&lt;br /&gt;Ho rinominato anche il nome del modulo, ma nulla di che&lt;br /&gt;&lt;br /&gt;però ho poi dovuto consultare il codice che veniva fornito, perchè ho dovuto aggiungere questa riga al file "nomemodulo".gwt.xml perchè la configurazione di eclipse non la crea&lt;br /&gt;&lt;br /&gt;&lt;servlet path="/rpc" class="mie.prove.server.RPCInterfaceImpl"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2446067048317524629?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2446067048317524629/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2446067048317524629' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2446067048317524629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2446067048317524629'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/gwt-rpc.html' title='GWT-RPC'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7043979897673858538</id><published>2008-04-01T14:01:00.004+02:00</published><updated>2008-04-02T15:16:35.010+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>ancora su Maven</title><content type='html'>Ho provato a fare il tutorial trovato in questa pagina, che spiega il triodo Maven-Spring-GWT (si dice triodo? vabbhe avete capito)&lt;br /&gt;&lt;a href="http://shinetech.com/pages/viewpage.action?pageId=1396"&gt;http://shinetech.com/pages/viewpage.action?pageId=1396&lt;/a&gt;&lt;br /&gt;ma purtroppo non riesco a finirlo, in quanto una delle ultime parti mi da un errore strano&lt;br /&gt;Non so se sia un errore di utilizzo di Spring o GWT... più probabilmente non so usare Maven&lt;br /&gt;Ho creato una discussione nel gruppo di GWT-Maven&lt;br /&gt;&lt;a href="http://groups.google.com/group/gwt-maven/t/f29cc4c833d14ad9"&gt;http://groups.google.com/group/gwt-maven/t/f29cc4c833d14ad9&lt;/a&gt;&lt;br /&gt;Vediamo se otterrò rispsota&lt;br /&gt;(EDIT: 2 aprile&lt;br /&gt;ho ricevuto risposta, che ha risolto il problema... ma ora ottengo un altro build error... che scatole... vedremo se mi aiutano ancora)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nel frattempo mi leggo un'altra guida su Maven... primi passi, quelli che servono a me&lt;br /&gt;&lt;a href="http://www.javajournal.it/blog/2006/11/21/primi_passi_com_maven_prima_parte_3.html"&gt;http://www.javajournal.it/blog/2006/11/21/primi_passi_com_maven_prima_parte_3.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javajournal.it/blog/2006/11/24/primi_passi_com_maven_seconda_parte_3.html"&gt;http://www.javajournal.it/blog/2006/11/24/primi_passi_com_maven_seconda_parte_3.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javajournal.it/blog/2006/11/30/primi_passi_com_maven_terza_parte_3.html"&gt;http://www.javajournal.it/blog/2006/11/30/primi_passi_com_maven_terza_parte_3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aggiornamento 14:43&lt;/span&gt;&lt;br /&gt;Guida letta, facile, molto semplice... ho capito il contenuto e almeno ora ho un po' più chiare le dinamiche di maven. Ma è una guida semplice, che spiega meno di quello che mi serve per capire i tutorial maven-spring-gwt&lt;br /&gt;&lt;br /&gt;Nel frattempo trovo qualcosa per l'integrazione di Maven ed Eclipse&lt;br /&gt;&lt;a href="http://www.jugsiracusa.it/pmwiki.php?n=KnowledgeBase.KBMavenEclipse"&gt;http://www.jugsiracusa.it/pmwiki.php?n=KnowledgeBase.KBMavenEclipse&lt;/a&gt;&lt;br /&gt;in realtà ho già installato un plug in per ecplise (M2Eclipse)... ma me ne installo un'altra che viene consigliata sul sito ufficiale di Maven (&lt;a href="http://maven.apache.org/eclipse-plugin.html"&gt;http://maven.apache.org/eclipse-plugin.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Continuo a Studiarmi Maven&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7043979897673858538?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7043979897673858538/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7043979897673858538' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7043979897673858538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7043979897673858538'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/04/ancora-su-maven.html' title='ancora su Maven'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-5008963125681020490</id><published>2008-03-27T17:09:00.004+01:00</published><updated>2008-04-04T11:35:37.821+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>Maven</title><content type='html'>Già nelle scorse settimane mi era più volte capitato di leggere qualcosa su Maven... alcuni tutorial e progetti che ho analizzato lo richiedevano o facevano riferimento a questo tool, ma ho sempre evitato di "sapere cosa fosse".&lt;br /&gt;&lt;br /&gt;Leggendo però il tutorial (anzi, vedendo la videolezione e relativi source) per l'integrazione tra GWT e Spring si è resa necessario lo studio, anche solo approssimativo, di cosa sia Maven.&lt;br /&gt;&lt;br /&gt;Copio la definizione trovata in questa pagina:&lt;br /&gt;&lt;a href="http://www2.mokabyte.it/cms/article.run?articleId=S85-L5J-HP3-86O_7f000001_30480431_0844866c"&gt;http://www2.mokabyte.it/cms/article.run?articleId=S85-L5J-HP3-86O_7f000001_30480431_0844866c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Maven è un uno strumento "intelligente" e di alto livello per la gestione dei progetti in termini di compilazione, assemblaggio, test, deployment, e così via.&lt;/blockquote&gt;Sembrerebbe qualcosa di fin troppo evoluto per quello che sto facendo ora, anche se probabilmente diventerà interessante e utile per ciò che implementeremo. E dato che per comprendere ed utilizzare alcuni tutorial devo saperlo utilizzare, forse è il caso che me los tudi almeno superficialmente.&lt;br /&gt;&lt;br /&gt;Attualmente sto leggendo questi articoli:  &lt;a href="http://www2.mokabyte.it/cms/article.run?articleId=S85-L5J-HP3-86O_7f000001_30480431_0844866c"&gt;Maven: best practices per il processo di build e di rilascio dei progetti in Java&lt;/a&gt;&lt;br /&gt;Sembrano fatti bene, la prima pagina me la sono letta e più o meno capita tutta: è un introduzione a cosa sia Maven e una semplificata analisi di confronto Maven VS Ant (uno strumento di build di progetti Java)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-5008963125681020490?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/5008963125681020490/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=5008963125681020490' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5008963125681020490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5008963125681020490'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/maven.html' title='Maven'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7294916586498602828</id><published>2008-03-26T10:17:00.007+01:00</published><updated>2008-03-27T11:17:10.805+01:00</updated><title type='text'>Alcuni libri da comprare</title><content type='html'>Qui un elenco di libri che dovremmo proprio acquistare. Alcuni di questi sono riuscito a recuperarli come pdf, anche se sarebbe il caso di averli stampati!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Amazon UK &lt;/span&gt;(normalmente la merce arriva in 10 giorni dal pagamento)&lt;br /&gt;Spese di spedizione: 3,99 £ a spedizione (per libri) e 0,99 £ per libro&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Effective Java: A Programming Language Guide&lt;/span&gt;&lt;br /&gt;Pratici consigli (e codice) per programmare al meglio in Java&lt;br /&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0321356683&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GWT In Action:&lt;/span&gt;&lt;br /&gt;Sembrerebbe essere un ottimo libro per l'uso di GWT. Molti esempi e pezzi di codice da questo blog sono tratti da questo libro&lt;br /&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988231&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GWT in Practice&lt;/span&gt;&lt;br /&gt;Potrebbe essere un alternativa, consigliato per il modello MVC&lt;br /&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988290&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spring in Action&lt;/span&gt;&lt;br /&gt;Altro libro della serie "In Action", per l'utilizzo di spting&lt;br /&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988134&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spring FrameWork 2.0&lt;/span&gt;&lt;br /&gt;Potrebbe essere una valida alternativa, come libro per Springs&lt;br /&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=047010161X&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Persistence with Hibernate&lt;/span&gt;&lt;br /&gt;Molto probabilmente Hibernate saràù il framwork che useremo per la persistenza dei dati&lt;br /&gt;&lt;iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=lamiatesi-fdl-21&amp;amp;o=2&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1932394885&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Amazon COM&lt;/span&gt; (normalmente la merce arriva in 15-20 giorni dal pagamento)&lt;br /&gt;Spese di spedizione: 3,99 $ a spedizione e 3,99 $ per libro&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Effective Java: A Programming Language Guide&lt;/span&gt;&lt;br /&gt;Pratici consigli (e codice) per programmare al meglio in Java&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0201310058&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GWT In Action:&lt;/span&gt;&lt;br /&gt;Sembrerebbe essere un ottimo libro per l'uso di GWT. Molti esempi e pezzi di codice da questo blog sono tratti da questo libro&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988231&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GWT In Practice&lt;/span&gt;&lt;br /&gt;Potrebbe essere un alternativa, consigliato per il modello MVC&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988290&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spring in Action&lt;/span&gt;&lt;br /&gt;Altro libro della serie "In Action", per l'utilizzo di spting&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988134&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Professional Java Development with the Spring Framework&lt;/span&gt;&lt;br /&gt;Potrebbe essere una valida alternativa, come libro per Springs&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0764574833&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Persistence with Hibernate&lt;/span&gt;&lt;br /&gt;Molto probabilmente Hibernate saràù il framwork che useremo per la persistenza dei dati&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1932394885&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7294916586498602828?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7294916586498602828/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7294916586498602828' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7294916586498602828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7294916586498602828'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/alcuni-libri-da-comprare.html' title='Alcuni libri da comprare'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-481885972691462081</id><published>2008-03-18T17:10:00.003+01:00</published><updated>2008-04-04T09:16:23.911+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>Rilasciato un aggiornamento minore di GWT: GWT 1.4.62</title><content type='html'>Mentre sto un po' impazzendo per studiarmi almeno un pochino (giusto un infarinatura, prima di buttarmici seriamente) riguardo spring e la sua integrazione con gwt, leggo che è stata rilasciata ieri un aggiornamento, minore, a GWT.&lt;br /&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/bd5cbb7a0d5b60aa"&gt;http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/bd5cbb7a0d5b60aa&lt;/a&gt;&lt;br /&gt;sembrano solo bugfix... ma dato che uno di questi sembra importante per problemi connessi a Firefox3, e dato che il rilascio di FF3 sembra imminente, forse è il caso di aggiornarsi...&lt;br /&gt;&lt;br /&gt;Chissà quando verrà rilasciato GWT 1.5&lt;br /&gt;In questo caso l'aggiornamento sarà decisamente più interessante, no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-481885972691462081?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/481885972691462081/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=481885972691462081' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/481885972691462081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/481885972691462081'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/rilasciato-un-aggiornamento-minore-di.html' title='Rilasciato un aggiornamento minore di GWT: GWT 1.4.62'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-9215192273091818285</id><published>2008-03-13T10:07:00.009+01:00</published><updated>2008-04-04T10:45:57.384+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Spring</title><content type='html'>Dopo aver analizzato un po' di licenze sui prodotti opensource, per verificare se in effetti potremo utilizzarli nel nostro lavoro, penso sia il caso di dedicare un po' di tempo allo studio di Spring, un framework osannato da molti per lo sviluppo di applicazioni professionali in Java, soprattutto in ambito web.&lt;br /&gt;&lt;br /&gt;Questi gli articoli, presentazioni, tutorial, documentazione che sto analizzando&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.howardism.org/thoughts/001310.html"&gt;Spring Framework Reviewed&lt;/a&gt;, by Howardism.org&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework"&gt;Introduction to The Spring Framwork&lt;/a&gt;, by Rod Johnson, principale sviluppatore di Spring&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaportal.it/rw/39571/editorial.html"&gt;Spring MVC, Inversione del Controllo e Dependency Injection, prima parte&lt;/a&gt;, &lt;a href="http://www.javaportal.it/rw/39810/editorial.html"&gt;seconda parte&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaportal.it/download/JIPDaySeminarioDelVecchio.pdf"&gt;Usare Spring a pieno regime con WebFlow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.springframework.org/docs/Spring-MVC-step-by-step/index.html"&gt;Developing a Spring Framework MVC application step-by-step&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.springframework.org/docs/Spring-MVC-step-by-step/index.html"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Altro su Spring:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://springmodules.dev.java.net/"&gt;https://springmodules.dev.java.net/&lt;/a&gt; progetto parallelo a spring, con alcuni moduli da poter integrare a Spring, tra cui un Validator che support validazioni dichiarative (non so benissimo cosa significhi) per validare i dati di un forum (modulo: springmodules-validator.jar). Pagina 517 di "Spring in Action".&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ongwt.com/post/2008/03/25/The-Three-Amigos-%3A-Maven-Spring-and-GWT"&gt;The Three Amigos : Maven, Spring and GWT&lt;/a&gt; sempre sull'integrazioe gwt psrings (vedi sotto) ma qui spiega anche maven2 (che non ho capito bene come si usa... e nemmeno bene cosa sia esattamente)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;E alcuni tutorial e articoli sull'integrazione Spring e GWT&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://software-wonders.blogspot.com/2007/02/it-is-not-mistery-that-google-web.html"&gt;GWT-Spring Integration Demystified&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jroller.com/galina/entry/google_web_toolkit_integration_with"&gt;Google Web Toolkit. Integration with Spring framework&lt;/a&gt;, raccolta di proposte&lt;/li&gt;&lt;li&gt;&lt;a href="http://g.georgovassilis.googlepages.com/usingthegwthandler"&gt;Using the GWTHandler&lt;/a&gt;, che usa le librerie &lt;a href="http://gwt-widget.sourceforge.net/?q=node/45"&gt;GWT Server Library&lt;/a&gt; di cui abbiamo già parlato&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ongwt.com/post/2008/02/14/Three-parts-tutorial-%3A-Spring-Hibernate-and-GWT"&gt;Three parts tutorial : Spring, Hibernate and GWT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.digitalascent.com/2007/11/gwt-rpc-with-spring-2x_12.html"&gt;GWT-RPC with Spring 2.x&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ongwt.com/post/2007/09/08/Building-web-based-fat-clients-using-GWT"&gt;Building web-based 'fat clients' using GWT&lt;/a&gt; sembrerebbe un interessante videolezione (&lt;a href="http://www.parleys.com/display/PARLEYS/Building+web-based+%27fat+clients%27+using+GWT"&gt;link diretto&lt;/a&gt;) su come integrare il back end di una grossa applicazione costruita in spring con gwt (&lt;a href="http://bram.jteam.nl/index.php/2007/06/20/springone-2007-slides-sample-code/"&gt;qui codici sorgenti e slides&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://adminsight.de/2008/02/14/non-invasive-gwt-and-spring-integration/%C3%83%C2%B9"&gt;Non invasive GWT and Spring integration&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-9215192273091818285?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/9215192273091818285/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=9215192273091818285' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/9215192273091818285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/9215192273091818285'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/spring.html' title='Spring'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2016325667626296284</id><published>2008-03-12T17:07:00.009+01:00</published><updated>2011-04-20T12:12:22.352+02:00</updated><title type='text'>Licenze</title><content type='html'>Analizzando e considerando la possibilità di utilizzare vari framework, librerie ed altro, rilasciati sotto vari tipi di licenze, è il caso di analizzarne una ad una, soprattutto per verificare se siano compatibili co il rilascio di lavoro commerciale e proprietario (come ovviamente la fdl è intenzionata a fare)&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gnu.org/licenses/gpl.html"&gt;GNU General Public License (GPLv3)&lt;/a&gt;&lt;br /&gt;Non permette di usare software rilasciato con GPLv3 in prodotti commerciali, poichè comunque bisogna rilasciare tutto il progetto sotto GPLv3&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gnu.org/licenses/agpl-3.0.html"&gt;GNU Affero General Public License&lt;/a&gt;&lt;br /&gt;Deriva dalla GPL, ma si intende per software usato in un network. Quindi non utilizzabile in software commerciale.&lt;br /&gt;Sono rilasciati sotto AGPL&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Itext (dalla versione 5.X)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.apache.org/licenses/LICENSE-2.0"&gt;Apache Software License Version 2.0&lt;/a&gt; (ASL 2.0)&lt;br /&gt;E' una licenza poco restrittiva. Permette l'uso del materiale rilasciato sotto di essa per lavori commerciali e proprietari. ???Non molto dissimile dalla BSD???&lt;br /&gt;E' compatibile con la licenza GPLv3 (ma non con GPL versione 2), quindi materiale rilasciato con ASL può essere incluso in materiale rilasciato sotto la GPLv3&lt;br /&gt;Si può ridistribuire materiale che contiene sofwtare rilasciato sotto ASL in ogni forma e mezzo a patto di&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allegare copia della licenza ASL 2.0&lt;/li&gt;&lt;li&gt;se si è modificato qualche file rilasciato sotto ASL bisogna specificarlo nel file stesso prima di redistribuirlo&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Sono rilasciati sotto ASL (e quindi inseribili/utilizzabili senza problemi nel nostro lavoro):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hibernate4gwt.sourceforge.net/"&gt;Hibernate4GWT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gwtwindowmanager.org/"&gt;GWT Window Manager&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xstm.net/"&gt;XSTM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/jstm4gwt/" style="text-decoration: none; color: rgb(0, 0, 0);"&gt;jstm4gwt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gwt-widget.sourceforge.net/?q=node/45"&gt;GWT Server Library&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gwt-widget.sourceforge.net/"&gt;GWT Widget Library&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mozilla.org/MPL/MPL-1.1.html"&gt;Mozilla Public License&lt;/a&gt; (MPL)&lt;br /&gt;Licenza per software libero, senza un forte permesso d'autore (poco restrittivo). E' però incompatibile con la GNU GPL.&lt;br /&gt;Contiene però una clausola che permette agli sviluppatori iniziali di associare al prodotto una nuova licenza. Generalmente quindi utilizzabile anche per prodotti commerciali e proprietari&lt;br /&gt;&lt;br /&gt;Sono rilasciati sotto MPL i seguenti prodotti&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://echo.nextapp.com/site/echo2"&gt;Echo2&lt;/a&gt; (usabile e ridistribile con prodotti commerciali e propietari)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.gnu.org/licenses/lgpl.html"&gt;GNU Lesser General Public Licence (LGPL), v 3.0&lt;/a&gt;.&lt;br /&gt;Versione meno restrittiva della Gnu. Permette l'utilizzo di librerie/codice rilasciato in progetti commerciali e proprietari, a patto di indicarne la presenza, l'origine e la licenza stessa. Se nel progetto commerciale si usano modifiche a questo codice, si è obbligati, assieme al codice stesso, rilasciare le modifiche come codice open, indicando l'origine primaria e rilasciando (queste modifiche)  con licenza LGPL. In sostenza, se useremo nel nostro progetto codice LGPL, dovremo indicarne la presenza... se dovremo modificare codice LGPL dovremo inserire nelle realease (anche commerciali e proprietarie) il sorgente di questo codice proprietario che dovremo rilasciare sotto LGPL. Se il codice LGPL viene usato "as is", non si è obbligati ad includerlo, basta farne riferimento nella licenza del programma proprietario rilasciato. Recentemente (2011) ho trovato un link che spiega un'ulteriore obbligo previsto dalla LGPL: bisogna permettere a chi usa il proprio software che comprende una libreria LGPL di poter usare un'eventuale nuova versione di tale libreria (&lt;a href="http://www.gamedev.net/topic/80919-using-gpl-libraries-with-commercial-software/"&gt;http://www.gamedev.net/topic/80919-using-gpl-libraries-with-commercial-software/&lt;/a&gt;) (Non ho indagato bene su questo aspetto)&lt;br /&gt;&lt;br /&gt;Sono rilasciati sotto LGPL v 3.0&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gwt-ext.com/"&gt;GWT-Ext&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mygwt.net/"&gt;MyGWT&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://extjs.com/"&gt;EXT JS&lt;/a&gt;, le librerie che servono per il funzionamento di GWT-EXT e MyGWT. In realtà esistono altri tipi di licenza per queste librerie, come quella commerciale.&lt;/li&gt;&lt;li&gt;Itext, sino alla versione 4.2 (poi passa alla AGPL)&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/flying-saucer/"&gt;Flyng-Saucer&lt;/a&gt;, che comprende IText 2.0.8 (quindi ancora LGPL)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://opensource.org/licenses/bsd-license.php"&gt;Licenza BSD&lt;/a&gt;&lt;br /&gt;Licenza molto libera, esistente in diverse versione, che ne aumentano, o restingono, di poco la libertà.&lt;br /&gt;Le licenze BSD riflettono l'idea più ampia possibile del dono liberale: chiunque può fare ciò che meglio crede del programma rilasciato ed acquisito con l'unico dovere di citare l'autore (l'università di Berkeley); questo significa anche che chiunque può sviluppare in forma chiusa con una licenza proprietaria un programma BSD modificato, magari anche impedendo ai propri acquirenti di modificarlo e ridistribuirlo a loro volta.&lt;br /&gt;In realtà esiste anche una versione, chiamata "a tre clausole", che toglie la clausola della obbligatoria pubblicità verso l'università di Berkeley.&lt;br /&gt;&lt;br /&gt;Sono rilasciati sotto licenze di tipo BSD&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/gwt-ext-ux/"&gt;Gwt-Ext-Ux&lt;/a&gt;, qualche estensione alle librerie Gwt-Ext&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2016325667626296284?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2016325667626296284/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2016325667626296284' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2016325667626296284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2016325667626296284'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/licenze.html' title='Licenze'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2106380915302634763</id><published>2008-03-12T12:11:00.003+01:00</published><updated>2008-03-12T14:05:28.321+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Spring / Hibernate e altri framework</title><content type='html'>Studiando per la rete il pattern MVC, sono incappato in alcuni framework che inizialmente avevamo considerato per lo sviluppo del nostro frameweork, tra i quali, Spring (&lt;a href="http://www.springframework.org/"&gt;http://www.springframework.org/&lt;/a&gt;), Hibernate (&lt;a href="http://www.hibernate.org/"&gt;http://www.hibernate.org/&lt;/a&gt;) e altri framework che possono aiutarci nello sviluppo di ciò che vogliamo realizzare&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;&lt;br /&gt;E' un framework a strati per la realizzazione di applicazioni Java/J2EE. Ha al suo interno diversi "moduli", tra cui una sorta di implementazione del pattern MVC e permette la facile integrazione di altri framework, come Hibernate.&lt;br /&gt;Un interessante articolo: &lt;a href="http://www2.mokabyte.it/cms/article.run?articleId=4UB-OL6-QZG-5XM_7f000001_30520983_38fb6a1b"&gt;Mokabyte Sprin&lt;/a&gt; e successivi&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;&lt;br /&gt;è una piattaforma &lt;a href="http://it.wikipedia.org/wiki/Middleware" title="Middleware"&gt;middleware&lt;/a&gt; &lt;i&gt;open source&lt;/i&gt; per lo sviluppo di applicazioni Java che fornisce un servizio di &lt;a href="http://it.wikipedia.org/wiki/Object-relational_mapping" title="Object-relational mapping"&gt;Object-relational mapping&lt;/a&gt; (ORM), ovvero che gestisce la rappresentazione e il mantenimento su  database relazionale di un sistema di oggetti Java.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gwt-widget.sourceforge.net/?q=node/45"&gt;GWT Server Library&lt;/a&gt;&lt;br /&gt;Una libreria che permette la facile integrazione tra GWT e Spring&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2106380915302634763?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2106380915302634763/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2106380915302634763' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2106380915302634763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2106380915302634763'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/spring-hibernate-e-altri-framework.html' title='Spring / Hibernate e altri framework'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4639570000401892785</id><published>2008-03-12T10:54:00.002+01:00</published><updated>2008-03-12T11:44:53.999+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='MyGWT'/><title type='text'>MyGWT</title><content type='html'>Mygwt è un altra libreria/framework sviluppata sulla libreria ext (così come Gwt-Ext). Non sembra introdurre elementi grafici più interessanti di altre librerie (Gwt-Ext sembra appunto molto più completa ed interessante da questo punto di vista), ma implementa una forma embrionale di MVC (pattern Model View Controller) e quindi è interessante da analizzare, anche solo per vedere un implementazione di questo pattern.&lt;br /&gt;&lt;br /&gt;MyGwt lo si scarica dal sito ufficiale, &lt;a href="http://mygwt.net/"&gt;http://mygwt.net/&lt;/a&gt;, l'installazione è semplice ed immediata: basta scompattare il file dalla pagina download del sito in una cartella del proprio fyle system, per poi referenziarla nei progetti che si intende utilizzare.&lt;br /&gt;Anche la configurazione di eclipse per l'utilizzo di MyGwt è semplice, e basta seguire i pochi passi proposti nel wiki della libreria (&lt;a href="http://mygwt.net/learn/index.php?title=Configuring_Eclipse"&gt;http://mygwt.net/learn/index.php?title=Configuring_Eclipse&lt;/a&gt;).&lt;br /&gt;Per prima cosa è meglio creare un progetto nuovo, come Web -&gt; Dinamic Web -&gt; selezionando poi "dionamic web project using GWT" in "configuration".&lt;br /&gt;Si deve poi importare tutto il framework GWT... per fare ciò possiamo aiutarci come al solito dal plugin GWT-Tooling. Basta quindi cliccare con il destro sul progetto appena creato, selezionare new -&gt; other -&gt; GWT -&gt; GWT-Module&lt;br /&gt;Poi In poche parole basta aggiungere il jar come libreria esterna (tasto destro sul progetto eclipse -&gt; Build Path (oppure proprties) -&gt; Configure Build path (oppure Java Build Path) -&gt; Libraries -&gt; Add External Jar -&gt; selezionare il mygwt.jar cercandolo nel proprio file system dove si è scompattato prima il file scaricato dal sito. Bisogna poi fare attenzione che il mygwt.jar rimanga sempre più in altro, nella finestra "order and export" (sempre nella Java Bild Path), rispetto alla libreria normale di GWT. Questo perchè, se non ho capito male, MyGwt riscrive alcune classi di GWT.&lt;br /&gt;Bisogna poi inserire nel file xml del modulo gwt questa riga&lt;br /&gt;&lt;pre&gt;&amp;lt;inherits name="net.mygwt.ui.MyGWT" /&amp;gt;&lt;/pre&gt;&lt;br /&gt;e inserire gli stili css nel file htm&lt;br /&gt;&lt;pre&gt;&amp;lt;link rel="stylesheet" type="text/css" href="mygwt-all.css" /&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="mygwt-all-gray.css" /&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4639570000401892785?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4639570000401892785/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4639570000401892785' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4639570000401892785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4639570000401892785'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/mygwt.html' title='MyGWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-64450603557512035</id><published>2008-03-10T16:13:00.003+01:00</published><updated>2008-03-26T14:45:16.450+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='HMVC'/><title type='text'>Model View Controller e altri design pattern</title><content type='html'>Sto analizzando ora, per la realizzazione del framwork da sviluppare, dei design pattern che possano essere adeguati.&lt;br /&gt;&lt;br /&gt;Uno dei più importanti e utili, probabilmente, è il MVC (Model View Controller), la divisione tra gestione delle view (visioni, rappresentazioni all'utente), il controller (che intercetta le interazioni dell'utente, e chiede al model aggiornamenti di stato) e il model (business logic e data management)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MVC, esempi&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/patterns/MVC.html"&gt;http://java.sun.com/blueprints/patterns/MVC.html&lt;br /&gt;&lt;/a&gt;&lt;a href="http://java.sun.com/blueprints/patterns/MVC-detailed.html"&gt;http://java.sun.com/blueprints/patterns/MVC-detailed.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Front Controller&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html"&gt;http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/app-arch/app-arch5.html"&gt;Esempio del Java Pet Store Demo&lt;/a&gt;, con MVC e Front Controller&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Altro design pattern, che trovo consigliato nei vari tutorial di spring + gwt e simili, è una variante (credo) al MVC, cioè Hierarchical Model-View-Controller. Sembrerebbe un sistema più stratificato e "separatista" del MVC.&lt;br /&gt;Alcuni tutorial:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.thecentric.com/wiki/index.php/HMVC_Tutorial"&gt;HMVC Tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaworld.com/jw-07-2000/jw-0721-hmvc.html"&gt;HMVC: The layered pattern for developing strong client tiers&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-64450603557512035?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/64450603557512035/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=64450603557512035' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/64450603557512035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/64450603557512035'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/model-view-controller-e-altri-design.html' title='Model View Controller e altri design pattern'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-9145594503936840449</id><published>2008-03-06T17:40:00.002+01:00</published><updated>2008-03-06T17:53:13.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='JSTM'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='XSTM'/><category scheme='http://www.blogger.com/atom/ns#' term='JSTM4GWT'/><title type='text'>GWT, JSTM e JSTM4GWT</title><content type='html'>In questa settimana sono riuscito nell'impresa di far dialogare GWT con JSTM4GWT (la versione per GWT di XSTM) e JSTM (la versione Java di XSTM.&lt;br /&gt;Ho realizzato (e sto ampliando) un piccolo esempio per verificare se riesco ad ottenere da XSTM ciò che voglio.&lt;br /&gt;&lt;br /&gt;L'idea di base è cercare di creare una form logica sul server, via Java, replicarla in GWT sul client, sia in via logica che come UI fisica sul browser e far comunicare il tutto in maniera semplice senza PRC.&lt;br /&gt;&lt;br /&gt;Lo strato che fa la maggior parte del lavoro è proprio, ovviamente XSMT... si realizza la maschera (form) logica sul server via java... sul serve non serve una rappresentazione visiva (ma sarebbe immediato implementarla). Si condivide con il client questa maschera logica (attraverso appunto il dialogo JSTM e JSTM4GWT) e la si replica poi in GWT per realizzarla fisicamente sul browser, e viceversa&lt;br /&gt;&lt;br /&gt;In questo modo ogni interazione sulla maschera fatta da un utente sul client viene replicata sulla maschera logica sul server, che può agire autonomamente in base ad ascoltatori che intercettano le variazioni della maschera logica, aggiorna la maschera logica che poi verrà replicata immediatamente sul client&lt;br /&gt;&lt;br /&gt;Per ora, nell'esempio che ho fatto io, si replicano immediatamente sul client le modifiche fatte sulla maschera logica del server... ma non viceversa (bisogna sempre premere il tasto "commit"... questo anche per una scelta architetturale di JSTM), anche se il comportamento è non difficilmente modificabile (già parzialmente testato)&lt;br /&gt;&lt;br /&gt;Il server riesce a capire se le modifiche sulla maschera logica sono avvenute internamente al server o dal client e quindi può agire diversamente di conseguenza.&lt;br /&gt;&lt;br /&gt;A quanto pare sono riuscito ad ottenere ciò che volevamo... devo verificare alcuni dettagli ma forse siamo arrivati ad un livello di astrazione/interazione vicino a quello che vorremmo ottenere... anche perchè la realizzazione grafica del client può essere abbastanza facilmente svincolata da GWT e realizzata in uno dei qualsiasi 3 linguaggi supportati da XSTM: Java, .NET e appunto Java/GWT&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-9145594503936840449?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/9145594503936840449/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=9145594503936840449' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/9145594503936840449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/9145594503936840449'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/03/gwt-jstm-e-jstm4gwt.html' title='GWT, JSTM e JSTM4GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-845501208689082481</id><published>2008-02-27T15:53:00.006+01:00</published><updated>2008-02-27T16:20:22.710+01:00</updated><title type='text'>Image Tooltip</title><content type='html'>Ho finalmente finito, più o meno, il primo applicativo "reale" con gwt.&lt;br /&gt;Come anticipato ho creato un modulo gwt che per ogni immagine in una pagina web (con una determinata classe) crei un "tooltip" con l'immagine a grandezza "naturale" che compaia quando si passa con il mouse sopra l'immagine stessa.&lt;br /&gt;In pratica il modulo parserizza tutta la pagina per cercare immagini con la data classe. Per ognuna di queste immagini crea un widget (una window di gwt-ext) con la stessa grandezza dell'immagine, contenente l'immagine stessa. A questo widgets viene aggiuntpo un ascoltatore per il mouse, e in caso di mouse hover si attiva (con una simpatica animazione fornita da gwt-ext), attiva una nuova window che carica la versione ad alta risoluzione dell'immagine (sul server ci devono essere quindi due immagini, l'immagine originale e una miniatura con lo stesso nome + "_th").&lt;br /&gt;Funziona tutto ok... meno bene la gestione del ridimensionamento della finestra del browser... i widgets della miniatura si spostano correttamente, le dimensioni del tooltip vengono correttamente calcolate (perchè in base al viewport del browser riduco la grandezza dell'immagine originale), ma la posizione e la grandezza del gagtes "tooltip" contenitore fanno un po' quello che vogliono... ma solo in caso di ridimensionamento.&lt;br /&gt;&lt;br /&gt;Ora comunque, visto che riesco a creare qualcosina, anche se semplice, con gwt e gwt-ext, sposto l'attenzione su XSTM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;codice per IMGTOOLTIP, Versione.... diciamo 0.5&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-size:70%;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package mie.prove.client;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;import com.google.gwt.user.client.DOM;&lt;br /&gt;import com.google.gwt.user.client.Element;&lt;br /&gt;import com.google.gwt.user.client.ui.Widget;&lt;br /&gt;import com.google.gwt.user.client.ui.Image;&lt;br /&gt;import com.google.gwt.user.client.Window;&lt;br /&gt;import com.google.gwt.user.client.ui.MouseListenerAdapter;&lt;br /&gt;import com.google.gwt.user.client.WindowResizeListener;&lt;br /&gt;import com.gwtext.client.widgets.layout.FitLayout;&lt;br /&gt;import com.gwtext.client.widgets.Component;&lt;br /&gt;&lt;br /&gt;public class GwtImageTooltip implements EntryPoint {&lt;br /&gt;&lt;br /&gt; ArrayList immagineTHWList  = new ArrayList();&lt;br /&gt; ArrayList imgList = new ArrayList();&lt;br /&gt; ArrayList TTwindowList = new ArrayList();&lt;br /&gt; ArrayList immagineToolTipList = new ArrayList();&lt;br /&gt; ArrayList misureOriginaliImmaginiTT = new ArrayList();&lt;br /&gt; int viewportW, viewportH;&lt;br /&gt; &lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  viewportW = Window.getClientWidth();&lt;br /&gt;  viewportH = Window.getClientHeight();&lt;br /&gt;  com.google.gwt.core.client.GWT.log("il viewport ha altezza" + viewportH + " e larghezza " + viewportW,null);&lt;br /&gt;  &lt;br /&gt;  Element elemento = DOM.getElementById("contenuto");&lt;br /&gt;  imgList = getElementsByClass(elemento, "img_tooltip");  &lt;br /&gt;  int numImg = imgList.size();    &lt;br /&gt;  for (int i=0; i &lt; numImg; i++){&lt;br /&gt;   com.google.gwt.core.client.GWT.log("processo il tooltip numero"+i,null);&lt;br /&gt;   &lt;br /&gt;   String urlImmagineTH = DOM.getElementProperty((Element)imgList.get(i), "src");&lt;br /&gt;   String altImmagineTH = DOM.getElementProperty((Element)imgList.get(i), "alt");&lt;br /&gt;   &lt;br /&gt;   int imgY = DOM.getAbsoluteTop((Element)imgList.get(i));&lt;br /&gt;   int imgX = DOM.getAbsoluteLeft((Element)imgList.get(i));&lt;br /&gt;   int[] posizioneImmagine = {imgX,imgY};&lt;br /&gt;   com.google.gwt.core.client.GWT.log("l'immagine"+i+" si trova in posizione "+imgX+" "+imgY,null);&lt;br /&gt;   &lt;br /&gt;   Image immagineTH = new Image(urlImmagineTH);&lt;br /&gt;   &lt;br /&gt;   final com.gwtext.client.widgets.Window immagineTHWindow = new com.gwtext.client.widgets.Window();     &lt;br /&gt;   /*&lt;br /&gt;   //per farlo diventare esattamente come un immagine&lt;br /&gt;   immagineTHWindow.setFrame(false);&lt;br /&gt;   immagineTHWindow.setHeader(false);&lt;br /&gt;   immagineTHWindow.setHeaderAsText(false);&lt;br /&gt;   //fine per farlo diventare esattamente come un immagine&lt;br /&gt;   */&lt;br /&gt;   immagineTHWindow.setLayout(new FitLayout());  &lt;br /&gt;   immagineTHWindow.add(immagineTH);   &lt;br /&gt;   //immagineTHWindow.anchorTo((Element)imgList.get(i), position, offsetXY)&lt;br /&gt;   immagineTHWindow.setModal(false);&lt;br /&gt;   immagineTHWindow.setPixelSize(immagineTH.getWidth(),immagineTH.getHeight());&lt;br /&gt;   immagineTHWindow.setDraggable(false);&lt;br /&gt;   immagineTHWindow.setClosable(false);&lt;br /&gt;   immagineTHWindow.setResizable(false);&lt;br /&gt;   immagineTHWindow.setFooter(true);&lt;br /&gt;   immagineTHWindow.setTitle(altImmagineTH);  &lt;br /&gt;   immagineTHWindow.setPosition(imgX,imgY);&lt;br /&gt;   immagineTHWindow.show();&lt;br /&gt;   &lt;br /&gt;   //aggiungo la window immagineTHWindow alla lista immagineTHWList&lt;br /&gt;   immagineTHWList.add(immagineTHWindow);&lt;br /&gt;      &lt;br /&gt;   String urlTT = urlImmagineTH.replaceAll("_th", "");&lt;br /&gt;   Image immagineToolTip = new Image(urlTT);&lt;br /&gt;   immagineToolTip.setVisible(false);&lt;br /&gt;   immagineToolTipList.add(immagineToolTip);&lt;br /&gt;   int[] misureOriginali = {immagineToolTip.getWidth(),immagineToolTip.getHeight()};&lt;br /&gt;   misureOriginaliImmaginiTT.add(misureOriginali);&lt;br /&gt;   &lt;br /&gt;   int [] misureTTwindow = calcolaMisuraTTwindow(posizioneImmagine,immagineToolTip);&lt;br /&gt;   int immagineTTW = misureTTwindow[0];&lt;br /&gt;   int immagineTTH = misureTTwindow[1];&lt;br /&gt;   &lt;br /&gt;   immagineToolTip.setPixelSize(immagineTTW, immagineTTH);&lt;br /&gt;   &lt;br /&gt;   final com.gwtext.client.widgets.Window TTwindow = new com.gwtext.client.widgets.Window();  &lt;br /&gt;   TTwindow.setLayout(new FitLayout()); &lt;br /&gt;   TTwindow.add(immagineToolTip); &lt;br /&gt;   TTwindow.setTitle(altImmagineTH);    &lt;br /&gt;   TTwindow.setModal(false);&lt;br /&gt;   TTwindow.setDraggable(false);&lt;br /&gt;   TTwindow.setClosable(false);&lt;br /&gt;   TTwindow.setResizable(false);&lt;br /&gt;   TTwindow.setFooter(true);&lt;br /&gt;   TTwindow.setAnimateTarget((Element)imgList.get(i));&lt;br /&gt;   TTwindow.setPixelSize(immagineTTW, immagineTTH);&lt;br /&gt;   &lt;br /&gt;   posizionaTTwindow(TTwindow, posizioneImmagine);&lt;br /&gt;   &lt;br /&gt;   //aggiungo la window TTwindow alla lista TTwindowList&lt;br /&gt;   TTwindowList.add(TTwindow);&lt;br /&gt;      &lt;br /&gt;   //agiungo ascoltatore eventi all'immagine per aprire tooltip&lt;br /&gt;   immagineTH.addMouseListener(new MouseListenerAdapter() {&lt;br /&gt;         public void onMouseEnter(Widget sender) {&lt;br /&gt;          TTwindow.show();&lt;br /&gt;          Component immagineToolTip = TTwindow.getComponent(0);&lt;br /&gt;          immagineToolTip.setVisible(true);&lt;br /&gt;         }&lt;br /&gt;   });&lt;br /&gt;       &lt;br /&gt;   //agiungo ascoltatore eventi mouse al tooltip per chiuderlo&lt;br /&gt;   immagineToolTip.addMouseListener(new MouseListenerAdapter() {&lt;br /&gt;         public void onMouseLeave(Widget sender) {&lt;br /&gt;          TTwindow.hide();&lt;br /&gt;         }&lt;br /&gt;   });       &lt;br /&gt;  }  &lt;br /&gt;  &lt;br /&gt;  //aggiungo l'ascoltatore alla finestra per spostare le immagini in caso di resize&lt;br /&gt;  Window.addWindowResizeListener(new WindowResizeListener(){&lt;br /&gt;   public void onWindowResized(int x, int y){    &lt;br /&gt;    aggiornaPosizioneimmaginiTHWindow(immagineTHWList); &lt;br /&gt;    viewportW = Window.getClientWidth();&lt;br /&gt;    viewportH = Window.getClientHeight();&lt;br /&gt;    aggiornaMisureTTwindow(TTwindowList,imgList,immagineToolTipList);&lt;br /&gt;    aggiornaPosizioniTTwindows(TTwindowList,imgList);&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void aggiornaMisureTTwindow(ArrayList TTwindowList, ArrayList imgList, ArrayList immagineToolTipList){&lt;br /&gt;  int numImg = TTwindowList.size();&lt;br /&gt;  int [] posizioneImmagine = new int[2];&lt;br /&gt;  for (int i=0; i &lt; numImg; i++){&lt;br /&gt;   com.gwtext.client.widgets.Window TTwindow = (com.gwtext.client.widgets.Window)TTwindowList.get(i);&lt;br /&gt;   try{&lt;br /&gt;    int imgY = DOM.getAbsoluteTop((Element)imgList.get(i));&lt;br /&gt;    int imgX = DOM.getAbsoluteLeft((Element)imgList.get(i));&lt;br /&gt;    posizioneImmagine[0] = imgX;&lt;br /&gt;    posizioneImmagine[1] = imgY;&lt;br /&gt;   }&lt;br /&gt;   catch(IndexOutOfBoundsException e){&lt;br /&gt;    System.err.print("IndexOutOfBoundsException: ");&lt;br /&gt;    System.err.println(e.getMessage());&lt;br /&gt;    com.google.gwt.core.client.GWT.log("IndexOutOfBoundsException: ",null);&lt;br /&gt;    com.google.gwt.core.client.GWT.log(e.getMessage(),null);&lt;br /&gt;   }&lt;br /&gt;   Image immagineToolTip = (Image)immagineToolTipList.get(i);&lt;br /&gt;   int[] misureOriginali = (int[])misureOriginaliImmaginiTT.get(i);&lt;br /&gt;   immagineToolTip.setPixelSize(misureOriginali[0], misureOriginali[1]);&lt;br /&gt;   int [] misureTTwindow = calcolaMisuraTTwindow(posizioneImmagine,immagineToolTip);&lt;br /&gt;   int immagineTTW = misureTTwindow[0];&lt;br /&gt;   int immagineTTH = misureTTwindow[1];&lt;br /&gt;   com.google.gwt.core.client.GWT.log("misure ricalcolate: imgx="+immagineTTW+" imgy="+immagineTTH,null);   &lt;br /&gt;   immagineToolTip.setPixelSize(immagineTTW, immagineTTH);&lt;br /&gt;   TTwindow.setPixelSize(immagineTTW, immagineTTH);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int[] calcolaMisuraTTwindow(int[] posizioneImmagine, Image immagineToolTip){&lt;br /&gt;  float resize = 1; //% di resize in caso l'immagine sia troppo grande&lt;br /&gt;  int immagineTTH = immagineToolTip.getHeight();&lt;br /&gt;  int immagineTTW = immagineToolTip.getWidth();&lt;br /&gt;  String url = immagineToolTip.getUrl();&lt;br /&gt;&lt;br /&gt;  com.google.gwt.core.client.GWT.log("L'immagine tooltip ha altezza" + immagineTTH + " e larghezza " + immagineTTW + " e url = " +url,null);&lt;br /&gt;  &lt;br /&gt;  //se l'immagine è più grande del viewport, devo scalarla e posizionarla centrata&lt;br /&gt;  if ((immagineTTW &gt; viewportW-10) || (immagineTTH &gt; viewportH-10)){&lt;br /&gt;   if (immagineTTW &gt; viewportW-10){&lt;br /&gt;    resize = (float)immagineTTW / ((float)viewportW-10);&lt;br /&gt;   }&lt;br /&gt;   else {&lt;br /&gt;    resize = (float)immagineTTH/((float)viewportH-10);&lt;br /&gt;   }&lt;br /&gt;   float temp = (immagineTTW/resize);&lt;br /&gt;   immagineTTW = Math.round(temp);&lt;br /&gt;   temp = (immagineTTH/resize);&lt;br /&gt;   immagineTTH = Math.round(temp);&lt;br /&gt;  }&lt;br /&gt;  int [] misureTTwindow = {immagineTTW,immagineTTH};&lt;br /&gt;  return misureTTwindow;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void aggiornaPosizioniTTwindows(ArrayList TTwindowList, ArrayList imgList){&lt;br /&gt;  int numImg = TTwindowList.size();&lt;br /&gt;  for (int i=0; i &lt; numImg; i++){&lt;br /&gt;   com.gwtext.client.widgets.Window TTwindow = (com.gwtext.client.widgets.Window)TTwindowList.get(i);&lt;br /&gt;   int imgY = DOM.getAbsoluteTop((Element)imgList.get(i));&lt;br /&gt;   int imgX = DOM.getAbsoluteLeft((Element)imgList.get(i));&lt;br /&gt;   int [] posizioneImmagine = {imgX,imgY};&lt;br /&gt;   posizionaTTwindow(TTwindow,posizioneImmagine);&lt;br /&gt;   Component immagineToolTip = TTwindow.getComponent(0); &lt;br /&gt;   immagineToolTip.setVisible(false);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void posizionaTTwindow(com.gwtext.client.widgets.Window TTwindow, int[] posizioneImmagine){&lt;br /&gt;  int posTTX = posizioneImmagine[0]; //posizione X del tooltip&lt;br /&gt;  int posTTY = posizioneImmagine[1]; //posizione Y del tooltip&lt;br /&gt;  int spostTTX = 0; //spostamento del tooltip nel caso l'immagine sia larga&lt;br /&gt;  int ttwindowWidth = TTwindow.getWidth(); //larghezza tooltip&lt;br /&gt;  //se l'immagine TT è troppo larga per stare nella posizione dell'immagine TH, la sposto a sinistra&lt;br /&gt;  if (posTTX + ttwindowWidth &gt; viewportW-5){&lt;br /&gt;   spostTTX = posTTX + ttwindowWidth - (viewportW-5); &lt;br /&gt;  } &lt;br /&gt;  TTwindow.setPagePosition(posTTX-spostTTX,posTTY);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //imgList e immagineTHWList hanno gli stessi indici&lt;br /&gt; public void aggiornaPosizioneimmaginiTHWindow(ArrayList immagineTHWList){&lt;br /&gt;  int numImg = immagineTHWList.size();&lt;br /&gt;  for (int i=0; i &lt; numImg; i++){&lt;br /&gt;   int imgY = DOM.getAbsoluteTop((Element)imgList.get(i));&lt;br /&gt;   int imgX = DOM.getAbsoluteLeft((Element)imgList.get(i));&lt;br /&gt;   com.gwtext.client.widgets.Window currentWindow = (com.gwtext.client.widgets.Window)immagineTHWList.get(i);&lt;br /&gt;   currentWindow.setPosition(imgX,imgY);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private ArrayList getElementsByClass(Element parent, String className){&lt;br /&gt;  ArrayList list = new ArrayList();&lt;br /&gt;  Element current = DOM.getFirstChild(parent);&lt;br /&gt;  String classe = null;&lt;br /&gt;  &lt;br /&gt;  while(current != null){&lt;br /&gt;   classe = DOM.getElementProperty(current, "className"); &lt;br /&gt;   if (classe!=null){&lt;br /&gt;    if(classe.equals(className)){&lt;br /&gt;     com.google.gwt.core.client.GWT.log("trovato un img_tooltip",null);&lt;br /&gt;     list.add(current);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   current = DOM.getNextSibling(current);&lt;br /&gt;  }&lt;br /&gt;  return list;&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-845501208689082481?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/845501208689082481/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=845501208689082481' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/845501208689082481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/845501208689082481'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/image-tooltip.html' title='Image Tooltip'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1876001085289421449</id><published>2008-02-20T09:34:00.003+01:00</published><updated>2008-02-20T12:12:19.159+01:00</updated><title type='text'>Gwt-Ext</title><content type='html'>Gwt-Ext (&lt;a href="http://gwt-ext.com/"&gt;http://gwt-ext.com/&lt;/a&gt;) sembrerebbe una libreria ben fornita. Anche Francesco ne è rimasto positivamente colpito. Sto provando a creare una mini applicazione con gwt-ext, un tooltip per le immagini...&lt;br /&gt;Vorrei che in una pagina web ci siano delle miniatura delle immagini, e passando il mouse sopra l'immagine si apra un tooltip contenente l'immagine in grandezza originale.&lt;br /&gt;Userei i tooltip presenti in gwt-ext, che accettano anche del codice html.&lt;br /&gt;&lt;br /&gt;Dal wiki di &lt;a href="http://gwt-ext.com/wiki/index.php/Tutorial:Introduction_to_GWT-Ext_2.0"&gt;GWT-EXT: Introduction to GWT Ext 2.0&lt;/a&gt;&lt;br /&gt;Bisogna anche scaricare la libreria Ext-Js (&lt;a href="http://extjs.com/download"&gt;http://extjs.com/download&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;una volta creato il progetto in eclipse, copiare queste cartelle di ext-js&lt;br /&gt;&lt;pre&gt;* /adapter&lt;br /&gt;* /resources&lt;br /&gt;* ext-all.js&lt;br /&gt;* ext-all-debug.js&lt;br /&gt;* ext-core.js&lt;br /&gt;* ext-core-debug.js&lt;/pre&gt;nella cartella &lt;tt&gt;src/com/mycompany/mypackage/public/js&lt;/tt&gt; (ovviamente adattata ai nomi del package)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; importare la libreria nel progetto: Tasto destro del mouse sul progetto, in eclipse, "build path"-&gt;"configure build path"-&gt;"libraries"-&gt;"add external jar" e si individua il jar di gwt-ext&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Successivamente bisogna inserire nel file di configurazione xml "nomeprogetto.gwt.xml" queste due righe, prima dell'importazione della classe del progetto&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Inherit the GWTExt Toolkit library configuration.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;inherits name="'com.gwtext.GwtExt'"&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/inherits&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;nel file html inserire queste righe&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!-- Begin ExtJS library files --&amp;gt;&lt;br&gt; &amp;lt;link rel="stylesheet" type="text/css" href="js/ext/resources/css/ext-all.css"/&amp;gt;&lt;br&gt; &amp;lt;script type="text/javascript" src="js/ext/adapter/ext/ext-base.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt; &amp;lt;script type="text/javascript" src="js/ext/ext-all.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;&amp;lt;!-- End ExtJS library files --&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;prima dell'inclusione del js del progetto&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Per ora ho creato la funzione che scorre la pagina e trova tutte le immagini con la classe css "img_tooltip". Per ogni immagine crea una lista che da in pasto poi alla funzione che attaccherà ad ogni immagine il tooltip stesso.&lt;br /&gt;&lt;br /&gt;Vediamo cosa riesco a fare.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1876001085289421449?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1876001085289421449/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1876001085289421449' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1876001085289421449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1876001085289421449'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/gwt-ext.html' title='Gwt-Ext'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-8109053051412891610</id><published>2008-02-15T11:50:00.008+01:00</published><updated>2008-04-03T11:52:10.116+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='XSTM'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Risorse GWT</title><content type='html'>Ora mi sono messo in rete a spulciare un po' di risorse per GWT, così nei prossimi giorni mi studio altro e provo a sviluppare qualcosa in GWT. Il fine primario è quello sia di imparare meglio a programmare in Java, sia famigliarizzare di più con GWT ma soprattutto tenere a mente l'obbiettivo che devo pormi per la il progetto/tesi: trovare un modo per sviluppare uno strato intermedio tra il server e il client... andando a fare qalcosa di simile a ciò che fa già echo2; in pratica fare in modo di non dover usare solo RPC per ogni interazione del client, ma cercare di pensare sul server la stessa logica sul client, fare comunicare le due logiche e interagire solo con quella lato server&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GWT Windows Manager (&lt;a href="http://www.gwtwindowmanager.org/"&gt;http://www.gwtwindowmanager.org/&lt;/a&gt;)&lt;br /&gt;Offre un sistema "ad alto livello" per la creazione/gestione di finestre e finestre di dialogo. Davvero bello e ben fatto. Da tenere in considerazione.&lt;/li&gt;&lt;li&gt;GWT-EXT (&lt;a href="http://gwt-ext.com/"&gt;http://gwt-ext.com/&lt;/a&gt;)&lt;br /&gt;Libreria fornitissima, con alberi, finestre, layout, e veramenti molti widgets, alcuni interessantissimi.&lt;/li&gt;&lt;li&gt;GWTSITE (&lt;a href="http://www.gwtsite.com/"&gt;http://www.gwtsite.com/&lt;/a&gt;)&lt;br /&gt;Un blog con un sacco di risorse interessanti, link utili, tutorial ecc..&lt;/li&gt;&lt;li&gt;OnGWT (&lt;a href="http://www.ongwt.com/"&gt;http://www.ongwt.com/&lt;/a&gt;)&lt;br /&gt;Altro blog aggiornato con risorse su GWT&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/02/yet-another-17.html"&gt;Tutorial GWT&lt;/a&gt;&lt;br /&gt;Un elenco di 17 nuovi tutorial su GWT, alcuni sembran interessanti, altri meno&lt;/li&gt;&lt;li&gt;XSTM (&lt;a href="http://www.xstm.net/"&gt;http://www.xstm.net/&lt;/a&gt;)&lt;br /&gt;Replicazione e sincronizzazione di oggetti, tra client e client, o client e server, per Java, .NET e GWT. Può esserci molto utile&lt;/li&gt;&lt;li&gt;GWT-Tooling (&lt;a href="http://code.google.com/p/gwt-tooling/"&gt;http://code.google.com/p/gwt-tooling/&lt;/a&gt;)&lt;br /&gt;Plugin per Eclipse... questo pare funzionare davvero. Dopo averlo installato, per usarlo, in Eclipse creo un nuovo progetto Web dinamico, seleziono Apache Tomcat 6 come Target Runtime, e seleziono "dinamic web project using GWT" in configuration. Poi una volta creato il progetto, lo seleziono, e con il destro "new" "other" "GWT" "Gwt module". Poi "run on server" (in realtà forse bisogna selezionare run as -&gt; open run dialog -&gt; GWTBrowser)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;MyGWT (&lt;a href="http://mygwt.net/"&gt;http://mygwt.net&lt;/a&gt;)&lt;br /&gt;Libreria con alcuni riguardi vero il pattern Model-View-Controller (MVC)&lt;/li&gt;&lt;li&gt;&lt;a href="http://angel.hurtado.googlepages.com/tutorialgwt2"&gt;GWT Small Guide&lt;/a&gt;: Integrazione GWT e PHP con JSON&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-8109053051412891610?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/8109053051412891610/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=8109053051412891610' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8109053051412891610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8109053051412891610'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/risorse-gwt.html' title='Risorse GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6605080837272721408</id><published>2008-02-15T10:07:00.003+01:00</published><updated>2008-02-15T10:22:42.137+01:00</updated><title type='text'>I 3 metodi di compilazione di GWT</title><content type='html'>Stamattina ho praticamente terminato la "lettura" del libro "&lt;a href="http://lamiatesi-fdl.blogspot.com/2008/01/gwt-in-action.html"&gt;GWT in Action&lt;/a&gt;".&lt;br /&gt;Ho provato a spulciare qualche file js generato dalal compilazione del progetto del libro, Dashboard... illeggibile. Questo è normale, perchè il compilatore di GWT, in maniera standard, genera del codice supercompresso, illeggibile in pratica dall'uomo.&lt;br /&gt;Esistono tre stili di compilazione, dal più compresso al più verboso. Ho provato a controllare la grandezza dei file generati, e la differenza è impressionante.&lt;br /&gt;&lt;br /&gt;La scelta del tipo di compilazione la si fa con il parametro &lt;span style="font-style: italic;"&gt;-style&lt;/span&gt; dato in pasto al compilatore. Questo lo si fa normalmente modificando il file nomeprogetto-shell.cmd, con questi parametri &lt;span style="font-style: italic;"&gt;OBFUSCATED, PRETTY e DETAILED&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ho compilato il progetto contenuto nel libro, GWT in Action, scaricabile anche dal forum/sito del libro (&lt;a href="http://www.manning.com/hanson/"&gt;http://www.manning.com/hanson/&lt;/a&gt;), e questo è il risultato.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;-style OBFUSCATED (dovrebbe valere anche OBF): occupazione cartella www = 10,4 MB&lt;br /&gt;codice illeggibile, adatto per la compilazione finale, per la messa online del lavoro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;-style PRETTY : occupazione cartella www = 24,8 MB&lt;br /&gt;codice leggibile, ma con alcuni nomi compressi e codice non troppo lineare&lt;/li&gt;&lt;li&gt;-style DETAILED: occupazione cartella www = 61,2 MB&lt;br /&gt;codice leggibile, esteso, più lineare e descrittivo&lt;/li&gt;&lt;/ul&gt;La differenza di occupazione di memoria è impressionante, (compressione all'83%... il file generati da obfuscated pesano il 17% rispetto ai file generati da detailed). Ed essembito in ambito web, o comunque di passaggio file attraverso una rete, questa differenza è enorme in termini prestazionali.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6605080837272721408?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6605080837272721408/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6605080837272721408' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6605080837272721408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6605080837272721408'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/i-3-metodi-di-compilazione-di-gwt.html' title='I 3 metodi di compilazione di GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-139045203323636601</id><published>2008-02-07T09:56:00.000+01:00</published><updated>2008-02-07T10:46:16.297+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Convenzioni sui nomi in Java</title><content type='html'>Dal sito di Java (&lt;a href="http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html"&gt;http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html&lt;/a&gt;) presento qui le convenzioni per la rappresentazioni dei nomi in un progetto Java.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Package&lt;/span&gt;: impotante utilizzare le convenzioni per evitare conflitti sui nomi, soprattutto nel caso di utilizzo di package importati da terze fonti.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I nomi dei package vanno scritti tutti in minuscolo.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Se si appartiene/lavora per una compagnia che ha un dominio internet, lo si usa all'inizio del nome del package, prima il "suffisso" del nome a dominio (il dominio di primo livello) poi il dominio effettivo della compagnia (il dominio di secondo livello). Nel casa dei package della Sun si ha "&lt;span style="font-style: italic;"&gt;com.sun&lt;/span&gt;".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Se il nome a dominio contiene caratteri speciali non usabili nel nome del package, bisogna convertirli in underscore (per esempio se il nome a dominio è una keyword o se il nome inizia con un numero.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Se si vuole indicare un sottodominio, lo si può fare, sempre con la logica di scrivere il nome a dominio in maniera inversa, cioè primolivello.secondolivello.sottodominio&lt;/li&gt;&lt;li&gt;Si può specificare anche il nome dle progetto o della persona che ha sviluppato il package, sempre con la logica di inserirlo in fondo al nome del package.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Esempi validi sono, per esempio&lt;br /&gt;com.java&lt;br /&gt;com.apple.quicktime.v2&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Classi e interfacce&lt;/span&gt;: Anche in questo caso è buona norma rispettare le seguenti convenzioni&lt;br /&gt;&lt;ul&gt;&lt;li&gt;i nomi dovrebbero rappresentare sostantivi o frasi descrittive non eccessivamente lunghe&lt;/li&gt;&lt;li&gt;La prima lettera deve essere maiuscola, le altre minuscolo.&lt;/li&gt;&lt;li&gt;Se il nome è composto da più parole, vanno scritte attaccate, con la prima lettera di ognuna in maiuscolo&lt;/li&gt;&lt;li&gt;Il nome dovrebbe essere descrittivo della classe, avere un senso, una connessione al significato semantico della classe stessa&lt;/li&gt;&lt;li&gt;Sono da evitare i verbi, riservati ai metodi&lt;/li&gt;&lt;li&gt;Esempi di nomi corretti per classi ed interfacce sono:&lt;br /&gt;ClassLoader&lt;code&gt;&lt;/code&gt;&lt;br /&gt;SecurityManager&lt;br /&gt;&lt;code&gt;&lt;/code&gt;Thread&lt;code&gt;&lt;br /&gt;Dictionary&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Metodi&lt;/span&gt;: utile anche in questo caso rispettare le convenzioni&lt;br /&gt;&lt;ul&gt;&lt;li&gt;il nome di un metodo dovrebbe essere costituito da un vervo che spieghi l'azione del metodo stesso, scritto in minuscolo.&lt;/li&gt;&lt;li&gt;Se si vuole usare più di una parola, contenenti comunque in verbo, la prima parola deve essere minuscola e le altre avere la prima lettera maiuscola.&lt;/li&gt;&lt;li&gt;Metodi che leggono e settano una variabile, dovrebbero indicare come prima parola, rispettivamente, &lt;span style="font-style: italic;"&gt;get&lt;/span&gt; e&lt;span style="font-style: italic;"&gt; set&lt;/span&gt;, seguita dal nome di variabile interessata&lt;/li&gt;&lt;li&gt;Metodi che servono per ricavare la lunghezza di un oggetto dovrebbero chiamarsi &lt;span style="font-style: italic;"&gt;lenght&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Metodi che verificano una variabile booleana dovrebbero chiamarsi &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; seguita dal nome di variabile da verificare&lt;/li&gt;&lt;li&gt;Nomi corretti di metodi sono&lt;br /&gt;&lt;code&gt;get&lt;/code&gt;V&lt;br /&gt;&lt;code&gt;set&lt;/code&gt;V&lt;br /&gt;&lt;code&gt;is&lt;/code&gt;V&lt;br /&gt;toV&lt;br /&gt;sommaCostanti&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fields&lt;/span&gt; (non so bene cosa siano)&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Names of fields that are not &lt;code&gt;final&lt;/code&gt; should be in mixed case with a lowercase first letter and the first letters of subsequent words capitalized. &lt;/li&gt;&lt;li&gt;Note that well-designed classes have very few &lt;code&gt;public&lt;/code&gt; or &lt;code&gt;protected&lt;/code&gt; fields, except for fields that are constants (&lt;code&gt;final&lt;/code&gt; &lt;code&gt;static&lt;/code&gt; fields).&lt;a name="56830"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Fields should have names that are nouns, noun phrases, or abbreviations for nouns.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Costanti&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Le costanti dovrebbero essere rappresentate da parole o frasi descrittive e/o abbreviazioni, scritte in maiuscolo, divise, se più parola, da un underscore.&lt;/li&gt;&lt;li&gt;Corretti nomi di costanti sono:&lt;br /&gt;&lt;code&gt;MIN_VALUE&lt;/code&gt;&lt;br /&gt;&lt;code&gt;MAX_VALUE&lt;/code&gt;&lt;br /&gt;PS_RUNNING&lt;br /&gt;S_SUSPENDED&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Varibili locali e Parametri&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dovrebbero essere costituite da parole corte, o assemblamenti di lettere, sempre in minuscole, che non necessariamente formano una parola di senso compiuto&lt;/li&gt;&lt;li&gt;per esempio una variabile che contiene un riferimento all'oggetto &lt;span style="font-style: italic;"&gt;ColoredPoint &lt;/span&gt;potrebbe chiamarsi &lt;span style="font-style: italic;"&gt;cp&lt;/span&gt;&lt;/li&gt;&lt;li&gt;oppure &lt;span style="font-style: italic;"&gt;buf &lt;/span&gt;potrebbe essere un buon nome per un puntatore ad un &lt;span style="font-style: italic;"&gt;buffer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;si dovrebbero evitare variabili di uan sola lettera, escludendo i cicli dove si possono usare (come la classica &lt;span style="font-style: italic;"&gt;i&lt;/span&gt;) oppure se indicano un &lt;span style="font-style: italic;"&gt;type&lt;/span&gt;, per esempio per convenzione si usa&lt;br /&gt;&lt;ul&gt;&lt;li&gt;b for a &lt;code&gt;byte&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;c&lt;/code&gt; for a &lt;code&gt;char&lt;/code&gt; &lt;a name="12485"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;d&lt;/code&gt; for a &lt;code&gt;double&lt;/code&gt; &lt;a name="9150"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;e&lt;/code&gt; for an &lt;code&gt;Exception&lt;/code&gt; &lt;a name="12479"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;f&lt;/code&gt; for a &lt;code&gt;float&lt;/code&gt; &lt;a name="9151"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;i&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, and &lt;code&gt;k&lt;/code&gt; for integers &lt;a name="12846"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;l&lt;/code&gt; for a &lt;code&gt;long&lt;/code&gt; &lt;a name="9155"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;o&lt;/code&gt; for an &lt;code&gt;Object&lt;/code&gt; &lt;a name="12475"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;s&lt;/code&gt; for a &lt;code&gt;String&lt;/code&gt; &lt;a name="12474"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;v&lt;/code&gt; for an arbitrary value of some type&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;          &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-139045203323636601?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/139045203323636601/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=139045203323636601' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/139045203323636601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/139045203323636601'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/convenzioni-sui-nomi-in-java.html' title='Convenzioni sui nomi in Java'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1709542021766902371</id><published>2008-02-06T15:18:00.000+01:00</published><updated>2008-02-06T15:31:24.421+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Cypal Studio for GWT</title><content type='html'>Leggengo "GWT in Action" scopro, e questo è un altro punto a favore di GWT, che esistono alcuni tool per aiutare la vita dello sviluppatore GWT (sì, ok, non posso ancora definirmi uno sviluppatore GWT, manco mi posso definire sviluppatore, però è interessante).&lt;br /&gt;Tra questi un plug in di Eclipse che potrebbe tornarmi utile: &lt;span style="font-size:85%;"&gt;&lt;a href="http://www.cypal-solutions.com/studio"&gt;Cypal Studio for GWT&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;E annesso a questo trovo anche un tutorial che mi insegna ad usare questo plugin: &lt;a href="http://grprakash.googlepages.com/gwttutorialwithgooglipse"&gt;http://grprakash.googlepages.com/gwttutorialwithgooglipse&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1709542021766902371?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1709542021766902371/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1709542021766902371' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1709542021766902371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1709542021766902371'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/cypal-studio-for-gwt.html' title='Cypal Studio for GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-759262151618297880</id><published>2008-02-06T14:05:00.001+01:00</published><updated>2008-02-06T14:15:59.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rail'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Echo2'/><category scheme='http://www.blogger.com/atom/ns#' term='Cooee'/><title type='text'>Ritorno a GWT</title><content type='html'>Parlando stamane con il mio correlatore, abbiamo pensato, soprattutto vista la non entusiastamente esperienza con la scarsa presenza di documentazione su Echo2/Cooee e la scarsa attività delle community a queste connesse, di riprovare a dare uno sguardo a GWT.&lt;br /&gt;&lt;br /&gt;Questo perchè? Forse principalmente per la prima lettera di GWT... la G di Google. Dopotutto questa G da garanzie di stabilità futura, di continua manutenzione. Ma soprattutto è sinonimo di ottima documentazione, grande community e numerosi utilizzatori.&lt;br /&gt;&lt;br /&gt;Per fare un esempio, se si cercano in rete tutorial o libri su GWT in breve tempo se ne trovano una marea... su Echo2/Cooee? Poco o nulla&lt;br /&gt;&lt;br /&gt;L'idea è tornare su GWT per quanto riguarda l'aspetto client, il disegno dell'interfaccia web, e di pensare noi a qualcosa che possa interfacciarsi con questa per dialogare con il server, senza usare le RPC previste da google&lt;br /&gt;&lt;br /&gt;Nel libro "GWT in Action", nella parte in cui si parla di un confronto/integrazione con &lt;a href="http://it.wikipedia.org/wiki/Ruby_on_Rails"&gt;Ruby On Rail&lt;/a&gt; si sottolinea che è possibile intraprendere questa strada: (PAG 24 del pdf)&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;GWT is client-centric, and most of what GWT does is on the client-side of the picture. It allows you to develop and display widgets using Java and write Java handlers to trap user-triggered actions. GWT can communicate with the server, as needed, which could be driven by user interaction, or perhaps a timed event.&lt;br /&gt;GWT then allows you to compile all of the Java code to JavaScript so that the program can be run in the browser. On the server, GWT only provides a mechanism for serializing and desterilizing Java objects so that they can be received from the browser and sent back, and does not get involved in other aspects of the server.&lt;br /&gt;Instead of competition between GWT and Ruby on Rails, we find an opportunity for integration. This is in part driven by the fact that GWT provides several non-proprietary schemes for passing data between client and server. We are finding that many developers who are starting to use GWT are using non-Java technologies on the server, and are looking at GWT to provide only client-side functionality.&lt;/blockquote&gt;Credo che il discorso si possa allargare ad ogni tecnologia (o quasi) ci sia su lato server. Ora mi studio ancora un po' GWT, sperando di riuscire ad apprenderlo a  fondo in modo da concretizzare l'idea di realizzare un "interfaccia lato client con GWT e lato server con Java"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-759262151618297880?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/759262151618297880/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=759262151618297880' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/759262151618297880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/759262151618297880'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/ritorno-gwt.html' title='Ritorno a GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-5737671184976203052</id><published>2008-02-05T10:19:00.000+01:00</published><updated>2008-02-05T10:27:58.843+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cooee'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><title type='text'>Cooee e i threads</title><content type='html'>Ieri e stamane ho provato a convertire le mie prove fatte con echo2, in cooee.&lt;br /&gt;Non è un operazione molto difficile, basta cambiare, come spiegato qui &lt;a href="http://www.karora.org/wiki/display/COO/Migrating+from+Echo2"&gt;http://www.karora.org/wiki/display/COO/Migrating+from+Echo2&lt;/a&gt; , le referenze ai package di cooee.&lt;br /&gt;In realtà ho dovuto cambiare anche altre cosucce, che non so bene spiegarmi (come cambiare il tipo Boolean in boolean... non so come mai), ma alla fine tutto sembra funzionare.&lt;br /&gt;&lt;br /&gt;O quasi.&lt;br /&gt;&lt;br /&gt;Le finestre funzionano, le aperture di quelle modali anche, il passaggi di parametri non ha problemi. A Parte qualche discrepanza (in Echo 2 i selectfilds si autoselezionano, almeno graficamente, mentre in cooee no, forse è anche meglio, dato che nemmeno in echo2 si selezioanno davvero in maniera automatica), è tutto ok.&lt;br /&gt;&lt;br /&gt;Ma i threads paiono non andare, o meglio, sembra che non riescano ad aggiornare l'interfaccia utente&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Exception in thread "conta2" java.lang.IllegalStateException: Attempt to update state of application user interface outside of user interface thread.&lt;/span&gt;&lt;/blockquote&gt;non so bene cosa significhi, ho chiesto un aiuto alla community... che però non sembra così attva come mi aveva indicato Fissore: &lt;a href="http://www.karora.org/forum/thread.jspa?threadID=138&amp;amp;tstart=0"&gt;http://www.karora.org/forum/thread.jspa?threadID=138&amp;amp;tstart=0&lt;/a&gt;&lt;br /&gt;Staremo a vedere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-5737671184976203052?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/5737671184976203052/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=5737671184976203052' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5737671184976203052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5737671184976203052'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/cooee-e-i-threads.html' title='Cooee e i threads'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6646557779933656817</id><published>2008-02-04T12:13:00.000+01:00</published><updated>2008-02-04T12:25:53.452+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Echo2'/><category scheme='http://www.blogger.com/atom/ns#' term='Cooee'/><title type='text'>Federico Fissore e Cooee</title><content type='html'>La settimana scorsa, tra le poche cose fatte, ho scritto a Federico Fissore (&lt;a href="http://www.fissore.org"&gt;www.fissore.org&lt;/a&gt;), personaggio che spesso è "saltato fuori" durante le mie ricerche in internet riguardo a echo2. A quanto pare è uno degli italiani che ha sviluppato con questo fremowork.&lt;br /&gt;Gli ho scritto chiedendogli un suo parere sul futuro di Echo2... gli ho spiegato la mia situazione chiedendogli qualche consiglio.&lt;br /&gt;Prontissimo e gentilissimo mi ha risposto...&lt;br /&gt;&lt;br /&gt;Incollo qui la sua rispota... può sempre essere utile a qualcun altro:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[...]&lt;br /&gt;Dunque, se posso riassumere la tua mail, tu vuoi sapere se Echo2/3 sono&lt;br /&gt;una soluzione viabile e, se sì, dove trovare documentazione più completa&lt;br /&gt;&lt;br /&gt;Il mio parere, e mi spiace davvero tanto dirlo, è negativo: no, non mi&lt;br /&gt;fiderei troppo di Echo2, per una somma di ragioni diverse, che ti&lt;br /&gt;snocciolo perchè tu possa usarle anche in altri contesti&lt;br /&gt;&lt;br /&gt;Framework per costruire Rich Internet Applications ce ne sono tanti,&lt;br /&gt;troppi: spiccare fra gli altri è difficile.&lt;br /&gt;GWT ci riesce per due motivi&lt;br /&gt;&lt;br /&gt;   * si chiama GOOGLE web toolkit (ChiTiConosce web toolkit non avrebbe&lt;br /&gt;     avuto lo stesso successo)&lt;br /&gt;   * come dicevo nell'intervista, GWT si presta più facilmente allo&lt;br /&gt;     sviluppo di applicazioni per il grande pubblico, il che significa&lt;br /&gt;     visibilità e passaparola&lt;br /&gt;&lt;br /&gt;Tutti gli altri rimangono nelle nicchie, e lì gioca davvero il loro&lt;br /&gt;valore e la loro community.&lt;br /&gt;Sul valore di Echo2 non ho dubbi: è tecnicamente un OTTIMO strumento. Le&lt;br /&gt;API sono chiare e semplici. Si possono fare (e ho fatto) cose moolto&lt;br /&gt;interessanti con poche righe di codice. Personalmente mi sono davvero&lt;br /&gt;divertito&lt;br /&gt;Ma Echo2 è un prodotto di nicchia, gestito ahimè da un idiota, che&lt;br /&gt;&lt;br /&gt;   * non ha abbastanza soldi per sviluppare certe componenti importanti&lt;br /&gt;   * ha una community piccola, quindi in grado di sopperire alle&lt;br /&gt;     mancanze economiche con eccessiva lentezza&lt;br /&gt;   * non è molto propenso a dare accesso in scrittura ai membri anche&lt;br /&gt;     capaci della comunità, causando un rallentamento anche&lt;br /&gt;     nell'applicazioni delle patch proposte dai membri della comunità&lt;br /&gt;&lt;br /&gt;Un'alternativa è Cooee (&lt;a href="http://karora.org/"&gt;http://karora.org/&lt;/a&gt;), fork di Echo2, che promette di fare&lt;br /&gt;manutenzione evolutiva sui componenti esistenti (evitando di rompere la&lt;br /&gt;retro compatibilità come ha fatto Echo3). Anche qui, per quel poco che&lt;br /&gt;ne so, la community è piccola&lt;br /&gt;&lt;br /&gt;Quindi?&lt;br /&gt;Ho lavorato con Echo2 per un anno, sviluppandoci 2 progetti. Oggi a quel&lt;br /&gt;mio cliente propongo di passare a Cooee per non dover rifare tutto ma&lt;br /&gt;per evitare di applicare delle patch fatte in casa come invece fa oggi&lt;br /&gt;(le patch che ho sviluppato io e che sono sempre state ignorate&lt;br /&gt;dall'idiota di prima, nonostante il numero di download di chi se le&lt;br /&gt;voleva applicare a mano)&lt;br /&gt;&lt;br /&gt;Se però dovessi cominciare un lavoro nuovo, penserei ad altro&lt;br /&gt;ZK (&lt;a href="http://zkoss.org/"&gt;http://zkoss.org/&lt;/a&gt;) sembra essere un buon prodotto: è GPL, quindi non ci si può fare&lt;br /&gt;applicazioni proprietarie da redistribuire, ma continua a ricevere elogi&lt;br /&gt;e chi lo ha usato qui a Torino me ne ha parlato bene&lt;br /&gt;wingS (&lt;a href="http://wingsframework.org/"&gt;http://wingsframework.org/&lt;/a&gt;) è un altro progetto che mi attira: ha delle API molto simili a&lt;br /&gt;Swing ed è sviluppato da tedeschi (quindi si "gioca in casa")&lt;br /&gt;openlaszlo (&lt;a href="http://www.openlaszlo.org/"&gt;www.openlaszlo.org/&lt;/a&gt;): altro progetto moolto interessante per supporto e&lt;br /&gt;qualità finale del prodotto. Con la versione 4 hanno finalmente aggiunto&lt;br /&gt;un rendering DHTML invece del solo rendering Flash (che 2 anni fa me lo&lt;br /&gt;aveva fatto scartare)&lt;br /&gt;[...]&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6646557779933656817?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6646557779933656817/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6646557779933656817' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6646557779933656817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6646557779933656817'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/federico-fissore-e-cooee.html' title='Federico Fissore e Cooee'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7805989918676798202</id><published>2008-02-01T16:45:00.000+01:00</published><updated>2008-02-01T17:16:00.044+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Lo switch in Java</title><content type='html'>Un'altra delle cose scoperte la settimana scorsa, che all'inizio mi ha lasciato nel panico, perchè non capivo cosa stesse succedendo, è che Java a uno switch... che funziona solo su integer...&lt;br /&gt;Non conosco i moivi di questa scelta implementativa... che mi pare bizzarra... in un linguaggio dove puoi fare quasi tutto, questa è una limitazione non da poco&lt;br /&gt;&lt;br /&gt;E a volte è proprio utile, soprattutto ai fini delal leggibilità del codice, eseguire uno switch su delle stringhe&lt;br /&gt;&lt;br /&gt;Ok, ok, la soluzione potrebbe essere una serie di If elseif... ma ve lo immaginate un codice con una decina di elseif?&lt;br /&gt;Uno schifo.&lt;br /&gt;&lt;br /&gt;Certo, si potrebbe pure fare una mappatura "caratteri-integer", ma che barba... e poi risulterebbe meno leggibile il codice&lt;br /&gt;&lt;br /&gt;Girovagando in rete ho trovato una soluzione abbastanza buona.&lt;br /&gt;In pratica, prima di eseguire lo switch, si crea una costante Enum, elencando come contenuti enumerativi le stringhe che si vogliono usae... e poi switchare su queste&lt;br /&gt;&lt;br /&gt;Esempio, ho una variabile stringa che può assumere questi valori "carne, pesce, dolce, contorno, frutta" e voglio creare uno switch su questa variabile sringa&lt;br /&gt;Si prosegue così:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Definire una costante enum con i valori congruenti alle stringhe che si vogliono prendere in considerazione&lt;br /&gt;&lt;br /&gt;enum portate {&lt;br /&gt;carne, pesce, dolce, contorno, frutta&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Successivamente eseguire uno switch con un valueof(costanteenum). Il valueof fa una comparazione tra le stringhe e i valori di enum. Si può usare toLowerCase per un confronto non case sensitive&lt;br /&gt;&lt;br /&gt;switch (portate.valueOf(e.getActionCommand().toLowerCase())){&lt;br /&gt;           case carne:&lt;br /&gt;               bla bla&lt;br /&gt;               break;&lt;br /&gt;         &lt;br /&gt;                    [...]&lt;br /&gt;        &lt;br /&gt;           case frutta:&lt;br /&gt;               bla bla&lt;br /&gt;               break;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;L'unico problema è che così si potrebbero sollevare delle eccezioni        IllegalArgumentException or NullPointerException (penso che succeda se la stringa ha un valore che non ha corrispondenze nell'enum. Si possono gestire con un Try-catch&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;enum portate {&lt;br /&gt;&lt;br /&gt;carne, pesce, dolce, contorno, frutta;&lt;br /&gt;&lt;br /&gt;public static portate cercaportata(String stringa)&lt;br /&gt;  {&lt;br /&gt;      try {&lt;br /&gt;          return valueOf(strimga);&lt;br /&gt;      }&lt;br /&gt;      catch (Exception ex) {&lt;br /&gt;          return NOVALUE;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;switch (portate.valueOf(e.getActionCommand().toLowerCase())){&lt;br /&gt;           case carne:&lt;br /&gt;               bla bla&lt;br /&gt;               break;&lt;br /&gt;         &lt;br /&gt;                    [...]&lt;br /&gt;        &lt;br /&gt;           case frutta:&lt;br /&gt;               bla bla&lt;br /&gt;               break;&lt;br /&gt;&lt;br /&gt;          default:&lt;br /&gt;               bla bla per valori non presenti nell'enum&lt;br /&gt;       }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7805989918676798202?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7805989918676798202/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7805989918676798202' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7805989918676798202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7805989918676798202'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/lo-switch-in-java.html' title='Lo switch in Java'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4481294328359922380</id><published>2008-02-01T14:37:00.000+01:00</published><updated>2008-02-01T15:11:45.785+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><title type='text'>Thread &amp; company</title><content type='html'>Durante questa settimana non sono riuscito a fare molto.&lt;br /&gt;Ieri ho dato il mio ultimo esame... laboratorio di sistemi operativi&lt;br /&gt;Quindi un giorno di lavoro in meno, in più non sono stato nemmeno bene... insomma ho lavorato ben poco purtroppo&lt;br /&gt;&lt;br /&gt;Comunque sono riuscito ad implementare, nella mia mini-stupida applicazione i thread&lt;br /&gt;&lt;br /&gt;In pratica ho provato a vedere se si riuscivano ad usare in echo2 i thread e tutto ciò che riguarda la programmazione concorrente che Java mette a disposizione.&lt;br /&gt;&lt;br /&gt;Mi sono dedicato ai thread perchè mi sono accorto, leggendo qua e la e provando con il codice, che la classe timer di swing non è disponibile in echo2.&lt;br /&gt;&lt;br /&gt;Ma i Thread sì.&lt;br /&gt;&lt;br /&gt;Funzionano, ne ho creati due, da far partire in momenti diversi, che aggiornato ogni secondo delle etichette di testo... un thread parte attivo con l'applicazione e s ferma all'atto dell'apertura di una nuova finestra, l'altro viceversa... viene attivato con l'apertura di una nuova finestra e si adormenta alla chiusura della stessa.&lt;br /&gt;&lt;br /&gt;Attualmente ho utilizzato un busy waiting per gestire il controllo dello stato dell'applicazione, giusto per provare.&lt;br /&gt;Lo so, non è una soluzione molto corretta, ma qui non mi serviva l'efficienza.&lt;br /&gt;Ma comunque credo sarebbero comunque disponibili i monitor e gli altri sistemi di sincronizzazione di Java, senza alcun problema.&lt;br /&gt;&lt;br /&gt;Però è emersa un'altra particolarità di Echo2... che in effetti avevo letto, ma non compreso sino in fondo...&lt;br /&gt;In pratica non tutto cio che il lato server "aggiorna" viene effettivamente aggiornato lato client... la sincronizzazione avviene solo quando lato client succede qualcosa... questo per ridurre lo scambio di messaggi tra client e server per non appesantire la banda&lt;br /&gt;&lt;br /&gt;Questo cosa comporta? che per esempio le etichette dei contatori, sebbene i contatori si tengono aggiornati lato server e sono coerenti anche lato client quando vengono visualizzati, romangono FISSI fino a quanto l'utente fa qualcosa lato client... apre una finestra, clicca un pulsante, fa uno scrolling eccetera&lt;br /&gt;&lt;br /&gt;Infatti i miei contatori rimangono apparentemente fermi, ma alla prima interazione si aggiornano con i valori che piano piano si erano aggiornati via server...&lt;br /&gt;Questo potrebbe creare dei problemi, ma esiste il sistema per rimediare, modificando la parte client del framework&lt;br /&gt;&lt;br /&gt;Comunque, la disponibilità e il funzionamento dei thread, ha messo in risalto che gli eventuali problemi che potrebbero nascere dal bisogno di avere una parte del codice "bloccata" in attesa di qualche interazione, si potrebbero risolvere proprio con l'utilizzo dei thread... che di fatto si posson bloccare su delle risorse e/o condizioni varie con dei monitor o altre soluzioni simili&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4481294328359922380?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4481294328359922380/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4481294328359922380' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4481294328359922380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4481294328359922380'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/02/thread-company.html' title='Thread &amp; company'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-3132965701262666603</id><published>2008-01-25T08:50:00.000+01:00</published><updated>2008-01-25T11:38:43.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='derby'/><title type='text'>Connessione al database</title><content type='html'>Da ricordare per far funzionare la connessione a derby in un programma Java.&lt;br /&gt;In Eclipse, dopo aver fatto le istruzioni per la creazione di un progetto Echo2, devo&lt;br /&gt;&lt;ul&gt;&lt;li&gt;nel progetto, come fatto per echo2, apro l'albero, selezione Web-Content -&gt; Web-Inf -&gt; Lib e importo (come file system) il contenuto della cartella di lib della cartella di installazione di Derby&lt;br /&gt;Per me quindi: C:\Apache\db-derby-10.3.2.1-bin\lib&lt;/li&gt;&lt;li&gt;faccio partire il server derby (credo di farlo almeno) con questa riga di comando, da dare appunto nel promt dei comandi&lt;br /&gt;java -jar %DERBY_HOME%\lib\derbyrun.jar server start&lt;/li&gt;&lt;li&gt;La connessione al databse in derby deve essere quella da "client-server" quindi:&lt;br /&gt;CONNECT 'jdbc:derby://localhost:1527/NOMEDATABASE';&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Agiornamento ore 11:36&lt;br /&gt;Alla fine funziona... il collegamento al database funziona e tutto è in regola.&lt;br /&gt;La domanda ora è:&lt;br /&gt;Echo2 è quello che fa per noi?&lt;br /&gt;Sarà un progetto che da continuità?&lt;br /&gt;Echo3 introdurrà cose interessanti, tra cui (se non ho capito male) la possibilità, con apposite api, di manipolare anche il javascript lato client, ma avrà la stessa licenza? ci si può fidare?&lt;br /&gt;Spero di sì... perché sembra carino, e penso non sarà troppo difficile creare qualcosa di decente per la mia tesi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-3132965701262666603?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/3132965701262666603/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=3132965701262666603' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/3132965701262666603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/3132965701262666603'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/connessione-al-database.html' title='Connessione al database'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4117765761095869958</id><published>2008-01-24T12:02:00.000+01:00</published><updated>2008-01-24T12:23:07.442+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='derby'/><title type='text'>Database Derby</title><content type='html'>Dopo aver definito una mini applicazione, ora devo verificare se riesco ad usare java/echo2 per consultare e lavorare con un database&lt;br /&gt;&lt;br /&gt;Per il momento provo ad utilizzare Derby, un database improntato a java (e sviluppato in java, se non ho capito male), della apache foundation: &lt;a href="http://db.apache.org/derby/"&gt;http://db.apache.org/derby/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;L'installazione, che avevo già effettuato, è andata a buon termine, e anche i settaggi.&lt;br /&gt;Ho avuto qualche problema (di nuovo) con le variabili di ambiente (dal pannello di controllo sembra che non si settino a dovere, devo fare da prompt con "set")&lt;br /&gt;&lt;br /&gt;Ho eseguito il "tutorial" del file, nelle documentation "Getting Started With Derby": &lt;a href="http://db.apache.org/derby/docs/10.3/getstart/"&gt;&lt;span style="text-decoration: underline;"&gt;http://db.apache.org/derby/docs/10.3/getstart/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Imparando le basi della connessione al database sia via promt dei comandi, sia, soprattutto, da un file java&lt;br /&gt;Sembra abbastanza facile... un po' come la connessione in php a un server mysql&lt;br /&gt;La stessa guida è anche in &lt;a href="http://db.apache.org/derby/docs/10.3/getstart/getstartderby.pdf"&gt;formato pdf&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ora sto dando un occhiata alla &lt;a href="http://db.apache.org/derby/docs/dev/devguide/"&gt;guida per gli sviluppatori di applicazioni derby&lt;/a&gt;, &lt;a href="http://db.apache.org/derby/docs/dev/devguide/derbydev.pdf"&gt;qui in pdf&lt;/a&gt;&lt;br /&gt;In particolare può essere utile la &lt;a href="http://db.apache.org/derby/docs/10.3/devguide/cdevconcepts36881.html"&gt;mini guida pratica per la gestione delle connessioni&lt;/a&gt;, o quella per &lt;a href="http://db.apache.org/derby/docs/10.3/devguide/cdevconcepts41275.html"&gt;la gestione dei resultset&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sarà utile sicuramente anche tenere sottomano il &lt;a href="http://db.apache.org/derby/docs/10.3/ref/"&gt;Manual Reference&lt;/a&gt;, &lt;a href="http://db.apache.org/derby/docs/10.3/ref/refderby.pdf"&gt;anche in pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tutta la documentazione di Derby la si trova comunque qui: &lt;a href="http://db.apache.org/derby/manuals/index.html"&gt;http://db.apache.org/derby/manuals/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4117765761095869958?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4117765761095869958/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4117765761095869958' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4117765761095869958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4117765761095869958'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/database-derby.html' title='Database Derby'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7772560486044478094</id><published>2008-01-23T17:10:00.000+01:00</published><updated>2008-02-01T15:12:29.569+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Echo2'/><title type='text'>Le prime creazioni</title><content type='html'>Dopo due giorni di lavoro ho creato la prima mini applicazione...&lt;br /&gt;bhe, non merita nemmeno di essere chiamata una applicazione... diciamo che almeno sono riuscito a costruire qualcosa.&lt;br /&gt;&lt;br /&gt;Per verificare se Echo2 corrisponde alle nostre esigenze ho provato a creare una finestra di "inserimento anagrafica". Questa finestra ha dei TextField che devono essere popolati dall'utente...&lt;br /&gt;Due di queste maschere hanno un aiuto... in pratica hanno associato un tasto, ognuna, che apre una nuova finestra per svolgere qualche operazione (come la ricerca nel database) e che chiudendole restituiscano alla finestra principale i dati ricercati.&lt;br /&gt;&lt;br /&gt;Ovviamente al momento la ricerca nel database è fittizia... queste due finestre hanno una listbox prepopolata.&lt;br /&gt;&lt;br /&gt;All'atto dell'apertura di una delel due nuove finestre, tutto il resto è bloccato. Infatti queste due finestre sono create modali... in pratica sì può solo interagire con questa, non si può fare nulla con le altre.&lt;br /&gt;Tutte le finestre sono Drag&amp;amp;Drop.&lt;br /&gt;Così si può spostare questa seconda finestra per vedere la sottostante, che però è inattiva.&lt;br /&gt;Queste seconde finestre sono rese "non chiudibili" in modo che non abbiano la classica  icona di chiusura.&lt;br /&gt;Entrambe le finestre di aiuto hanno una list box, e due tasti... un cancel (per chiudere la finestra modale senza apportare modifiche alla finestra sottostante) e una ok, per trasferire i dati del campo selezionato alla finestra sottostante.&lt;br /&gt;&lt;br /&gt;E funzionano!&lt;br /&gt;Come volevo io...&lt;br /&gt;&lt;br /&gt;Non sono bloccanti, non nel senso che Francesco pensava... non si può, nel mezzo del codice, creare un istruzione del tipo&lt;br /&gt;int cap = aprimi_finestra();&lt;br /&gt;dove si interromperebbe qui l'esecuzione, si richiama la procedura aprimi_finestra e si aspetta la sua risposta...&lt;br /&gt;questo non si può fare&lt;br /&gt;&lt;br /&gt;ma in pratica essendo, essendo al gestione del programma a "stati", non comporta alcun problema, almeno dal mio punto di vista&lt;br /&gt;&lt;br /&gt;Ho una finestra e ho uno stato&lt;br /&gt;apro un'altra finestra e ho un altro stato&lt;br /&gt;alla chiusura di quest'ultima aggiorno lo stato della prima&lt;br /&gt;&lt;br /&gt;e così via&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7772560486044478094?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7772560486044478094/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7772560486044478094' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7772560486044478094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7772560486044478094'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/le-prime-creazioni.html' title='Le prime creazioni'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-2731155985453857983</id><published>2008-01-22T16:48:00.000+01:00</published><updated>2008-02-06T14:02:51.594+01:00</updated><title type='text'>WindowPane</title><content type='html'>Dove Pane va letto come "pain" quindi, sofferenza&lt;br /&gt;Sì, sofferenza... qualcosa come 6 ore a faticare per far funzionare questo componente di Echo... sono le finestre Drag &amp;amp; Drop.&lt;br /&gt;Dagli errori più stupidi, derivati dalla mia scarsa conoscenza di Java (della serie che cercavo di usare degli oggetti non istanziati), a quelli che derivano dalla mia scarsa conoscenza di Eclipse (chi lo sapeva che bisogna sempre uccidere, o almeno svuotare la path, del processo del server che sta andando? Altrimenti sembra non "compilare" il codice nuovo, ma utilizzare quello vecchio... quindi selezionare il server in basso, nella finestra server, tasto destro sul processo in esecuzione e o lo si elimina oppure si svuota la directory di lavoro del modulo)&lt;br /&gt;&lt;br /&gt;Bhe, alla fine ce lho fatta&lt;br /&gt;&lt;br /&gt;Ora ho una finestra Drag&amp;amp;Drop, con dentro un po' di etichette (Label) textfield, e un bottone... che premendolo fa cambiare titolo alla finestra stessa, ma soprattutto ne ape un altra.&lt;br /&gt;&lt;br /&gt;E non è poco :-D&lt;br /&gt;&lt;br /&gt;Ora devo provare a fare diventare la nuova finestra modale, in modo che renda inutilizzabile la finestra "madre", e provare a far dialogare le due finestre...&lt;br /&gt;Vedremo se riuscirò.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-2731155985453857983?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/2731155985453857983/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=2731155985453857983' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2731155985453857983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/2731155985453857983'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/windovepane.html' title='WindowPane'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-4151125033578904232</id><published>2008-01-18T10:35:00.000+01:00</published><updated>2008-01-18T17:35:22.474+01:00</updated><title type='text'>Echo2, possibile "soluzione"</title><content type='html'>Parlando con Francesco Echo2 potrebbe essere il framework a cui ci dedicheremo. Dopo qualche minuto di panico sulla licenza (sul sito non si capiva bene che licenza avesse), abbiamo scoperto che è sotto la Mozilla Public Licenze (MPL) e quindi si possono sviluppare con questo framework anche applicazioni "propietarie".&lt;br /&gt;&lt;br /&gt;Ora il discorso principale è capire se Echo2 ha il "difetto" di GWT: non essere bloccante.&lt;br /&gt;&lt;br /&gt;E' una cosa che ho fatto un po' fatica a capire anche io, non tanto capire la cosa in se, ma capire i problemi ad esso correlati. In pratica noi avremmo l'esigenza che l'applicazione creata possa essere "bloccata" nel momento in cui si richiede l'interazione con l'utente.&lt;br /&gt;&lt;br /&gt;Tipicamente con le applicazioni AJAX, questo non si può fare (non per nulla la A di Ajax sta per asincrono).&lt;br /&gt;&lt;br /&gt;Quale è il problema:&lt;br /&gt;Se siamo in una maschera e l'utete clicca un pulsante per un "cerca", noi vorremmo che tutto nell'applicazione si blocchi in attesa della risposta... ma co al logica dell'essere asincrono no è così... il resto dell'applicazione se ne va avanti indipendentemente da cosa fa l'utente con la nuova finestra.&lt;br /&gt;Anche con GWT esiste la possibilità di inserimento di una finestra modale, come quelle di avviso (classico segnale di errore con il tasto ok) e un'altra alert modale (con  tasti ok e cancel) e queste bloccano di fatto l'applicazione, ma non si può fare nulla di più di una finestrella con due tasti.&lt;br /&gt;&lt;br /&gt;Con Echo si potrà avere una logica bloccante? Nella documentazione letta al volo si parla di finestre modali, e questo "modale" può significare bloccante&lt;br /&gt;&lt;br /&gt;Staremo a vedere&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aggiornameno alle ore 11:33&lt;/span&gt;&lt;br /&gt;Dal sito di Echo2 (&lt;a href="http://echo.nextapp.com/site/"&gt;http://echo.nextapp.com/site/&lt;/a&gt;) non capisco bene come procedere per capire le basi dello sviluppo con questa applicazione.&lt;br /&gt;Fortunatamente nel wiki trovo un link che pare interessante:&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;&lt;a href="http://www.pathf.com/echo2/Echo2-Part1.pdf"&gt;www.pathf.com/echo2/Echo2-Part1.pdf&lt;/a&gt;&lt;br /&gt;Pare che spieghi come integrare echo e eclipse, cosa installare, come iniziare&lt;br /&gt;Quello che fa per me&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aggiornamento alle ore 15:35&lt;/span&gt;&lt;br /&gt;Mannaggia, più di 3 ore su ste cavolo di tutorial, semplicissimo, ma non andava&lt;br /&gt;dopo un po' di incavolatura (prima c'era un altro server sulla porta 8080, trovato come chiuderlo, dava ancora problemi, un errore 505) ho trovato con google (potere google) la soluzione&lt;br /&gt;in pratica nel tutorial c'era un piccolo errore, nel file web.xml la riga&lt;br /&gt;&lt;servlet-class&gt;AjaxSample.servlet.AjaxSampleServlet&lt;/servlet-class&gt;&lt;br /&gt;è errata e va sotituta con&lt;br /&gt;&lt;servlet-class&gt;ajaxsample.servlet.AjaxSampleServlet&lt;/servlet-class&gt;&lt;br /&gt;&lt;br /&gt;argh... problemi di case sensitive..&lt;br /&gt;cmq ora va&lt;br /&gt;&lt;br /&gt;ma ovviamente non era abbastanza, troppo breve come tutorial&lt;br /&gt;trovo il blog dell'autore... che non hai mai fatto la parte numero 2 di quel tutorial, comunque eccola: http://blogs.pathf.com/agileajax/echo2/index.html&lt;br /&gt;e anche queste due pagine sembrano interessanti: http://ensode.net/echo2_review.html&lt;br /&gt;http://ensode.net/echo2_closer_look.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aggiornamento delle 17:02&lt;/span&gt;&lt;br /&gt;Ancora un ora persa per cercare di far partire uno dei tutorial "ufficiali", in number guess&lt;br /&gt;non mi andava... continuavano ad esserci errori&lt;br /&gt;metto qui i passaggi così se in futuro devo usare altri source simili so cosa fare&lt;br /&gt;&lt;ul&gt;&lt;li&gt;in eclipse creo un nuovo progetto, New (dall'icona, non dal menu), Web, Dinamic web project. Scelto tomcat come server&lt;/li&gt;&lt;li&gt;in base alla logica dei package che trovo nei file "java" del source che voglio usare, creo in eclipse i relativi package e ci sbatto dentro i file source java... ovviamente rispettando la logica dei package&lt;/li&gt;&lt;li&gt;in eclipse, cerco la cartella webcontent-&gt;Web-Inf-&gt;Lib; clicco con il destro e poi "import". Scelto File System. Cerco in "browse" la cartella di installazione di echo due, poi la sottocartella binary libraries. Nel mio caso "C:\Programmi\NextApp_Echo2\BinaryLibraries". Scelgo quindi questi jar: Echo2_App.jar, Echo2_WebContainer.jar, Echo2_WebRenderer.jar e&lt;br /&gt;EchopointNG.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;nella cartella "WebContent" creo un file "index.html" così composto&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;&amp;lt;!DOCTYPE&lt;br /&gt;HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html;&lt;br /&gt;charset=UTF-8"&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Refresh" Content="0; URL=app"&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;Redirecting to application.&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;nella cartella Web-Inf dentro WebContent modifico il file "Web.xml" fino a renderlo simile a questo&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;&amp;lt;?xml&lt;br /&gt;version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee&lt;br /&gt;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID"&lt;br /&gt;version="2.5"&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;display-name&amp;gt;provaecho2&amp;lt;/display-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;NumberGuessServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;echo2tutorial.numberguess.NumberGuessServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;NumberGuessServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/app&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;index.htm&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;default.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;default.htm&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;default.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;importanti queste due righe&lt;br /&gt;&lt;servlet-name&gt;NumberGuessServlet&lt;/servlet-name&gt;&lt;br /&gt;&lt;servlet-class&gt;echo2tutorial.numberguess.NumberGuessServlet&lt;/servlet-class&gt;&lt;br /&gt;Che devono avere il nome e la struttura dei package del servlet creati (cioè il file source java che si chiama "nomeapplicazione.Servlet.java")&lt;/li&gt;&lt;li&gt;Fatto tutto questo dovrebbe essere pronta per "partire"&lt;br /&gt;Seleziono con il destro il progetto in eclipse, seleziono "RunAs" e "Ron On Server", seleziono il server tomcat e tutto dovrebbe partire&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-4151125033578904232?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/4151125033578904232/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=4151125033578904232' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4151125033578904232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/4151125033578904232'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/echo2-possibile-soluzione.html' title='Echo2, possibile &quot;soluzione&quot;'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-8363060464917333170</id><published>2008-01-15T19:59:00.007+01:00</published><updated>2008-12-11T21:06:28.206+01:00</updated><title type='text'>GWT In Action</title><content type='html'>&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988231&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;Nel week end sono riuscito a procurarmi una copia del libro che avevo presentato, GWT In Action.&lt;br /&gt;Userò questo post per segnarmi gli appunti presi da questo libro che potranno servirmi in futuro.&lt;br /&gt;Per prima cosa, bisogna modificare qualche cosettina nel codice scaricato dal sito (&lt;a href="http://www.manning.com/hanson/"&gt;http://www.manning.com/hanson/&lt;/a&gt;), oltre ovviamente quello indicato nel file install.txt&lt;br /&gt;Leggendo sul forum del libro&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Now GWT 1.4 is out and final, there are a couple of changes required for the Dashboard download code; until we get chance to replace the downloadable version, here are the changes that are needed:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;1) In ToolBarImageBundle.java replace the "import com.google.gwt.user.client.ImageBundle;" with "import com.google.gwt.user.client.ui.ImageBundle;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;2)  In Dashboard.java, remove "import com.google.gwt.i18n.client.DateRecord;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For me, at least, that seems the only changes needed to make the Dashboard work with the full 1.4 release. Feel free to post other issues you find below and we'll see if we can identify fixes if needed.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;GWT accetta solo codice scritto in Java 1.4 (al momento). Per i componenti server invece si uò usare la versione che si vuole. PAG 7&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ci sono 3 metodi di compilazione: obfuscate (che genera codice praticamente illeggibile, ma compresso), "pretty" (che genera codice intermedio), "detailed" (che genera codice leggibile e non compresso). PAG 6&lt;/li&gt;&lt;li&gt;JSON è un formato di messaggi per scambiare dati srutturati con il browser. Sul sito http://json.org esistono i formati per molti linguaggi. In questo modo si può integrare un qualsiasi linguaggio sul server e si può dialogare senza problemi, tramite il browser, con GWT. Si usa, per esempio, quando si gestiscono le RPC con il metodo RequestBuilder. Se sul server si usa Java, non ha molto senso usare JSON, perchè si tradurrebbe da Java a JSON e poi da JSON a Java... quindi è meglio usare direttamente GWT-RPC. PAG 15 e JSON a capitolo 12&lt;/li&gt;&lt;li&gt;I widget di GWT hanno delle classi css già assegnata... quindi se si vuole si possono usare direttamente quelle nei css legati alla pagina web (ai file gwt tramite l'xml di configurazione). Per sapere quali classi ci sono per ogni widget cercare nei java docs di gwt&lt;/li&gt;&lt;li&gt;la gerarchia dei widget:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hsdxMBCxxj0/R43WM-8zR0I/AAAAAAAABUs/Nj2j9kmTpIA/s1600-h/gerarchia_widget_gwt.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_hsdxMBCxxj0/R43WM-8zR0I/AAAAAAAABUs/Nj2j9kmTpIA/s400/gerarchia_widget_gwt.jpg" alt="" id="BLOGGER_PHOTO_ID_5156012666953877314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E la loro suddivisione in categorie:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hsdxMBCxxj0/R43bSu8zR1I/AAAAAAAABU8/AdUFRV7gZmc/s1600-h/suddivisione_widgets_gwt.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_hsdxMBCxxj0/R43bSu8zR1I/AAAAAAAABU8/AdUFRV7gZmc/s400/suddivisione_widgets_gwt.jpg" alt="" id="BLOGGER_PHOTO_ID_5156018263296264018" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;I nomi dei package in gwt dovrebbero rispettare il classico nome dei package e le classi (come quelle usate nella creazione con applicationCreator) dovrebbero avere il nome del package, obbligatoriamente la parola client, e il none della classe.&lt;br /&gt;Ad esempio org.gwtbook.client.Dashboard&lt;br /&gt;&lt;br /&gt;Facendo un salto in avanti&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Serializzazione di oggetti:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si serializzano solo i campi non transient. Anche i campi definiti final non vengono serializzati, ma è meglio sempre dichiararli transient per chiarezza.&lt;/li&gt;&lt;li&gt;Se una classe implementa com.google.gwt.user.client.rpc.IsSerializable, anche le sottoclassi, anche se non la implementano specificatamente, sono serializzabili.&lt;/li&gt;&lt;li&gt;Ai fini di ottimizzare il codice javascript creato da GWT è sempre meglio specificare i tipi delle variabili. Perchè con oggetti poco tipizzati come ArrayList, Vector, HashSet ecc... il compilatore, non sapendo il tipo della variabile, genera codice javascript molto più grosso. GWT ci permette però di specificare il tipo di queste variabili con annotazioni commentate, in questo modo, per esempio&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt;* @gwt.typeArgs &amp;lt;java.lang.String&amp;gt;&lt;br /&gt;*/&lt;br /&gt;private ArrayList listOfNames;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Servizi RPC&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Anche in questo caso è sempre meglio definire bene i tipi delle variabili, dei parametri eccetera usati dai metodi sei servizi RPC&lt;br /&gt;&lt;pre&gt;/**&lt;br /&gt;* @gwt.typeArgs arg1 &amp;lt;java.lang.Integer&amp;gt;&lt;br /&gt;* @gwt.typeArgs arg2 &amp;lt;java.util.Date&amp;gt;&lt;br /&gt;* @gwt.typeArgs &amp;lt;java.lang.String&amp;gt;&lt;br /&gt;*/&lt;br /&gt;ArrayList operationThree (List arg1, Vector arg2);&lt;br /&gt;&lt;/pre&gt;in questo modo si è specificato il tipo dei due parametri e il tipo del parametro di risposta (il terzo)&lt;/li&gt;&lt;li&gt;Se si vogliono sollevare eccezioni, anche l'eccezione deve essere serializzabile&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Quando si utilizzano gli array JSON, bisogna stare attenti, non essendoci il metodo add, ma dovendo inserire ogni elemento nell'array specificandone l'indice, poichè si potrebbe avere un array con dei "buchi", cioè senza valore per alcuni degli indici interni. Questo potrebbe portare a delle eccezioni nel codice, per esempio se si richiama il metodo toString() sull'array "bucato". Per risolvere questo problema si potrebbe usare questo codice per "riempire potenziali buchi" negli array&lt;br /&gt;&lt;pre&gt;private void fixJsonArray(JSONArray array){&lt;br /&gt;    for (int i = 0; i &lt; array.size(); i++) {&lt;br /&gt;        JSONValue val = array.get(i);&lt;br /&gt;        if (val == null) {&lt;br /&gt;            array.set(i, JSONNull.getInstance());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-8363060464917333170?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/8363060464917333170/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=8363060464917333170' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8363060464917333170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8363060464917333170'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/gwt-in-action.html' title='GWT In Action'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hsdxMBCxxj0/R43WM-8zR0I/AAAAAAAABUs/Nj2j9kmTpIA/s72-c/gerarchia_widget_gwt.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6223428798065037834</id><published>2008-01-15T11:12:00.000+01:00</published><updated>2008-01-16T09:50:21.431+01:00</updated><title type='text'>Echo2</title><content type='html'>Durante lo studio del libro GWT in action, sono arivato a pagina 22 del libro, dove si parla del confronto di GWT con altri framework... tra cui questo "echo2". Leggendo le parole del libro e questa intervista &lt;a href="http://www.javajournal.it/blog/2007/01/15/intervista_federico_fissore_su_echo2.html"&gt;www.javajournal.it/blog/2007/01/15/intervista_federico_fissore_su_echo2.html&lt;/a&gt; in effetti sembrerebbe che questo framework sia proprio sulla strada di quello che vorremmo realizzare qui alla fdl. Ne parlerò con Francesco.&lt;br /&gt;&lt;br /&gt;Altra pagina interessante, che mi porta sempre più al pensiero che echo 2 faccia per noi: &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=40804"&gt;www.theserverside.com/news/thread.tss?thread_id=40804&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Continuo comunque nello studio del libro GWT in action&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6223428798065037834?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6223428798065037834/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6223428798065037834' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6223428798065037834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6223428798065037834'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/echo2.html' title='Echo2'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-7924253741301558749</id><published>2008-01-10T23:43:00.000+01:00</published><updated>2008-01-16T09:49:09.579+01:00</updated><title type='text'>Dentro GWT</title><content type='html'>Oggi termino i tutorial iniziati ieri... me li studio meglio&lt;br /&gt;In mattinata riprendo i primi due e finisco il terzo.&lt;br /&gt;Trovo in rete, studiando questi, alcune risorse interessanti:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/documentation/jre.html"&gt;JRE Emulation Galery&lt;/a&gt; se non ho capito male si tratta di un elenco di tutte le classi, metodì eccetera, accettati da GWT. Sempre se non ho capito male, in pratica, queste sono le cose che posso senza problemi usare come in Java... e GWT le capisce e interpreta (e traduce) correttamente.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.asquare.net/gwt/javadoc/latest/index.html"&gt;GWT Javadocs&lt;/a&gt; (&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.4/index.html"&gt;&lt;strong&gt; o ancora meglio direttamente nella pagine di google&lt;/strong&gt;&lt;/a&gt;) (verificare se le due pagine contengono info diverse... da preferire quelle di google), un elenco di tutto lo scibile di GWT... ci sono tutte le classi che posso usare in gwt, comprese quelle "proprietarie" di gwt... serve più che altro per capire cosa fa una classe se la si incontra nei tutorial... ha un completo "index", si trova di tutto insomma&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://examples.roughian.com/#Home"&gt;Roughian Examples&lt;/a&gt;: sono un po' di tutorial e spiegaziono sulle classi di gwt... l'intera sezione è fatta, pare, con gwt&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;In tarda mattinata, giusto prima di pausa pranzo, mi addentro a capire come funziona il lato server di GWT... in pratica usa delle RPC (remote procedure call) per dialogare con il server&lt;br /&gt;sul&lt;a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.html"&gt; sito di google code&lt;/a&gt; c'è l'introduzione alle rpc... devo ammettere che non è che ci capisco molto&lt;br /&gt;&lt;br /&gt;trovo alcune pagine che ne parlano, le elenco qui, in futuro le riprenderò&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/pub/articles/dubois-gwt.html"&gt;http://www.oracle.com/technology/pub/articles/dubois-gwt.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nel frattempo trovo un altro tutorial carino di GWT, me lo studio e lo esamino, carino. Tra le altre cose introduce il concetto di focus panel, che prima non avevo nemmeno capito esistesse... e usa delel tecniche particolari per le animazioni&lt;br /&gt;&lt;a href="http://blogs.pathf.com/agileajax/2006/06/another_gwt_tut.html"&gt;Agile Ajax: another GWT Tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;alla fine mi sa che devo studiarmelo seriamente GWT... avendo basi super traballanti per Java (ma anche, se non soprattutto, per concetti come quello del RPC) devo prendermi un libro&lt;br /&gt;ne esiste uno su GWT... proverò a cercarlo come pdf per poi eventualmente comprarlo&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=michjackfans-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1933988231&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-7924253741301558749?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/7924253741301558749/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=7924253741301558749' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7924253741301558749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/7924253741301558749'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/dentro-gwt.html' title='Dentro GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-8308164305090288100</id><published>2008-01-10T02:30:00.000+01:00</published><updated>2008-01-10T15:24:00.681+01:00</updated><title type='text'>Google Web ToolKit - GWT</title><content type='html'>Ed ecco che oggi inizio a guardarmi GWT (&lt;a href="http://code.google.com/webtoolkit/"&gt;http://code.google.com/webtoolkit/).&lt;/a&gt;&lt;br /&gt;In pratica son una serie di librerie di Java che permettono di programmare in Java per poi produrre del codice Javascript al fine di creare applicazioni in AJAX.&lt;br /&gt;Sostanzialmente ci si scorpora dall'obbligo di conoscere a menadito Javascript, ma soprattutto, di evitare di addentrarsi nei problemi di compatibilità dei broweser... fa tutto  l'interprete di GWT.&lt;br /&gt;&lt;br /&gt;Leggendo la documentazione sul sito di google code, scopro che l'IDE da preferirsi per lo sviluppo di applicazioni con GWT è l'open source &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;. Infatti uno degli eseguibili di GWT può, volendo, creare dei file per usare al meglio questo IDE.&lt;br /&gt;&lt;br /&gt;Installare GWT è semplice... poche istruzioni da seguire.&lt;br /&gt;Per iniziare i progetti con eclipse basta dare dei parametri in più all'eseguibile "crea progetto" di gwt.&lt;br /&gt;Creo la mia cartella di progetto, che chiamamo "GWT_Esempio", dal promt dei comandi (CMD) entro in questa cartella&lt;br /&gt;eseguo poi il creatore di progetto passandogli come parametri il fatto che voglio creare un progetto eclipse che si chiama GWT_Esempio (come la cartella che ho creato) con questa riga di codice:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;c:\Programmi\gwt-windows-1.4.61\projectCreator -eclipse  GWT_Esempio&lt;br /&gt;&lt;/span&gt;per poi fare uan cosa simile con il creatore di applicazioni&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;c:\Programmi\gwt-windows-1.4.61\applicationCreator -eclipse  GWT_Esempio GWT_Moonwalk.client.GWT_Esempio&lt;br /&gt;&lt;/span&gt;Così facendo creo i file principali che serviranno per compilare con GWT ed eseguire l'applicazione in maniera HOSTED MODE&lt;br /&gt;Ma ancora meglio così si crea la situazione ideale per programmare in eclipse... posso semplicemente accedere in eclipse, cliccare file, import, import existing project, seleziono la cartella ed ecco il progetto importato... con tutto pronto per eseguire il tutto direttamente in eclipse, con la possibilità di fare il debugging&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Prima disperazione:&lt;br /&gt;Sembrano non esistere tutorial ufficiali di gwt... il sito di google code ha un sacco di materiale su gwt, ma pare più che altro adatto a chi conosce bene Java... e non chi l'ha iniziata a studiare meno di un mese fa&lt;br /&gt;Cerco in rete dei tutorial... ne trovo alcuni per il classico "Hello World" che non mi insegnano molto, dato che sono quasi identici a Java puro... ma almeno prendo un minimo di pratica con Eclipse&lt;br /&gt;&lt;br /&gt;Trovo un tutorial &lt;a href="http://www.onjava.com/pub/a/onjava/2006/05/31/working-with-google-web-toolkit.html?page=1"&gt;Working with GWT&lt;/a&gt;, decente, inizio a capire qualcosa... ma non è spiegato molto bene e vado subito in confusione&lt;br /&gt;&lt;br /&gt;Ne trovo un altro, sul sito della ibm: &lt;a href="http://www.ibm.com/developerworks/library/os-ad-gwt1/"&gt;Build an Ajax application using Google Web Toolkit, Apache Derby, and Eclipse&lt;/a&gt; sembra promettere bene&lt;br /&gt;Mi installo quindi Derby, che se non erro è un database sviluppato e pensato per Java&lt;br /&gt;Perdo tutta la mattinata e il primo pomeriggio ad installarlo... ho un conflitto con due versioni di java presenti sul portatile che ho in dotazione, un maledetteo&lt;br /&gt;java.lang.UnsupportedClassVersionError&lt;br /&gt;In pratica, navigando in rete, scopro che è un conflitto tra due versioni di java che ho sul pc... ho meglio... io ne uso normalmente una (qualcosa come 1.6.x), questo derby richiede una 1.4.x ma sul pc, da qualche parte, ho una 1.3.x che continua a prendere il sopravvento&lt;br /&gt;&lt;br /&gt;impazzisco... cerco le variabili di sistema, sembra tutto ok... mamma mia aiuto cosa è&lt;br /&gt;disinstallo java, reinstallo... ma nulla&lt;br /&gt;dopo un po' scopro che sul pc è stato installato (prima che io lo toccassi) Oracle... e oracle ha un jdk 1.3.x&lt;br /&gt;impazzendo un po' trovo la variabile di sistema installata da oracle. Ed ecco lì la stronza... c'era un "Path" settato da lui... e quindi il mio pc cercava prima lì dentro il java.exe&lt;br /&gt;metto prima di questa variabile un altra path specificando la nuova directory di isntallazione&lt;br /&gt;riavvio e....&lt;br /&gt;&lt;br /&gt;funziona&lt;br /&gt;derby installato... ma... alla fine mi accorgo che il tutorial non fa per me&lt;br /&gt;(l'intero tutorial, che riprenderò in seguito, si trova: &lt;a href="http://www.ibm.com/developerworks/opensource/library/os-ad-gwt1/"&gt;parte 1&lt;/a&gt; | &lt;a href="http://www.ibm.com/developerworks/opensource/library/os-ad-gwt2/"&gt;parte 2&lt;/a&gt; | &lt;a href="http://www.ibm.com/developerworks/web/library/os-ad-gwt3/index.html?S_TACT=105AGX08&amp;amp;S_CMP=EDU"&gt;parte 3&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nel pomeriggio trovo un tutorial con qualche esempio un minimo complesso... e qui inizio a capire come funziona davvero GWT: &lt;a href="http://today.java.net/pub/a/today/2006/06/27/client-side-google-web-toolkit.html"&gt;KickStartin GWT on clint side&lt;/a&gt;&lt;br /&gt;Ci sono 3 demo, con un minimo di complessità&lt;br /&gt;riesco a vedere le prime due...a  modificarle un po', a capire come funzionano i Panel e I widgets (tutto funziona in pannelli a quanto pare, simili a quelli di Swing, ma ovviamente con nomi e proprietà diversi)&lt;br /&gt;&lt;h1 style="font-weight: normal;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h1&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-8308164305090288100?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/8308164305090288100/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=8308164305090288100' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8308164305090288100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8308164305090288100'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/google-web-toolkit-gwt.html' title='Google Web ToolKit - GWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-5873512811058581416</id><published>2008-01-09T02:30:00.000+01:00</published><updated>2008-01-10T14:11:57.048+01:00</updated><title type='text'>Swing e AWT</title><content type='html'>Con oggi ho terminato di "studiare" la parte principale del secondo libro di java che mi sono posto di studiare. Ho sostanzialmente terminato tutta la parte riguardante le librerie grafiche AWT e Swing. Ho fatto un po' di esperimenti con il codice del libro, e in sostanza riesco a creare qualcosa che assomiglia ad un abbozzo di applicazione... tuttosommato non è difficile. E l'IDE che uso per programmare (NetBeans, si trova sul sito della sun) rende le cose ancora più facili. Da domani inizio a studiarmi GWT, il tollkit di google per programmare in Java e produrre "codice Ajax"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-5873512811058581416?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/5873512811058581416/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=5873512811058581416' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5873512811058581416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/5873512811058581416'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/swing-e-awt.html' title='Swing e AWT'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-1055242746779313930</id><published>2008-01-07T19:30:00.000+01:00</published><updated>2008-01-10T12:40:59.464+01:00</updated><title type='text'>Lavoro del mese di Dicembre</title><content type='html'>Ecco che inizia la seconda settimana di lavoro. Bhe, sono stat fortunato... la prima è durata due giorni, causa feste.&lt;br /&gt;&lt;br /&gt;Comunque già tutto rivoluzionato: per permettermi di avere un minimo di dialogo con il mio correlatore (condividiamo l'ufficio qui in FDL) mi spostano il mio "giorno di riposo" dal Venerdì al Lunedì... così dalla settimana prossima lavorerò da Martedì a Venerdì&lt;br /&gt;&lt;br /&gt;Vediamo un po' la preparazione che mi sono fatto nel mese di Dicembre, in qualche modo dovevo pur prepararmi a questo lavoro e allo sviluppo della tesi.&lt;br /&gt;&lt;br /&gt;Per prima cosa mi sono scaricato qualche manuale Javascript, leggendo qualcosina, spulciando qui e la, compresi qualche tutorial online, ho imparato qualcosina di questo linguaggio.&lt;br /&gt;Giusto una spolverata... in teoria nella mia tesi Javascript non lo userò proprio... sebbene le parti web saranno Ajax (quindi in javascript), è probabile non lo useremo a basso livello, ma sfrutteremo quello generato da GWT o poco più&lt;br /&gt;&lt;br /&gt;Mi sono letto anche qualche pdf per Ajax, cercando di entrare nella logica di questa "piattaforma", facendo qualche piccolo tutorials online.&lt;br /&gt;&lt;br /&gt;Dopo un incontro con Franscesco Pasqualini, il mio correlatore, mi sono deciso a dedicarmi a Java, così mi sono comprato su IBS due libri su questo linguaggio di programmazione... erano in offerta&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.internetbookshop.it/code/9788850325955/comi-luigi/java.html?shop=3304" target="_Blank"&gt;&lt;img src="http://giotto.internetbookshop.it/cop/copj13.asp?f=9788850325955" alt="Java 6" /&gt;&lt;/a&gt;&lt;br /&gt;Giusto un bigino di Java, un riassunto del riassunto, ma almeno ho capito le basi di questo linguaggio. Poi è piccolo, è comodo da tenersi vicino nel caso degli atroci dubbi che sempre vengono&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.internetbookshop.it/code/9788820339081/camagni-paolo/java.html?shop=3304" target="_Blank"&gt;&lt;img src="http://www.bol.it/bol/includes/tornaImmagine.jsp?cdSoc=BL&amp;amp;ean=978882033908&amp;amp;tipoOggetto=PIB&amp;amp;cdSito=BL&amp;amp;tpPrd=01" alt="Java sviluppare applicazioni grafiche" /&gt;&lt;/a&gt;&lt;br /&gt;Libro un po' più corposo, sviluppato in maniera molto "didattica". Incentrato sull'aspetto di sviluppo di applicazioni grafiche. Sono appena riuscito ad iniziarlo, a dicembre&lt;br /&gt;&lt;br /&gt;Mi sono presentato così alla fdl... in pratica non so nulla di quello che devo fare per il mio progetto... imparerò... dopotutto è uno stage, sono qui per imparare, no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-1055242746779313930?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/1055242746779313930/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=1055242746779313930' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1055242746779313930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/1055242746779313930'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/lavoro-del-mese-di-dicembre.html' title='Lavoro del mese di Dicembre'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-8576000255947094776</id><published>2008-01-03T21:30:00.000+01:00</published><updated>2008-01-10T14:07:34.517+01:00</updated><title type='text'>Titolo della Tesi</title><content type='html'>Questa è la mia domanda di tesi, in teoria accettata (il giorno che sono andato alla riunione della commissione per l'accettazione della tesi... la riunione non c'è stata... ci hanno riferito "se non vi telefoniamo significa che la vostra tesi è stata accettata)... manderò comunque una mail per sapere se è tutto ok&lt;br /&gt;&lt;br /&gt;SPAZIO DOMANDA TESI&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-8576000255947094776?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/8576000255947094776/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=8576000255947094776' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8576000255947094776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/8576000255947094776'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/questa-la-mia-domanda-di-tesi-in-teoria.html' title='Titolo della Tesi'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6360124077734709632.post-6473618307109963136</id><published>2008-01-02T21:00:00.000+01:00</published><updated>2008-01-10T12:22:49.654+01:00</updated><title type='text'>Primo Giorno di lavoro</title><content type='html'>Oggi è il mio primo giorno di lavoro qui alla fdl servizi.&lt;br /&gt;Dopo mesi di attesa per le carte burocratiche (che devono ancora finire) ho potuto finalmente iniziare il mio stage presso questa società informatica della mia zona.&lt;br /&gt;&lt;br /&gt;Obbiettivo: sviluppare la mia tesi presso questa azienda, progettandola di laurearmi nella sessione di Luglio 2008 (15-18 Luglio 2008)... ce la farò?&lt;br /&gt;&lt;br /&gt;Lavoro dal Lunedì al Giovedì, 8 ore al giorno&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6360124077734709632-6473618307109963136?l=lamiatesi-fdl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lamiatesi-fdl.blogspot.com/feeds/6473618307109963136/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6360124077734709632&amp;postID=6473618307109963136' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6473618307109963136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6360124077734709632/posts/default/6473618307109963136'/><link rel='alternate' type='text/html' href='http://lamiatesi-fdl.blogspot.com/2008/01/primo-giorno-di-lavoro.html' title='Primo Giorno di lavoro'/><author><name>Gabriele</name><uri>http://www.blogger.com/profile/12560169685438653093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='15' height='32' src='http://www.mjj.it/upload/viso200x421.jpg'/></author><thr:total>0</thr:total></entry></feed>
