Selenium, JSLint and editors

Testing with Selenium can require adding a user-extensions.js to your Selenium IDE and Server.

While modifying the user-extensions.js you could need a javascript editor with a JSLint plugin suggesting how to make your code better.

Among open source solutions with JSLint plugin I found: Notepad++, jEdit, Netbeans, Eclipse and Aptana (please suggest others if you know).

Notepad++ (5.9.6.2) has a good plugin updated to 2011 (I can see the Node.js option) and you can put the variable Selenium in the options (Predefined field) of the plugin. The errors are displayed in the JSLint panel which is good but you cannot order them by error description. The only problem is that Notepad++ is for Windows (I have seen people using it with wine for Linux).

Notepad++ doesn’t provide a function navigator but it is possible to setup a Function List plugin manually (put the dll in the program files directory and the rest in the %appdata%/Notepad++/plugins/config with the xml in readonly) and add a rule as explained in this blog.

jEdit (4.5.1 pre1) is a good multiplatform editor. It has a function navigator (you have to install Sidekick plugin with the XML plugin) and it has a JSLint plugin (0.8)

The JSLint plugin is old (in the page you see that the latest release is in 2009) and indeed you don’t see the Node.js option, further you need to add /*global Selenium */ inside your script to make disappear the undefined variable Selenium message. The errors are displayed in the Error List panel and underlined in the file andyou cannot order them by error description

Netbeans (7.0.1) has his own JSLint plugin, with a configuration under Tools->Options->Miscellaneous->JSLint but the Predefined field doesn’t seem to work so you need to add /*global Selenium */ in your script. The error are displayed next to the file and under the Task list (see the instructions) and you can order them by error description.

With Netbeans you can see the function navigator in the Navigator panel. Compared with others IDE (Eclipse/Aptana) you can do the check on a file or in a project while the others can work only in the project.

For Eclipse (Indigo) I setup the JSLint plugin using the update site:

http://update.rockstarapps.com/site.xml

When you have setup the plugin, you see a RockStarApps menu and, as you can notice, the plugin is not updated to the last version of JSLint (Node.js is not there) but the Predefined field works.

The errors are displayed next to the file and under the Problems panel and you can group them by error description.

For the function navigator Eclipse has a JavaScript Development Tools plugin that you can setup using the following site under WTP 3.3.1:

http://download.eclipse.org/webtools/repository/indigo

Then open the perspective Javascript and you find the function navigator in the Script Explorer panel.

Concerning Aptana Studio 3, there is a native JSLint plugin to be enabled under Window->Preferences->Aptana Studio->Validation->Javascript. I don’t see the configuration panel like in the other plugins so you need to add all the options in your javascript file but you can fiter some warnings.

The errors are displayed next to the file and under the Problems panel and you can group them by error description. It doesn’t look to me stable for the moment (it seems not all the warnings I get with the others plugin are there).

Aptana has a function navigator in the Outline panel.

At Continuous Integration level I found a Jenkins Violation Plugin or just using jslint4java which has an ant plugin on which is based the Sonar plugin.

Netbeans 6.5.1 e Openfire 3.6.4

Oggi ho provato Openfire 3.6.4 un server XMPP scritto in Java rilasciato con licenza GPL.

Stavo pensando di fornire un servizio di chat e mi sono ricordato che quelli di Sun avevano messo il supporto a Netbeans chiamato Developer Collaboration ma come ho scritto in un precedente post c’erano problemi di compatibilità che ora sembrano superati con le nuove versioni di Netbeans.

Ho dapprima scaricato il file dal sito della Ignite Realtime (versione Mac OS X poi su Win), una volta installato me lo sono ritrovato in /usr/local/openfire. Dentro la cartella bin ho trovato il file openfire.sh ha cui ho dato i permessi di esecuzione ma che ho eseguito da root. Ho poi eseguito il file e sono andato nel mio browser (firefox) all’indirizzo:

http://localhost:9090

Tra le lingue a disposizione trovate Ceco, Tedesco, Inglese, Spagnolo, Francese, Olandese, Polacco, Portoghese Brasiliano, Sloveno e Cinese Semplificato.

Dopo le lingue impostate il vostro dominio con le porte 9090 e 9091. Dopo dovete scegliere se usare un database interno o esterno (potete scegliere tra MySQL, Oracle, Microsoft SQLServer, PostgreSQL, IBM DB2).

Ho scelto MySQL, ho impostato l’indirizzo di localhost e nel frattempo ho creato il database perchè Openfire non lo crea.

