Download attachments and page content from Confluence

For a project there is a need to move all the attachments in Confluence, including the page content, in a remote repository.

Confluence offers different API and the XML-RPC API can be still used. The API do not allow to download all the attachments in once but only page by page therefore the need for this python script which:

  1. Creates a folder for each page which includes
    1. the html export of the page
    2. all the attachments of the page
  2. Once all the pages are saved, it moves all the folders in the same hierarchical structure of the space

You can find the code my GitHub repository:

https://github.com/EmidioStani/confluence_attachments

Main inspiration came from: https://answers.atlassian.com/questions/114490/how-to-get-all-attachments-under-a-space-via-rest-api

Advertisements

PHP Code metrics statistics

I believe doing statistics about the quality of the code it can be a good incentive for developers to improve their application and for new coming developers in the project to see a well structured program and put easily their hands on.

Sometime ago I started to verify the quality of the code of Drupal using PHPdepend in Jenkins a bit for fun, so every time there was a new commit pdepend was launched to analyze the code.

I noticed in the code that the threshold to identify max and min limits were based on Java threshold (these threshold have been published in the book “Object Oriented Metrics in Practice” which you can find also in slideshare (slide 12)) which of course cannot be a good comparison since PHP and Java are 2 different programming languages, so I started to analyze other software in order to calculate an average and defining new thresholds.

The comparison was done with pdepend 0.10.7 (I am aware of the version 1.0.0) on 60 php projects which I selected in different environments.

You can find the file at the link Comparison of php application to determine thresholds in pdepend.

Even though you can find a degree among all the applications, it could be more interesting doing  it between similar application (CMS, etc.) .

The summary is:
MIN – AVG – MAX
cyclo-loc:    0.16 – 0.20 – 0.24 (not changed)
loc-nom:        13 –    20 –    27 (doubled)
nom-noc:         5 –   12 –    18
noc-nop:          1 –   14 –    27
calls-nom:   2.66 – 3.68 – 4.69
fanout-calls: 0.01 – 0.06 – 0.11 (much lower)
andc:          0.27 – 0.52 – 0.76
ahh:            0.17 – 0.37 – 0.58

What it is interesting to see is that the line of code for each method is doubled and the fanout-calls is much lower (then the next question would be: why ?), it would be even more interesting to see how the new versions of each application change or with the new version of pdepend, If I had more time I would like to work on it but at least I shared this thought with you :-)

I hope this result can be of inspiration somebody else :-)

Web.xml e HTTPS: proteggere le vostre pagine JSP

Sono ai primi passi con JSP e sto creando una pagina di login per l’autenticazione, una di quelle banali con username e password che vanno verificate.

A parte impostare il form con method=”POST” mi sono chiesto come abilitare https per offrire una comunicasione sicura. Niente di più semplice, probabilmente nella vostra applicazione web vi ritrovate il web.xml già creato dal vostro IDE e che potete modificare.

Il file web.xml è chiamato deployment descriptor perchè esso descrive come la vostra applicazione composta da diversi file (o risorse) viene raggiunta dall’esterno, non solo in termini di URL ma anche in termini di sicurezza.

Come abbiamo capito il deployment descriptor è un file xml che è descritto da uno schema, l’ultima versione la 2.5 la trovate qui:

http://java.sun.com/xml/ns/javaee

cercate la voce Servlet Deployment Descriptor Schema.

Un semplice esempio lo trovate qui:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Potete notare la versione 2.5, lo schema web-app_2_5.xsd, il parametro di timeout (0 significa no time out) e il welcome file che contiene il file index.jsp che deve essere il primo ad essere visitato.

Per quanto riguarda la sicurezza, se vogliamo aggiungere la protezione su tutte le risorse e fare in modo che altre entità, terze persone, non vedano il contenuto trasmesso (in altre parole SSL), dovremo aggiungere appena prima del tag </web-app> la seguente configurazione:


<security-constraint>
<web-resource-collection>
<web-resource-name>secure</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