Ho poi scelto per il profilo di usare il database, alternativamente si può scegliere LDAP o ClearSpace. Infine ho poi impostato email e password di amministratore.

Alla fine della procedura avete necessità di riavviare il server perchè altrimenti la pagina di login non funzionerà !

Noto che il plugin search non è installato sulla versione di Openfire per Mac (su Win si, devo vedere su linux) e procedo ad installarlo.

Dopo di che come spiegato in questo post (ma anche nel primo link che vi ho dato) occorre creare una nuova Group chat; invece di usare “conference” ho creato “myconference”.

Poi sono andato su Netbeans, ho installato il plugin Developer Collaboration, e ho creato un nuovo account chiedendo di registrarmi sul server, alla fine della procedura di registrazione dovreste poter vedere il nuovo account sul server. Dovreste poi autenticarvi senza nessun problema.

Per fare una prova di chat ho usato Pidgin o Spark (rilasciato dalla stessa azienda) creando un utente sul server e loggandomi una volta con Pidgin e una volta con Spark. La chat diciamo che va, quando è l’utente su Pidgin che apre la conversazione con il client su Netbeans si vede un po’ di codice XML il contrario invece no. Occorre provare tra 2 istanze di Netbeans.

C’è da dire che Netbeans punta su Kenai per il servizio di chat vedi qui.

Nota: una mia collega usava QIP come chat client, per poterla riuscire a loggare sono dovuto andare in Jabber options->Advanced->Server option>Disable SASL authentication; notavo infatti che all’atto di scambiare il digest MD5 c’erano problemi.

Inserire una licenza nei vostri progetti con Netbeans

Oggi stavo programmando con Netbeans per esercitarmi con le pagine Jsp e ho scoperto che dalla versione 6.0 è data la possibilità di inserire in automatico la licenza nei file.

Il tutto è possible grazie ai template che tramite parametri costruiscono per voi il layout della classe; ad esempio quando create una nuova classe vi viene chiesto il suo nome e il package a cui appartiene, nome e package sono passati al template per costruire la nuova classe appena creata.

Se andate nel menu Tools -> Templates -> Java -> Java class e cliccate su Open in Editor avete:


<#assign licenseFirst = "/*">
<#assign licensePrefix = " * ">
<#assign licenseLast = " */">
<#include "../Licenses/license-${project.license}.txt">


<#if package?? && package != "">
package ${package};
</#if>
/**
*
* @author ${user}
*/
public class ${name} {
}

Come vedete la prima parte è dedicata alla licenza mentre la seconda per dichiarare il package e la classe. Per quanto riguarda la licenza viene specificato che la prima riga sarà indicata da /* (utilizzando il parametro licenseFirst), ogni riga verrà preceduta da * (parametro licensePrefix) e l’ultima parte deve finire con */ (parametro licenseLast), il tutto per diventare un commento nel codice Java.

Come vedete c’è anche il parametro project.license che dovete settare. Supponiamo ora che vogliamo aggiungere la licenza EUPL andiamo nella finestra dei Files e nella cartella nbproject trovate il file project.properties, alla fine del file aggiungete il parametro:

project.license=EUPL

Andiamo a reperire la nota EUPL nel sito:

http://www.osor.eu/eupl/how-to-use-the-eupl

dove c’è il link al PDF Guideline for users and developers EUPL Guideline

a pagina 17 (Eupl 1.1) trovate la nota di testo, che dovete copiarvi in un editor di testo e trasformare ad esempio nel seguente modo:


<#if licenseFirst??>
${licenseFirst}
</#if>
${licensePrefix}Copyright ${date?date?string("yyyy")} {organization}
${licensePrefix}
${licensePrefix}Licensed under the EUPL, Version 1.1 or – as soon they
${licensePrefix}will be approved by the European Commission - subsequent
${licensePrefix}versions of the EUPL (the "Licence");
${licensePrefix}You may not use this work except in compliance with the
${licensePrefix}Licence.
${licensePrefix}You may obtain a copy of the Licence at:
${licensePrefix}
${licensePrefix}http://www.osor.eu/eupl/european-union-public-licence-eupl-v.1.1
${licensePrefix}
${licensePrefix}Unless required by applicable law or agreed to in
${licensePrefix}writing, software distributed under the Licence is
${licensePrefix}distributed on an "AS IS" basis,
${licensePrefix}WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
${licensePrefix}express or implied.
${licensePrefix}See the Licence for the specific language governing
${licensePrefix}permissions and limitations under the Licence.
<#if licenseLast??>
${licenseLast}
</#if>

e salvate il file con il nome license-EUPL.txt

Nota: la variabile date è una delle variabili predefinite per i template, vedere qui.

Ora andate in Tools -> Licenses e fate click sul pulsate Add per selezionare il file, vedrete che ora vi compare tra le licenze a disposizione.

Nota: il file viene poi salvato nella cartella utente di sistema, nel mio caso (sotto mac)

/Users/emidiostani/.netbeans/6.1/config/Templates/Licenses

Come però avete notato, il file contiene anche la variabile organization; questa variabile l’ho definita in Tools->Templates ->User Configuration Properties -> User.properties, scrivendo ad esempio:

organization=Unisys

e semplicemente salvate il file.

Il file corrispondente lo trovate in:

/Users/emidiostani/.netbeans/6.1/config/Templates/Properties/User.properties

Ora non dovete fare altro che creare una classe Java come avete sempre fatto e vedete che la nota viene aggiunta in cima al file.

Riferimenti:

http://blogs.sun.com/geertjan/date/20071126

Sperimentando con Netbeans, Glassfish, Hudson e Subversion

Ho cominciato a scrivere qualche applicazione web con Netbeans 6.1 (penso di migrare presto (magari anche oggi) alla versione 6.5) e ho preso ad esempio il tutorial:

http://www.netbeans.org/kb/docs/web/quickstart-webapps.html

Il tutorial spiega come creare un paio di pagine Jsp facendo uso di una classe java usata come java bean, benchè dicono che richiede Netbeans 6.5 io ho usato tranquillamente Netbeans 6.1. Inoltre, durante il wizard, dovete specificare dove si trova Glassfish; ho preferito usare la mia istanza di Glassfish 2.1 scaricato a parte.

A parte ciò era mia intenzione di installare un server subversion e farne il polling tramite Hudson.

Ho trovato questo tutorial che spiega passo passo come prendere confidenza con Subversion; il tutorial suggerisce per Mac OS X di prendere Subversion da qui. Il pacchetto include Subversion 1.6.2 client e server (una volta installato potete provare i comandi svn –version e svnserve –version). Subversion mi si è installato in /opt/subversion/bin e non /usr/local/bin come descritto nella pagina di Collabnet; dovete quindi aggiungere il path /opt/subversion/bin nella variabile di ambiente PATH (che ho specificato nel file .bash_profile che si trova nella cartella utente).

Dopo aver giocato con il tutorial ho cercato subito di connettere Netbeans e Subversion e ho impostato in Preferences->Miscellaneous-> Versioning -> Subversion il path /opt/subversion/bin lasciando le altre impostazioni inalterate.

Inoltre ho poi cliccato con il tasto destro del mouse sulla cartella del progetto e sono nel menu contestuale sono andato in Versioning ->Import into Subversion Repository dove dovete specificare più che altro il path del repository che nel mio caso era:

file:///Users/emidiostani/SVNrep

(ho usato il repository creato con il tutorial su subversion)

Durante il wizard ho avuto un errore del tipo:

Expected FS format between ‘2’; found format ‘4’

che ho risolto facendo l’upgrade del plugin per subversion dalla versione 1.3 alla 1.3.1, difatti se andate nel repository (nel mio caso la cartella SVNrep) c’è il file /db/format che dice la versione del db interna è 4, in pratica non c’è accordo da tra client in netbeans e il server (noto che in Netbeans 6.5 potrebbe esserci lo stesso problema, vedere qui).

Sono poi andato su Hudson (versione 1.296) che vuole l’URL del repository e allora nella cartella di subversion ho lanciato il comando:

svnserve -d

che esegue il server che rimane in ascolto di default sulla porta 3690 (lo potete vedere da shell con il comando netstat -ant -p tcp). Ho trovato una breve descrizione di svnserve qui.

Cosi poi su Hudson ho inserito l’URL:

svn://localhost/Users/emidiostani/SVNrep

quando poi sono andato a specificare, nel form Build, il target file da compilare ho messo:

./HelloWeb/build.xml

che il target file che Netbeans mi aveva creato al momento del progetto.

Succede però che quando eseguo il build su Hudson esso mi genera un errore del tipo:

BUILD FAILED
/Users/emidiostani/.hudson/jobs/Test/workspace/SVNrep/HelloWeb/nbproject/build-impl.xml:188: The Java EE server classpath is not correctly set up. Your active server type is J2EE.
Either open the project in the IDE and assign the server or setup the server classpath manually.
For example like this:
ant -Duser.properties.file=<path_to_property_file> (where you put the property “j2ee.platform.classpath” in a .properties file)
or ant -Dj2ee.platform.classpath=<server_classpath> (where no properties file is used)