è molto importante sapere che:

  • potete specificare più di un security constraint, vedere qui un esempio; nell’esempio potete notare che si può scegliere se applicare la sicurezza al solo metodo POST o GET o a tutti i metodi specificati nel protocollo HTTP 1.1
  • l’url-pattern /* indica tutte le pagine che si trovano subito dopo la / nell’URL, potete anche dire /main/* tutte le pagine che si trovano dopo /main/ nella loro url
  • il livello CONFIDENTIAL dice che altre entità non possono vedere il messaggio trasmesso, il sotto livello è INTEGRAL per cui il messaggio non può essere modificato in transito e NONE quando non si vuole alcuna garanzia sul trasporto

Ora non dovete far altro che il deploy della stessa applicazione e andare sul link http della vostra applicazione e verrete rediretti su HTTPS (accettando il certificato).

La versione 2.5 è destinata ad essere seguita dalla 3.0 come descritto dalla JSR 315 che introdurrà diversi miglioramenti tra cui l’uso delle annotazioni nelle servlet rendendo vano l’uso del file web.xml, ma tutto cio’ si accadrà su J2EE 6 e quando i diversi servlet-container saranno pronti per interpretarli.

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

Raccogliere dati sul repository Subversion: WebSVN e StatSVN

Probabilmente in molti hanno provato a configurare Apache per poter vedere un repository di Subversion con una delle classiche configurazioni come la seguente che ho realizzato su di un server a disposizione:

<Location /svn/repos>
   DAV svn
   SVNPath /home/svn/repos
   AuthType Basic
   AuthName "Subversion Repository"
   AuthUserFIle /home/emidio/.htpasswd
   Require valid-user
</Location>

configurazione che va messo in /etc/apache2/mods-available/dav_svn.conf dove /home/svn/repos è il vero e proprio repository subversion mentre .htpasswd contiene il file utenti/password per l’autenticazione. Per maggiori informazioni leggete la pagina di manuale.

Cosi se poi andate su htttp://localhost/svn/repos potete scorrere il vostro repository usando il browser e conoscendo solo lo stato dell’ultima revisione.

Oggi vi presento 2 strumenti interessanti a chi ha un progetto condiviso con Subversion: WebSVN e StatSVN.

WebSVN è una applicazione PHP (richiede minimo PHP 4.3.0) rilasciata con licenza GPL che vi permette di monitorare, tramite pagine web la struttura del vostro repository Subversion (richiede minimo SVN 1.2.0).

In pratica potete vedere l’ultima revisione del progetto, autore e log message sul lato sinistro e sulla destra potete scorrere tra le cartelle e file del repository che potete monitorare tramite RSS feed.

Cartelle e file sono indicati dal loro numero di revisione; selezionando un file vedete la sua ultima revisione ma se cliccate su View Log ad esempio vedete la lista delle sue revisioni che potete vedere una per una (Details) o confrontare tramite una piacevole interfaccia grafica.

Eccovi un link dove viene spiegato in breve come installarlo su Linux (l’ho testato su Ubuntu 8.10). Per Subversion ho anche usato questo link. In pratica dovete copiarlo nella cartella /var/www servita da Apache e cambiare il file di configurazione puntando a subversion (/usr/bin) e alla cartella padre del repository di Subversion (nel mio caso avendo il repository in /home/svn/repos ho indicato il path /home/svn).

Per abilitare gli RSS feed dovete settare i permessi della cartella /var/www/websvn/cache a 777 (ho provato 700 e 770 ma mi dava problemi di permessi).

La cosa carina è che avete il syntax highlighting (l’ho provato su codice PHP, file CSS, file javascript, perl) che è basato di default su GeSHI che supporta molti linguaggi altrimenti potete usare Enscript 1.6 o superiore (insieme a Sed) che deve essere già installato sul sistema.

Ulteriori info le trovate in locale  su: http://localhost/websvn/doc/install.html

StatSVN è invece una applicazione Java (file jar compresso in un file zip di appena 2.4 mega) rilasciata con licenza LGPL che genera statistiche dettagliate sul repository subversion. Arrivato il 22 maggio scorso alla versione 0.5.0, StatSVN ha ora la possibilità di essere usato tramite Twitter.

La cosa interessante che ho notato nel manuale è che si può integrare con Bugzilla, Mantis e Trac.

Il sommario delle statistiche lo vedete dalla pagina principale index.html che vi mostra:

  • quando è stato generato il report
  • ultima revisione
  • su che periodo si basa
  • numero totale di file
  • numero totale di linee di codice
  • numero di sviluppatori
  • un collegamento a Twitter
  • un menu che mostra maggiori dettagli
  • il grafico sommario delle linee di codice
  • la tag cloud delle parole usate nei messaggi di log
  • la struttura gerarchica delle directory, dove per ognuna vedete il numero di file e le linee di codice contenuti.

Nota: I grafici sono realizzati tramite JFreeChart.

Nel menu dei dettagli vedete ad esempio, quante linee di codice ha scritto un particolare autore, il numero di commit per ora e giorno della settimana,i log dei commit, che tipi di file ci sono ordinati per loro numero (1o file php, 4 xml ecc.) e quante linee di codice in media ci sono per ogni tipo, lista dei file più grandi e più revisionati, tabella e grafico a torta delle dimensioni delle cartelle e tanto altro.

Per vedere una demo subito andate a questo link oppure potete vedere anche la demo su progetti come Ant, Apache Synapse, Apache Continuum, Ruby.

Non c’è in pratica installazione (ha bisogno almeno di SVN 1.3) dove lanciarlo nel seguente modo come indicato nel manuale:

svn co svn://server/repo/trunk/modulename
svn log -v –xml > logfile.log
java -jar /path/to/statsvn.jar /path/to/module/logfile.log /path/to/module

In pratica dovete fare un checkout del progetto, generare il file di log e sulla base del path indicato eseguire il file statsvn.jar.

Sarebbe bello però rendere automatica la procedura ed ecco che ho pensato a come integrarlo con Hudson e ho notato che qualcuno ci ha provato ma senza successo, io ho ripreso la sua configurazione e l’ho leggermente modificata.

Ho copiato prima di tutto il file statsvn.jar nella cartella lib di Apache Ant in modo che sia raggiungibile dalla variabile di ambiente ANT_HOME che punta alla directory di Ant.

Poi sono andato nel file build.xml della mia applicazione in Netbeans e ho notato che importa il file build-impl.xml che ha al suo interno una lunga serie di target. Tra le dipendenze del target default ho aggiunto statsvn-clean, statsvn e alla fine del file (prima della chiusura del tag </project>) ho aggiunto:

<taskdef name=”statsvn” classname=”net.sf.statsvn.ant.StatSvnTask”/>

<!– output directory for reports –>
<property name=”StatSVNReportDir” value=”statsvn”/>

<target name=”statsvn-clean” description=”resets to a clean state”>
<delete dir=”${StatSVNReportDir}” failonerror=”no”/>
</target>

<target name=”statsvn” description=”Does SVN repository statistics.”>
<echo message=”Metrics: running statsvn …”/>

<delete file=”${StatSVNReportDir}/svn-log.xml” />
<mkdir dir=”${StatSVNReportDir}” />

<exec executable=”svn” dir=”${src.dir}” output=”${StatSVNReportDir}/svn-log.xml” searchpath=”true” >
<arg line=”log –xml –verbose” />
</exec>

<statsvn
log=”${StatSVNReportDir}/svn-log.xml”
path=”..”
outputDir=”${StatSVNReportDir}/html” />

</target>

Ho poi fatto il commit di questo file sul repository SVN e così Hudson (che è impostato per fare il polling di Subversion) lo cattura e, poichè è impostato di fare il build periodicamente, mi genera anche la cartella statsvn (vedi proprietà StatSVNReportDir sopra) dell’ultimo build con tutte le descrizioni dettagliate. Come vedete come path gli ho indicato “..” per specificare la root del progetto in quanto non tutti i file del progetto si trovano nella cartella src come, ad esempio, le pagine jsp che normalmente le trovate nella cartella web.

A questo punto non mi resta che augurarvi buone statistiche !

Nota: ho usato Subversion 1.6.2, Hudson 1.296 e Ant 1.7.0

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.

Junit e SoapUI, strumenti per testare web services

In genere durante il processo di sviluppo di una applicazione una delle fasi sottovalutate è quella di testing.

La fase testing dovrebbe in teoria iniziare non appena i requisiti della applicazione sono stati definiti e dovrebbe poi continuare per il tutto il processo di sviluppo poichè all’aumentare della complessità della applicazione i test devono garantirne il suo funzionamento e, dunque, esistono diversi livelli di test da quelli di unità a quelli di sistema e validazione (acceptance test).

Indipendentemente dai livelli esistono test di varia natura da quelli funzionali a quelli di robustezza e performance. In sostanza come avete potuto capire il tutto puo’ richiedere abbastanza tempo e quindi se si cerca di rendere quanto più automatica questa fase è meglio.

Nel mondo Java il tutto inizia con le librerie di Junit. Rilasciate con licenza Common Public Licence 1.0 sono arrivate, al momento in cui scrivo, alla versione 4.5 (del 8/8/2008). Esse permettono di automatizzare la fase di testing scrivendo metodi che contengono alcune chiamate alle librerie e tra queste esistono i metodi “assertEquals()” che verificano che 2 oggetti (quello atteso e quello di cui si dispone) sono uguali (da cui poi tuttte le derivazioni come il confronto tra booleani, stringhe ecc.).

Nonostante siamo alla versione 4.x la serie precedente, 3.x, viene mantenuta questo perchè le classi che contengono i metodi devono essere opportunamente scritte, in particolare con la 3.x ad esempio i nomi dei metodi devono avere una certa struttura (testXXX, cioè devono iniziare per test) mentre la 4.x permette di avere una certa elasticità usando pero’ le annotazioni come javadoc. Eclipse 3.4 annovera tra le sue librerie sia Junit 3 (3.8.2) e Junit 4 (4.3.1) e permette di creare Test case usando l’una o l’altra libreria. In questo esempio vedere come creare Junit Test case con la versione 4.

Un’ultima cosa che dovete sapere su Junit è che potete raggruppare i Test case in Test suite che eseguono più test. Inoltre quando si scrivono metodi per i test può capitare che questi condividano degli oggetti inizializzati; Junit permette di inizializzare, e poi distruggere, risorse condivise tramite i metodi setUp() e tearDown(), vi lascio poi scoprire il tutto facendovi spulciare la documentazione.

Ant, non solo vi permette di automatizzare il tutto con il suo Junit task, ma vi crea anche, a partire dai risultati di ogni test, dei sempli report.

Quando create dei web services usando il plugin di Axis2, Codegen Wizard, per Eclipse probabilmente avrete notato l’opzione che genera anche i test cases che alla fine non sono altro che semplici client che dovete inizializzare dando l’end point da contattare e costruendo gli oggetti che da passare allo stub. Inoltre potete modificare il file Ant generato per generare i report che vi avevo accennato prima.

Junit è pero’ la punta di un iceberg. Difatti si sono evolute applicazioni che si occupano solo della fase di testing come Cactus, Fitnesse (che è un wiki che fa acceptance test) , Selenium che allargano l’orizzonte anche alle applicazioni web, lo stesso Spring tra l’altro contiene un modulo per il testing. Se poi parliamo di performance esiste jMeter (a cui SOAPUI fa concorrenza).

SoapUI è una applicazione rivolta ai web services che abbiamo già incontrato quando vi ho accennatto alla possibilità di validare i file wsdl per migliorare l’interoperabilità.

Una delle funzionalità carine è quella di creare al volo una richiesta SOAP automaticatimente generata a partire dal file wsdl, generando poi report e test di copertura su file wsdl.

Junit non è poi l’unico testing framework esistono TestNG ed anche Nunit (che è il porting di Junit per .NET) e una miriade di applicazioni che vengono usate per testare i vari linguaggi.

A questo punto vi auguro buona esplorazione in questo mondo che, anche per me, si sta rivelando sempre più grande e al tempo stesso affascinante (soprattutto come sviluppatore pigro che vorrebbe automatizzare tutto ciò :-) ).

P.S: Occorre dire che lo stesso Eclipse nel suo piccolo permette di testare on-line il servizio web. Difatti cliccando con il tasto destro del mouse sul file wsdl dovreste ritrovarvi nel menu contestuale la voce Web Services da cui la sotto voce Test with Web Services Explorer che è una interfaccia web che vi permette di compilare i campi  da mandare nella richiesta SOAP e subito sotto vedere la risposta.

Link interessante: http://wso2.org/library/3862

Alla prossima