Total time: 0 seconds
Finished: FAILURE

questo accade perchè nel file HelloWeb/nbproject/build-impl.xml alla riga 188 esiste la riga:

<fail unless=”j2ee.platform.classpath”>

ecc ecc.

in pratica non trova la directory delle librerie di glassfish, questo l’ho scoperto semplicemente aggiungendo:

<echo>using ${j2ee.platform.classpath}</echo>

subito dopo quella riga e compilando direttamente da Netbeans.

Ovviamente Hudson non può sapere questa informazione che arriva direttamente dalle impostazioni di Netbeans e perciò per arrangiare ho messo nella casella Properties la voce:

j2ee.platform.classpath=/Users/emidiostani/Desktop/glassfish/lib/

e così sono riuscito a compilare.

In pratica leggendo poi in questo post, si capisce che la variable j2ee.platform.classpath è settata in HelloWeb/nbproject/private/private.properties file che non viene caricato nel repository (potete notarlo nel workspace di Hudson) e di conseguenza Hudson non la trova. L’autore del post suggerisce di settare la variabile nel file HelloWeb/nbproject/project.properties invece di settarla in Hudson perchè se pensate bene è una variabile statica che dovrebbe essere inclusa in diversi progetti in hudson e sarebbe giusto fissarla a monte.

Comunque come ho tempo rifaccio il tutto su Netbeans 6.5.

Buona giornata !

Netbeans, IReports e Xmlbeans

Ciao a tutti, in questo periodo mi sono avvicinato al mondo dei reports con JasperReports. Come realizzare un report tramite JasperReports ?

In pratica quando realizzate un report dovete definire un template che per JasperReports è un file xml in cui schema si trova a questo link: http://jasperreports.sourceforge.net/xsd/jasperreport.xsd

Il template è comunemente detto file jrxml che deve essere compilato in formato jasper. La realizzazione del template è aiutata da un plugin per Netbeans che permette di fare un drag and drop degli elementi anche se alla fine andrete di sicuro a modificare il file template a mano

Fatto sta che nel file potete mettere direttamente delle query che restituiscono tabelle con i rispettivi nomi di colonne a cui associare delle variabili che potete usare per creare le intestazioni per le tabelle o grafici che andrete ad inserire nel vostro template.

Le query possono anche essere esterne e questo ritengo sia un bene ma la particolarità è che una volta fissato un template e compilato nel formato jasper sarà quello una volta per sempre. Supponendo che si vuole creare un report per ogni tabella di un database si pensa subito al fatto che il numero delle colonne puo’ variare.

Percio’ stavo pensando perchè non prendere lo schema e generare il jar con Xmlbeans per poter creare il template al volo in java?

Nel fare cio’ ho avuto un intoppo, l’elemento Text è definito come complexType nel seguente modo:

<element name=”text”>
<complexType mixed=”true”>
</complexType>
</element>

Cioè in pratica è vuoto e l’unico metodo che mi rimane per riempirli è usare l’istruzione set su un XmlObject o l’XmlCursor che prevede un XmlObject da inserire.

Nella realizzazione di un template jrxml questo campo viene riempito con valori CDATA. Ho notato che esistono dei metodi nella classe XmlOptions che servono per inserire CDATA e li ho provati ad usare ma senza successo, magari ho sbagliato qualcosa.

Ci riproverò.

Nota:

http://markmail.org/message/ykiztut4p2tcalfh#query:node.setKey+page:1+mid:dhr2i74v7rkjf4ti+state:results

Netbeans 6.5 e OpenFire 3.3.3

Siccome per un altro progetto ho preso ad usare Netbeans 6.5 non vedevo l’ora di provare la funzionalità di chat integrata (developer collaboration plugin):

http://collab.netbeans.org/files/documents/186/522/NB-Collab-Code-Review-for-JavaOne-v2.swf

La chat si basa o su un server della sun o su un qualunque altro server Xmpp tra cui OpenFire come suggeriscono gli stessi di Netbeans:

http://wiki.netbeans.org/CollabServer

Ma solo la versione 3.3.3 funziona con il plugin di Netbeans (attenzione l’interfaccia web si vede bene con IE e non con Firefox 3.0.4), versione che potete trovare al seguente link:

http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_3_3.exe

Se provate ad usare versioni successive (ultima al momento è la 3.6.5) avete il seguente errore al login da Netbeans:

“object does not represent a valid JID”

Se a voi funziona o avete trovato soluzione fate uno squillo, ovviamente non siete obbligati ad usare un proprio server o as usare OpenFire.