Sei sulla pagina 1di 106

guida per lo sviluppatore

Regola kit

Autori: Nicola Santi

4 dicembre 2008, versone 1.1 bozza 1

Indice

Prefazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Getting Started 1.1 Installare Regola kit . . . . . . . . 1.2 Predisporre il database . . . . . . . 1.3 Creare un progetto con Regola kit . 1.4 Collegarsi al database . . . . . . . . 1.5 Avviare lapplicazione . . . . . . . . 1.6 Struttura di un progetto Regola kit 1.7 Persistenza su database . . . . . . . 1.8 (Ri)collegarsi al database . . . . . . 1.9 Classi di modello . . . . . . . . . . 1.10 Dal modello alla presentazione . . . 1.11 Usare Eclipse . . . . . . . . . . . . 2 Installazione 2.1 Maven 2 . . 2.2 Licenza . . . 2.3 Librerie . . 2.4 Dipendenze 2.5 Eclipse IDE

6 9 9 10 10 11 11 12 13 14 14 16 17 19 19 21 21 22 32 33 33 34 34 35 35 35

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

3 Struttura di un progetto 3.1 Lo standard Maven 2 . . . . 3.2 Liniezione delle dipendenze 3.3 La localizzazione . . . . . . 3.4 Le connessioni al database . 3.5 Verbosit dei log . . . . . . 3.6 La sezione dei test . . . . .

. . . . . . 3

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 3.7

INDICE Applicazione Servlet . . . . . . . . . . . . . . . . . . . . . . . 35 37 37 39 39 41 41 41 41 41

4 Database 4.1 Congurazione di run-time . . . . . . . . . . . . . . . . . . . . 4.2 Congurazione di design-time . . . . . . . . . . . . . . . . . . 4.3 Transazioni JTA . . . . . . . . . . . . . . . . . . . . . . . . . 5 Persistenza 5.1 Hibernate . . . . . . . 5.2 Congurazione . . . . 5.3 Generatori automatici 5.4 Altri ORM . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

6 Messa in produzione 43 6.1 Produrre i pacchetti war ed ear . . . . . . . . . . . . . . . . . 43 6.2 Application Server . . . . . . . . . . . . . . . . . . . . . . . . 43 6.3 Integrazione continua . . . . . . . . . . . . . . . . . . . . . . . 43 7 Sviluppo 7.1 Domain Driven Development . 7.2 Livelli . . . . . . . . . . . . . 7.3 Model Pattern . . . . . . . . . 7.3.1 Intento . . . . . . . . . 7.3.2 Forze . . . . . . . . . . 7.3.3 Esempio . . . . . . . . 7.3.4 Architettura . . . . . . 7.4 Generatori . . . . . . . . . . . 8 Dao 8.1 Scopo . . . . . . . . . . . . 8.2 GenericDao . . . . . . . . . 8.3 Creare un custom dao . . . 8.4 Ricerche con Model Pattern 8.4.1 ModelPattern . . . . 8.4.2 La selezione . . . . . 8.4.3 Ordinamento . . . . 8.4.4 Paginazione . . . . . 8.4.5 Proiezione . . . . . . 8.4.6 Rappresentazione . . 45 45 45 45 46 46 47 49 50 51 51 51 51 51 52 54 55 56 56 57

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

INDICE 9 Servizio 9.1 Scopo . . . . . . . . . 9.2 GenericManager . . . . 9.3 Transazioni . . . . . . 9.4 Politiche di detach . . 9.4.1 Pojo faade . . 9.4.2 Modello esposto 9.4.3 Conversazioni . 10 Presentazione Web 10.1 Scopo . . . . . . . . . 10.2 Tecnologie . . . . . . . 10.3 Pagina di lista . . . . . 10.4 Pagina di form . . . . 10.5 Componenti aggiuntivi 10.5.1 expandibleTable 11 Application mashup 11.1 Servizi Web SOAP 11.2 Servizi Web REST 11.3 Portlet . . . . . . . 11.4 Mashup . . . . . .

5 59 59 59 59 59 60 63 64 67 67 67 67 67 67 68 71 71 73 75 77 79 79 80 81 82 86 87 87 87 88 88 88 88 89 89 90 90

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

12 Sicurezza 12.1 Autenticazione . . . . . . . 12.2 Congurazione di Cas . . . 12.3 Congurazione di Client . . 12.4 Presentazione . . . . . . . . 12.5 Congurazione semplicata 13 Plitvice Security 13.1 Autorizzazioni . . . . . . . . 13.2 Ruolo . . . . . . . . . . . . 13.2.1 Diritti di workow . 13.2.2 Diritti applicativi . . 13.3 Contesti . . . . . . . . . . . 13.3.1 Tirocini . . . . . . . 13.3.2 Plitvice . . . . . . . 13.4 Insieme delle identit . . . 13.5 Il processo di autorizzazione 13.6 Restrizione di visibilit . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

INDICE 13.7 Condivisione di scelte . . . . . . . . . . . . . . . . . . . . . . . 92

14 Plitvice Workow 14.1 Terminologia e convenzioni . . . . 14.2 Tabella di marcia . . . . . . . . . 14.3 Workow . . . . . . . . . . . . . 14.4 WorkowRepository . . . . . . . 14.5 Autorizzazioni . . . . . . . . . . . 14.6 Il documento . . . . . . . . . . . 14.7 WorkowManager: funzionamento 14.8 WorkowManager: progettazione 14.9 WorkowActions . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

93 93 94 94 95 95 96 98 100 101

Prefazione

Il panorama delle tecnologie Java si presenta allo sviluppatore rigoglioso e selvaggio come doveva apparire agli occhi dei primi europei la foresta amazzonica; centinaia di librerie si contendono la stessa funzionalit ed assolvono il loro compito in modo spesso diverso e non di rado incompatibile. Una menzione particolare merita lo sviluppo di applicazioni web per cui esistono paradigmi e librerie a bizzee in una slata allegra e caotica di sigle (Servlet, JSP, Struts, JSF, Ajax, Tapestry e molte molte altre) che lasciano spesso interdetto il neota, che di fronte a tanta abbondanza si ritrova spesso a scegliere a caso lasciandosi guidare dallultimo articolo sfogliato. Purtroppo la statistica non perdona e spesso la scelta si rivela al di sotto delle aspettative ed qui, sopra i tavoli di una qualche riunione, che qualcuno cede allo scoramento e pronuncia la fatidica frase: Riscriviamolo noi. Ahi quanti si sono imbarcati nellimpresa funesta di realizzare il proprio framework in casa e quanti ancora ne stanno pagando un caro prezzo in termini di produttivit, innovazione e stabilit. Regola kit un tentativo di risposta alla domanda Quale tecnologie conviene utilizzare per unapplicazione web con unalta interazione utente e mole di dati ampissima?. Ad esempio per un gestionale web, il dominio che ha fatto da culla per il progetto. Conviene subito fare chiarezza su un punto: Regola kit non un framework. Il suo contenuto essenzialmente esperienza. Il losofo Hume suggeriva un metodo curioso per selezionare i libri in un biblioteca; scartare tutti quelli che contengono speculazioni astratte, trattati di logica e quantaltro per limitarsi a considerare solo quei testi che riportano esperienze reali degli autori. Questo criterio di selezione vale pi che mai in un mondo in cui librerie e progetti (open source o commerciali) sorgono e tramontano nello spazio di un mattino e fornisce la chiave per selezionare ci che in potenza appare perfetto da quello che realmente in grado di consentire lo sviluppo con un livello di produttivit e graticazione 7

INDICE

decenti. Ad esempio per la sola persistenza esistono decine di framework ma quello scelto per Regola kit (Hibernate) lunico che ha superato la prova su database piuttosto estesi, il giusto compromesso tra essibilit ed automatismo. Naturalmente per altri contesti Hibernate potrebbe non essere la soluzione migliore e per altri ancora la scelta peggiore. Ma nel contesto indicato la nostra esperienza maturata in oltre dieci anni di lavoro sul campo ci ha portato a quellindicazione. In denitiva Regola kit una selezione di tecnologie impiegate con successo in progetti critici di tipo gestionale e costituisce, per cos dire, un prontuario di tecnologie che hanno superato la prova dei fatti nellambito indicato. Oltre a questo Regola kit si propone come una soluzione ingegneristica in cui tutte le citate tecnologie si trovano gi congurate per funzionare correttamente assieme evitando agli utilizzatori il lungo percorso del tuning dei vari le di congurazione. Come si dice un ambiente pronto per luso o chiavi in mano. Lunica parte di Regola kit che aggiunge qualcosa a lesistente nota come Model Pattern e colma un vuoto esistente per la selezione e la rappresentazioni di oggetti persistiti in database ricchi di dati in modo che siano facili da individuare, estrarre e riportare a video. Se in futuro qualcuno facesse meglio di noi in questo campo sicuramente il nostro Model Pattern verrebbe sostituito. Tutto qui; Regola kit semplicemente questo. Non sappiamo dire se sia poca cosa o tanto, comunque se pu esservi di un qualche aiuto per il vostro lavoro allora usatelo liberamente ( licenziato sotto GPL3), ci farete cosa gradita! Il manuale che avete tra le mani fornisce una guida per lo sviluppatore con cui ci scusiamo preventivamente per le eventuali inesattezze presenti e, anzi, lo sproniamo a segnalarcele. Vorrei ringraziare Lorenzo Bragaglia, Marco Rosi, Fabio Cognigni, Alex Landini e tutti quelli che hanno aiutato in questa impresa. E stato davverobello lavorare con voi. In particolare voglio ricordare Lorenzo per le revisioni continue di questo documento ed consigli preziosi. 17 novembre 2007, Nicola Santi

Capitolo

Getting Started
Questo capitolo una cura per gli impazienti; seguendo le istruzioni dei paragra seguenti sarete in grado di installare e predisporre una prima applicazioni web con Regola.

1.1

Installare Regola kit

Le applicazioni realizzate con Regola kit utilizzano Maven 2 per tutta la gestione del ciclo di build (compilazione, esecuzione dei test, creazione dei le war, . . . ). Quindi come prima cosa bisogna installare Maven 2 scaricandolo dal sito maven.apache.org e seguendo le istruzioni. Finita linstallazione di Maven 2 vericate che tutto sia andato a buon ne aprendo una console di terminale e lanciando il seguente comando.
1 3

n i c o l a @ c a s p e r : ~# mvn v e r s i o n Maven v e r s i o n : 2 . 0 . 9 Java v e r s i o n : 1 . 6 . 0 _03 OS name : " l i n u x " v e r s i o n : " 2.6.22 14 g e n e r i c " a r c h : " i 3 8 6 " Family : " u n i x "

Se tutto corretto Maven 2 risponde al comando restituendo la sua versione, quella di Java ed inne alcune informazioni circa il sistema operativo in uso. Regola kit non richiede nessuna installazione particolare (anche se possibile scaricare un pacchetto contente documentazione e comandi di utilit): quindi nita linstallazione di Maven 2 siete pronti gi per utilizzare Regola kit. Per maggiori informazioni su come installare Regola kit sulle vostre macchine di sviluppo si rimanda al capitolo 2 nella pagina 19. 9

10

CAPITOLO 1. GETTING STARTED

1.2

Predisporre il database

Per questo tutorial ipotizziamo di avere a disposizione un database di tipo MySql gi installato sulla macchina dove intendiamo creare il progetto. Assicuratevi che il database stia funzionando e digitate il comando seguente:
n i c o l a @ c a s p e r : ~# mysql u r o o t p

Vi troverete dentro la shell di amministrazione di MySql. Approttatene per creare un nuovo database che sar utilizzato dallapplicazione digitando il comando.
1

mysql> c r e a t e d a t a b a s e c l i e n t i ;

(Attenzione al punto e virgola in fondo al comando). A questo punto non ci resta che creare anche lutente utilizzato dalla nostra applicazione per accedere al database (nellesempio porta il mio nome nicola).
1

mysql> g r a n t a l l on c l i e n t i . t o n i c o l a @ l o c a l h o s t ;

Bene, con il database abbiamo nito. Digitate questo ultimo comando per uscire dalla shell di amministrazione di MySql e passare al paragrafo seguente.
1

mysql> e x i t

Regola kit in grado di utilizzare diversi DBMS (ad esempio Oracle, Microsoft Sql, PostgreSQL, Hypersonic, . . . ). Per sapere come congurare la vostra applicazione per utilizzare DBMS diversi da MySql si rimanda al capitolo 5 nella pagina 41.

1.3

Creare un progetto con Regola kit

Posizionatevi nella cartella dove volete creare il vostro nuovo progetto e digitate un comando simile al seguente con laccortezza per di modicare il parametro gruopId (nellesempio com.acme) con il nome del vostro package di default ed il parametro artifactId (nellesempio clienti ) con il nome del nuovo progetto.
1 3

n i c o l a @ c a s p e r : ~# mvn a r c h e t y p e : c r e a t e DarchetypeGroupId=o r g . r e g o l a D a r c h e t y p e A r t i f a c t I d=r e g o l a j s f a r c h e t y p e \ D a r c h e t y p e V e r s i o n =1.1SNAPSHOT DgroupId=com . acme \ D a r t i f a c t I d= c l i e n t i

Attenzione: il comando qui sopra riparito su diverse righe per chiarezza tipograca, pu essere digitato su una sola riga rimuovendo le barre. La prima volta che lanciate questo comando Maven 2 scarica tutte le librerie necessarie (la cosa potrebbe prendere un po di tempo) e crea una sotto cartella col nome del progetto (nellesempio la cartella clienti). Il progetto

1.4. COLLEGARSI AL DATABASE

11

questo punto gi stato creato, posizioniatevi allinterno della cartella clienti col comando:
n i c o l a @ c a s p e r : ~# cd c l i e n t i

1.4

Collegarsi al database

Prima di lanciare la nostra nuova applicazione necessario informarla circa le coordinate del database da utilizzare, per farlo bisogna apportare un modica al le src/test/resources/jetty/env.xml con il vostro editor di testo preferito. Dovete inserire cambiare solo il nome del database (alla riga 6) e lo username (riga 8) da utilizzare per ottenere qualcosa di simile al frammento di xml seguente:
1 3 5 7 9 11

... <New i d=" j i r a ds " c l a s s=" o r g . mortbay . j e t t y . p l u s . naming . R e s o u r c e "> <Arg>j d b c / D a t a s o u r c e</Arg> <Arg> <New c l a s s=" o r g . enhydra . j d b c . s t a n d a r d . S t a n d a r d C o n n e c t i o n P o o l D a t a S o u r c e "> <S e t name=" U r l ">j d b c : m y s q l : // l o c a l h o s t / c l i e n t i</ S e t> <S e t name=" DriverName ">com . mysql . j d b c . D r i v e r</ S e t> <S e t name=" User ">n i c o l a</ S e t> </New> </Arg> </New> ...

Per avere maggiori informazioni sulle diverse congurazioni relative alle connessioni al database si rimanda al capitolo 4

1.5

Avviare lapplicazione

Ora tutto pronto per avviare lapplicazione, se avete lasciato la cartella principale del progetto tornateci e da l lanciate il comando seguente (e lasciate aperta la console):
n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mvn j e t t y : run

Sullo schermo si susseguiranno diverse righe per informarvi che lapplicazione stata inizializzata e quando, inne, apparir la dicitura Started Jetty Server saprete che tutto pronto. Lasciando sempre aperta la console aprite unistanza del vostro browser e collegatevi allindirizzo localhost:8080/clienti per vedere la pagina di benvenuto della vostra applicazione. Complimenti, avete appena fatto il primo passo nel mondo delle applicazioni Regola kit!

12

CAPITOLO 1. GETTING STARTED

Per visualizzare lapplicazione state utilizzando un piccolo (ma molto completo) application server di nome Jetty. Per la messa in produzione per si consiglia di utilizzare dei container diversi (ad esempio Tomcat o JBoss). Per imparare a come creare i pacchetti per questi application server si rimanda al capitolo 6 nella pagina 43

1.6

Struttura di un progetto Regola kit

La struttura della cartella di un progetto Regola kit si impronta alla struttra standard di un progetto web di Maven 2. Al primo livello troviamo: pom.xml src/ target/ il le di congurazione di Maven 2 la cartella dei sorgenti contiene i le compilati ed i pacchetti per le consegne

La cartella target contiene quanto i pacchetti pronti per la consegna con la classi compilate ed i descrittori. Si tratta di una cartella il cui contenuto ricreato ogni volta si lanci il comando:
1

n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mvn p a c k a g e

La cartella src contiene i sorgenti (html, js, css e java) dellapplicazione. Al suo interno potete trovare: main/ test/ site/ contiene i sorgenti dellappplicazione contiene i sorgenti dei test reportistica generata da Maven 2

La cartella main e la cartella test contengono entrambe i sorgenti java (nella sottocartella java) e le altre risorse (nella cartella risorse). Queste ultime sono i le di congurazione, i mappaggi orm e, in generale, tutto quello che non sono sorgenti Java ma devono nire comunque nel classpath. La differenza tra la cartella main e quella test e che il contenuto di questultima non nisce mai nei pacchetti destinati alla produzione ma usato esclusivamente per lesecuzione dei test. Inne la cartella main contiene anche la sottocartella webapp dove si trova la webroot, ovvero le pagine web dellapplicazione ed il le web.xml. Per una descrizione completa dei le e delle cartelle standard di un progetto Regola kit si rimanda al capitolo 3 nella pagina 33

1.7. PERSISTENZA SU DATABASE

13

1.7

Persistenza su database

Regola kit abbraccia una metodologia di sviluppo incentrata sullanalisi del dominio del problema (Domain Driven Development) per cui il primo passo quello di creare le classi di modello. Spesso queste classi sono persistite sul database per cui si potrebbe iniziare scrivendo la classe e poi creando la corrispondente tabella sul database. Oppure, al contrario come faremo tra poco, creando prima la tabella del database e facendoci poi creare in automatico la classe Java (nel prossimo paragrafo 1.9 nella pagina seguente). Colleghiamoci nuovamente al database clienti.
1

n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mysql u r o o t p c l i e n t i

Creiamo una piccola tabella con la sola chiave primaria (id) ed un campo di descrizione (label).
1

3 5 7 9

mysql> c r e a t e t a b l e p r o d o t t i ( i d i n t ( 1 1 ) not n u l l auto_increment , l a b e l v a r c h a r ( 8 0 ) not n u l l , primary key ( i d ) ) ; mysql> d e s c r i b e p r o d o t t i ; +++++++ | F i e l d | Type | N u l l | Key | D e f a u l t | Extra | +++++++ | id | int (11) | NO | PRI | NULL | auto_increment | | l a b e l | v a r c h a r ( 8 0 ) | NO | | | | +++++++ 2 rows i n set ( 0 . 0 2 s e c )

Inseriamo qualche dato nella tabella, ad esempio alcune descrizioni di esempio per vericare poi il funzionamento dellapplicazione.
1 3 5 7 9 11 13 15 17

mysql> i n s e r t i n t o p r o d o t t i v a l u e s ( n u l l , Query OK, 1 row a f f e c t e d ( 0 . 0 5 s e c ) mysql> i n s e r t i n t o p r o d o t t i v a l u e s ( n u l l , Query OK, 1 row a f f e c t e d ( 0 . 0 0 s e c ) mysql> i n s e r t i n t o p r o d o t t i v a l u e s ( n u l l , Query OK, 1 row a f f e c t e d ( 0 . 0 0 s e c ) mysql> s e l e c t from p r o d o t t i ; + + + | id | label | + + + | 1 | book | | 2 | bottle | | 3 | paper | + + + 3 rows i n set ( 0 . 0 1 s e c )

book ) ;

bottle ) ;

paper ) ;

Adesso il database contiene una tabella con dei dati che possiamo usare per persistere le nostre classi di modello. Usciamo dal database e torniamo allapplicazione.
mysql> e x i t

14

CAPITOLO 1. GETTING STARTED

1.8

(Ri)collegarsi al database

Al paragrafo 1.4 nella pagina 11 abbiamo congurato lapplicazione per utilizzare il nostro database in fase di esecuzione. Adesso dobbiamo fare in modo che anche in fase di sviluppo si possa accedere al database (ad esempio per usare i generatori di codice o lanciare la batteria di test). Il le da modicare src/test/resources/designtime.properties e deve essere aggiornato in modo da contenere lo username, la password ed il nome del database. Il risultato nale deve risultare simile al seguente:
1 3 5 7

... hibernate hibernate hibernate hibernate hibernate ...

. . . . .

d i a l e c t=o r g . h i b e r n a t e . d i a l e c t . MySQLDialect c o n n e c t i o n . d r i v e r _ c l a s s = com . mysql . j d b c . D r i v e r c o n n e c t i o n . u r l = j d b c : mysql : / / l o c a l h o s t / c l i e n t i c o n n e c t i o n . username = n i c o l a c o n n e c t i o n . password =

1.9

Classi di modello

Siete ora in grado di scrivere la classe di modello che sar persistita sulla tabella prodotti... oppure potete farvela generare automaticamente e poi modicare convenientemente le classi prodotte. Userete gli Hibernate Tools che sono gi congurati allinterno delle applicazioni prodotte con Regola kit e trovano nellunico le src/test/resources/hibernate.reveng.xml la congurazione di tutto il processo di generazione inversa, a partire cio dal database. Specicate il nome della tabella da cui partire (prodotti alla riga 2), il nome della classe (Prodotto, al singolare e con la prima lettera maiuscola nella riga 4), il package da utilizzare (com.acme.model sempre alla riga 2).
1

... <t a b l e f i l t e r matchname=" p r o d o t t i " e x c l u d e=" f a l s e "/>

package="com . acme . model "

3 5 7

<t a b l e name=" p r o d o t t i " c l a s s=" P r o d o t t o " > <primarykey p r o p e r t y=" i d " /> </ t a b l e > ...

Ora avviate la generazione: posizionantevi nella cartella principale del vostro progetto ed utilizzate il plugin di Maven 2 Hibernate3 che consente di generare le classi java (il goal hbm2java), i le di mappaggio di hibernate (hbm2hbmxml) e la congurazione generale di hibernate (hbm2cfgxml).
1

n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mvn h i b e r n a t e 3 : hbm2java h i b e r n a t e 3 : hbm2hbmxml h i b e r n a t e 3 : hbm2cfgxml

Il primo le generato si trova nella posizione src/main/java/com/acme/model/Prodotto.java e contiene la classe Java:

1.9. CLASSI DI MODELLO


1 3 5 7 9 11 13 15

15

public c l a s s P r o d o t t o private I n t e g e r i d ; public P r o d o t t o ( ) { }

implements j a v a . i o . S e r i a l i z a b l e {

public I n t e g e r g e t I d ( ) { return t h i s . i d ; } public void s e t I d ( I n t e g e r i d ) { this . id = id ; } }

Poi stato creato il le con i mappaggi di hibernate src/main/resources/com/acme/model/Prodotto.hbm.xml, molto semplice in questo caso:
1

3 5

7 9 11

<?xml version=" 1 . 0 " ?> < !D C Y E h i b e r n a t e mapping PUBLIC "// H i b e r n a t e / H i b e r n a t e Mapping DTD O T P 3 . 0 / /EN" " h t t p : // h i b e r n a t e . s o u r c e f o r g e . n e t / h i b e r n a t e mapping 3 . 0 . dtd "> < ! Generated 14apr 2008 1 2 . 2 3 . 3 8 by H i b e r n a t e T o o l s 3 . 2 . 0 . CR1 > <h i b e r n a t e mapping> < c l a s s name="com . acme . model . P r o d o t t o " t a b l e=" p r o d o t t i " c a t a l o g=" c l i e n t i "> <i d name=" i d " t y p e=" j a v a . l a n g . I n t e g e r "> <column name=" i d " /> <g e n e r a t o r c l a s s=" i d e n t i t y " /> </ i d> </ c l a s s> </ h i b e r n a t e mapping>

Ed inne stato inserito un riferimento a questultimo le di mappaggio dentro la conguraizone principale di Hibernate src/main/resources/hibernate.cfg.xml (alla riga 13).
2 4 6

10

<?xml version=" 1 . 0 " e n c o d i n g=" u t f 8" ?> < !D C Y E h i b e r n a t e c o n f i g u r a t i o n PUBLIC O T P "// H i b e r n a t e / H i b e r n a t e C o n f i g u r a t i o n DTD 3 . 0 / /EN" " h t t p : // h i b e r n a t e . s o u r c e f o r g e . n e t / h i b e r n a t e c o n f i g u r a t i o n 3 . 0 . dtd "> <h i b e r n a t e c o n f i g u r a t i o n> <s e s s i o n f a c t o r y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . d r i v e r _ c l a s s ">com . mysql . j d b c . D r i v e r</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . password "></ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . u r l ">j d b c : m y s q l : // l o c a l h o s t / c l i e n t i</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . username ">n i c o l a</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . d i a l e c t ">o r g . h i b e r n a t e . d i a l e c t . MySQLDialect</ p r o p e r t y> <mapping r e s o u r c e="com/acme/ model / P r o d o t t i . hbm . xml" /> </ s e s s i o n f a c t o r y> </ h i b e r n a t e c o n f i g u r a t i o n>

12 14

Attenzione: il goal hibernate3:hbm2cfgxml cancella e riscrive ogni volta questo le ed inoltre vi aggiunge delle congurazioni che a runtime non sono usate (come username, password, url e driver class). Nellimpiego di tutti

16

CAPITOLO 1. GETTING STARTED

i giorni di Regola kit il nostro team di sviluppo non utilizza il goal hibernate3:hbm2cfgxml e si occupa di aggiungere manualmente i mappaggi delle risorse. Naturalmente le congurazioni non usate non costituiscono problema, per cui alla ne la scelta di impiegare o meno hibernate3:hbm2cfgxml lasciata alla vostra discrezione. Esistono altri goal disponibili, ad esempio la generazione degli script sql per creare le tabella a partire dalla congurazione delle classi. Si rimanda, per approfondimenti, al capitolo 5 nella pagina 41.

1.10

Dal modello alla presentazione

Adesso che avete creato la classe di modello il momento di realizzare il codice per leggere e scrivere oggetti (della classe Prodotto) sul database, le pagine web che elenchino questi oggetti cos come la pagine di dettaglio per eettuare modiche. Questo codice pu essere scritto a mano oppure potete partire facendovi generare automaticamente della classi di default che utilizzerete come modello di partenza per le vostre modiche. Prima di lanciare il generatore di Regola kit bisogna assicurarsi che il progetto sia compilato e poi invocare il goals exec:java che avvia il generatore.
1

n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mvn c o m p i l e n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mvn e x e c : j a v a Dexec . a r g s="c com . acme . model . P r o d o t t o m"

Noterete tra i parametri passati al comando il nome della classe attorno a cui costruire i vari livelli e lopzione m che specica di utilizzare unampia catena di generatori, in particolare:

dao modelPattern properties list-handler list form-handler form

produce il custom dao produce la classe necessaria a Model Pattern aggiunge le chiavi per la localizzazione genera il controller dietro la pagina di lista genera la pagina di lista genera il controller dietro la pagina di dettaglio genera la pagina di dettaglio

I generatori possono anche essere avviati individualmente. Per scoprire come e conoscere anche altri generatori forniti con Regola kit si rimanda al capitolo 7.4 nella pagina 50.

1.11. USARE ECLIPSE

17

1.11

Usare Eclipse

Per lavorare sul progetto appena creato con Eclipse basta lanciare il comando seguente che provvede a creare tutti i le necessari a quellambiente:
n i c o l a @ c a s p e r : ~ / p r o j e c t s / c l i e n t i# mvn e c l i p s e : e c l i p s e

A questo punto basta importare il progetto nel workspace con la voce di menu File | Import : magari senza settare lopzione di copia e quindi lavorando sul progetto nella sua cartella originale.

18

CAPITOLO 1. GETTING STARTED

Capitolo

Installazione
2.1 Maven 2

Regola kit utilizza Maven 2 per la gestione del ciclo di build per cui non necessario installare altro che Maven 2 (la version 2.0.9 stata testata dal nostro gruppo ma dovrebbero funzionare anche altre versioni). Quindi il primo passo scaricare dal sito di Apache il pacchetto corrispondente alla vostra versione del sistema operativo e seguire le indicazioni del produttore. Per vericare che tutto sia andato a buon ne aprendo una console di terminale e lanciate il seguente comando.
1 3

n i c o l a @ c a s p e r : ~# mvn v e r s i o n Maven v e r s i o n : 2 . 0 . 9 Java v e r s i o n : 1 . 6 . 0 _03 OS name : " l i n u x " v e r s i o n : " 2.6.22 14 g e n e r i c " a r c h : " i 3 8 6 " Family : " u n i x "

Se tutto corretto Maven 2 risponde al comando restituendo la sua versione, quella di Java ed inne alcune informazioni circa il sistema operativo in uso. Ora necessario congurare Maven 2 in modo da aggiungere il deposito di Regola kit a quelli utilizzati durante le fasi di build. Anche per questo si rimanda alla documentazione di Maven 2 per un modo molto veloce quello di modicare il le /YOUR_HOME_DIR/.m2/settings.xml in modo che assomigli al frammento seguente:
2 4 6

<?xml version=" 1 . 0 " e n c o d i n g="UTF8" ?> < s e t t i n g s> <m i r r o r s> <m i r r o r> < ! This i s used t o d i r e c t t h e p u b l i c s n a p s h o t s r e p o i n t h e profile b e l o w o v e r t o a d i f f e r e n t nexus group > <i d>nexusp u b l i c s n a p s h o t s</ i d>

19

20

CAPITOLO 2. INSTALLAZIONE

10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52

<m i r r o r O f>p u b l i c s n a p s h o t s</ m i r r o r O f> <u r l>h t t p : / / 1 3 7 . 2 0 4 . 2 4 . 1 7 3 : 8 0 8 2 / nexus / c o n t e n t / g r o u p s / p u b l i c s n a p s h o t s</ u r l> </ m i r r o r> <m i r r o r> < !This s e n d s e v e r y t h i n g e l s e t o / p u b l i c > <i d>nexus</ i d> <m i r r o r O f></ m i r r o r O f> <u r l>h t t p : / / 1 3 7 . 2 0 4 . 2 4 . 1 7 3 : 8 0 8 2 / nexus / c o n t e n t / g r o u p s / p u b l i c</ u r l> </ m i r r o r> </ m i r r o r s> < p r o f i l e s> < p r o f i l e> <a c t i v a t i o n> <a c t i v e B y D e f a u l t>t r u e</ a c t i v e B y D e f a u l t> </ a c t i v a t i o n> < r e p o s i t o r i e s> <r e p o s i t o r y> <i d>m i r r o r . workaround</ i d> <name>e n a b l e m i r r o r o f</name> <u r l>h t t p : //dummy</ u r l> < r e l e a s e s> <e n a b l e d>t r u e</ e n a b l e d> </ r e l e a s e s> <s n a p s h o t s> <e n a b l e d>t r u e</ e n a b l e d> </ s n a p s h o t s> </ r e p o s i t o r y> </ r e p o s i t o r i e s> <p l u g i n R e p o s i t o r i e s> <p l u g i n R e p o s i t o r y> <i d>p u b l i c s n a p s h o t s</ i d> <u r l>h t t p : // p u b l i c s n a p s h o t s</ u r l> < r e l e a s e s> <e n a b l e d>t r u e</ e n a b l e d> </ r e l e a s e s> <s n a p s h o t s> <e n a b l e d>t r u e</ e n a b l e d> </ s n a p s h o t s> </ p l u g i n R e p o s i t o r y> </ p l u g i n R e p o s i t o r i e s> </ p r o f i l e> </ p r o f i l e s> </ s e t t i n g s>

La congurazione proposta prevede linstallazione di un Maven Proxy (consigliamo Nexus) che risponda ad un indirizzo locale (nellesempio allip 137.204.24.173 sulla porta 8082 ma ovviamente qualsiasi altra posizione altrettanto corretta). A questo punto potete iniziare ad usare Regola kit ad esempio seguendo i nostri tutorial. Opzionalmente possibile installare anche alcuni script (chiamati Regola kit Commands) che risparmiano la digitazione dei comandi Maven 2 pi lunghi. Si tratta di scaricare il le contenente i comandi, decomprimerli in una cartella qualsiasi ed aggiungere tale cartella alla variabile di ambiente

2.2. LICENZA

21

PATH. Da quel momento potrete lanciare i comandi da qualsiasi posizione sul le system. Come detto Regola kit Commands un pacchetto opzionale e non necessario per lavorare con Regola kit.

2.2

Licenza

Regola kit software libero ed rilasciato sotto la licenza GPL nella sua versione 3 o successive. Per deroghe o particolari esigenze di tipo commerciale necessario contattare gli autori per ottenere una versione licenziata diversamente.

2.3

Librerie

Regola kit si compone di alcuni sotto progetti in cui sono ripartite la varie funzionalit. Si parte dal modulo regola-core e regola-dao che provvedono ad implementare il Model Pattern per diversi ORM (ad esempio Hibernate, JPA ed altri). Segue poi regola-jsf e regola-components che raccoglie tutte le congurazioni e le librerie (poche) di supporto alla scrittura di applicazioni web con Spring framework, Icefaces e Spring MCV, CXF e Portlet. Di contorno abbiamo poi regola-security per usare Acegi o Spring Security e regola-rest per servizi web di tipo RESTfull. Per il supporto al single-sign-on con CAS stato realizzato il modulo regola-cas. Chiude il quadro regolacode-codeassistence che supporta lo sviluppatore nella scrittura del codice producendo CustomDAO, CustomManager, le pagine web con la lista ed il dettaglio, le congurazione di WebFlow, le denizione dei mock per i test, il Model Pattern ed altro. regola-cas-client fornisce la librerie per utilizzare il server di autenticazione centralizzata CAS, un prodotto libero che consente il Single Sign On regola-codeassistence il generatore di codice per Regola kit che prevede anche uninterfaccia Swing. Aiuta a scrivere diversi elementi applicativi come i custom DAO, i manager, le pagine web, i le localizzati, i Model Pattern, i descrittori dei Mock ed altro. regola-core il nucleo dellimplementazione del Model Pattern regola-dao contiene tutti i sotto progetti che implementano Model Pattern con diversi ORM ad esempio Hibernate, JPA, JDO, ecc. regola-event-broker obsoleta regola-example-simple obsoleta regola-example-webgalileo obsoleta

22

CAPITOLO 2. INSTALLAZIONE

regola-ide-eclipse obsoleta regola-jsf contiene tutte le librerie necessarie al funzionamento ed alla congurazione di unapplicazione web basato su Java Server Faces. regola-jsf-archetype lo scaold di una nuova applicazione web basata su IceFaces, Spring MVC ed Hibernate regola-jsf-components implementa le librerie di Regola kit per diversi componenti JSF. Attualmente solo IceFaces. regola-maven-plugin obsoleto regola-rest supporto per la creazione di webservice REST basati su CXF. regola-security supporto per Acegi/Spring Security regola-validation obsoleto

2.4

Dipendenze

Uno dei vantaggi di utilizzare Maven 2 per la gestione del ciclo di build quello di potersi disinteressare delle dipendenze che sono scaricate in automatico al momento della build ed utilizzare per costruire i war le. Le dipendenze di Regola kit possono comunque essere ottenute utilizzando il comando:
1

n i c o l a @ c a s p e r : ~# mvn dependency : : t r e e

Sono riportate di seguito le dipendenze per i sotto progetti pi rilevanti.


1 3 5 7 9 11

o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT [ INFO ] + j u n i t : j u n i t : j a r : 4 . 4 : t e s t [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g t e s t : j a r : 2 . 5 . 4 : t e s t [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : t e s t [ INFO ] | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : t e s t [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g j d b c : j a r : 2 . 5 . 4 : t e s t [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | \ a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e [ INFO ] \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] o r g . r e g o l a : r e g o l a h i b e r n a t e : j a r : 1 . 1 SNAPSHOT + o r g . r e g o l a : r e g o l a c o r e : testj a r : t e s t s : 1 . 1 SNAPSHOT: t e s t + j u n i t : j u n i t : j a r : 4 . 4 : t e s t + h s q l d b : h s q l d b : j a r : 1 . 8 . 0 . 7 : t e s t + o r g . s p r i n g f r a m e w o r k : s p r i n g t e s t : j a r : 2 . 5 . 4 : t e s t + o r g . s p r i n g f r a m e w o r k : s p r i n g j d b c : j a r : 2 . 5 . 4 : c o m p i l e | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e | \ o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e + o r g . s p r i n g f r a m e w o r k : s p r i n g orm : j a r : 2 . 5 . 4 : c o m p i l e | \ a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e

2 4 6 8 10 12 14

2.4. DIPENDENZE
16 18 20 22

23

[ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + c g l i b : c g l i b nodep : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] \ o r g . h i b e r n a t e : h i b e r n a t e : j a r : 3 . 2 . 5 . ga : c o m p i l e [ INFO ] + n e t . s f . e h c a c h e : e h c a c h e : j a r : 1 . 2 . 3 : c o m p i l e [ INFO ] + j a v a x . t r a n s a c t i o n : j t a : j a r : 1 . 0 . 1 B : c o m p i l e [ INFO ] + dom4j : dom4j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] + a n t l r : a n t l r : j a r : 2 . 7 . 6 : c o m p i l e [ INFO ] \ commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 2 . 1 . 1 : c o m p i l e o r g . r e g o l a : r e g o l a j p a : j a r : 1 . 1 SNAPSHOT [ INFO ] + o r g . r e g o l a : r e g o l a c o r e : testj a r : t e s t s : 1 . 1 SNAPSHOT: t e s t [ INFO ] + j u n i t : j u n i t : j a r : 4 . 4 : t e s t [ INFO ] + h s q l d b : h s q l d b : j a r : 1 . 8 . 0 . 7 : t e s t [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g j d b c : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | \ o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + t o p l i n k . e s s e n t i a l s : t o p l i n k e s s e n t i a l s : j a r : 2 . 0 5 8 g : t e s t [ INFO ] + o r g . h i b e r n a t e : h i b e r n a t e e n t i t y m a n a g e r : j a r : 3 . 2 . 1 . ga : t e s t [ INFO ] | + o r g . h i b e r n a t e : h i b e r n a t e a n n o t a t i o n s : j a r : 3 . 2 . 1 . ga : t e s t [ INFO ] | | \ o r g . h i b e r n a t e : h i b e r n a t e : j a r : 3 . 2 . 5 . ga : t e s t ( v e r s i o n managed from 3 . 2 . 1 . ga ) [ INFO ] | | + n e t . s f . e h c a c h e : e h c a c h e : j a r : 1 . 2 . 3 : t e s t [ INFO ] | | + j a v a x . t r a n s a c t i o n : j t a : j a r : 1 . 0 . 1 B : t e s t [ INFO ] | | + asm : asma t t r s : j a r : 1 . 5 . 3 : t e s t [ INFO ] | | + dom4j : dom4j : j a r : 1 . 6 . 1 : t e s t [ INFO ] | | + a n t l r : a n t l r : j a r : 2 . 7 . 6 : t e s t [ INFO ] | | + c g l i b : c g l i b : j a r : 2 . 1 _3 : t e s t [ INFO ] | | \ asm : asm : j a r : 1 . 5 . 3 : t e s t [ INFO ] | + j b o s s : j a v a s s i s t : j a r : 3 . 3 . ga : t e s t [ INFO ] | \ j b o s s : j b o s s a r c h i v e b r o w s i n g : j a r : 5 . 0 . 0 alpha 200607201 119: t e s t [ INFO ] + o r g . apache . o p e n j p a : o p e n j p a : j a r : 1 . 0 . 0 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpal i b : j a r : 1 . 0 . 0 : t e s t [ INFO ] | | + l o g 4 j : l o g 4 j : j a r : 1 . 2 . 1 3 : t e s t [ INFO ] | | + commonsl a n g : commonsl a n g : j a r : 2 . 1 : t e s t [ INFO ] | | + ant : ant : j a r : 1 . 6 . 5 : t e s t [ INFO ] | | + commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 3 . 2 : t e s t [ INFO ] | | \ n e t . s o u r c e f o r g e . s e r p : s e r p : j a r : 1 . 1 3 . 1 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpak e r n e l : j a r : 1 . 0 . 0 : t e s t [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimojms_1 . 1 _spec : j a r : 1 . 0 . 1 : t e s t [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimojta_1 . 1 _spec : j a r : 1 . 1 : t e s t [ INFO ] | | \ commonsp o o l : commonsp o o l : j a r : 1 . 3 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpak e r n e l 5: j a r : 1 . 0 . 0 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpaj d b c : j a r : 1 . 0 . 0 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpajdbc 5: j a r : 1 . 0 . 0 : t e s t [ INFO ] | | \ j a v a x . xml . bind : jaxba p i : j a r : 2 . 0 : t e s t [ INFO ] | | + j a v a x . xml . bind : j s r 1 7 3 _ a p i : j a r : 1 . 0 : t e s t [ INFO ] | | \ j a v a x . a c t i v a t i o n : a c t i v a t i o n : j a r : 1 . 1 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpap e r s i s t e n c e : j a r : 1 . 0 . 0 : t e s t [ INFO ] | | \ o r g . apache . geronimo . s p e c s : geronimojpa_3 . 0 _spec : j a r : 1 . 0 : t e s t [ INFO ] | + o r g . apache . o p e n j p a : openjpap e r s i s t e n c e j d b c : j a r : 1 . 0 . 0 : t e s t [ INFO ] | \ o r g . apache . o p e n j p a : openjpax m l s t o r e : j a r : 1 . 0 . 0 : t e s t [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g t e s t : j a r : 2 . 5 . 4 : t e s t [ INFO ] + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g orm : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | \ a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + j a v a x . p e r s i s t e n c e : p e r s i s t e n c e a p i : j a r : 1 . 0 : c o m p i l e

2 4 6 8 10 12 14

16 18 20 22 24 26 28 30 32

34 36 38 40 42 44 46 48 50

24
52

CAPITOLO 2. INSTALLAZIONE

[ INFO ] \ n e t . b z d y l . e j b 3 c r i t e r i a : e j b 3 c r i t e r i a : j a r : 0 . 2 SNAPSHOT: system [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] o r g . r e g o l a : r e g o l a o g n l : j a r : 1 . 1 SNAPSHOT + o r g . r e g o l a : r e g o l a c o r e : testj a r : t e s t s : 1 . 1 SNAPSHOT: t e s t + j u n i t : j u n i t : j a r : 4 . 4 : t e s t + h s q l d b : h s q l d b : j a r : 1 . 8 . 0 . 7 : t e s t + o r g . s p r i n g f r a m e w o r k : s p r i n g t e s t : j a r : 2 . 5 . 4 : t e s t + o r g . s p r i n g f r a m e w o r k : s p r i n g j d b c : j a r : 2 . 5 . 4 : c o m p i l e | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e | \ o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e + o r g . s p r i n g f r a m e w o r k : s p r i n g orm : j a r : 2 . 5 . 4 : c o m p i l e | \ a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e \ o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e

1 3 5 7 9 11 13 15

1 3 5 7 9 11 13

15

o r g . r e g o l a : r e g o l a s e c u r i t y : j a r : 1 . 1 SNAPSHOT [ INFO ] + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e [ INFO ] | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + j a v a x . s e r v l e t : s e r v l e t a p i : j a r : 2 . 4 : p r o v i d e d [ INFO ] + j u n i t : j u n i t : j a r : 4 . 4 : t e s t [ INFO ] \ o r g . s p r i n g f r a m e w o r k . s e c u r i t y : s p r i n g s e c u r i t y c o r e : j a r : 2 . 0 . 0 : c o m p i l e [ INFO ] + commonsc o d e c : commonsc o d e c : j a r : 1 . 3 : c o m p i l e [ INFO ] \ commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 3 . 2 : c o m p i l e [ INFO ] o r g . r e g o l a : r e g o l a eventb r o k e r : j a r : 1 . 1 SNAPSHOT [ INFO ] + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] \ commonsl a n g : commonsl a n g : j a r : 2 . 3 : c o m p i l e [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ dependency : t r e e ] o r g . r e g o l a : r e g o l a v a l i d a t i o n : j a r : 1 . 1 SNAPSHOT + j u n i t : j u n i t : j a r : 4 . 4 : t e s t + c g l i b : c g l i b nodep : j a r : 2 . 1 _3 : c o m p i l e + o r g . h i b e r n a t e : h i b e r n a t e a n n o t a t i o n s : j a r : 3 . 2 . 1 . ga : c o m p i l e | + o r g . h i b e r n a t e : h i b e r n a t e : j a r : 3 . 2 . 1 . ga : c o m p i l e | | + n e t . s f . e h c a c h e : e h c a c h e : j a r : 1 . 2 . 3 : c o m p i l e | | + j a v a x . t r a n s a c t i o n : j t a : j a r : 1 . 0 . 1 B : c o m p i l e | | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e | | + dom4j : dom4j : j a r : 1 . 6 . 1 : c o m p i l e | | + a n t l r : a n t l r : j a r : 2 . 7 . 6 : c o m p i l e | | \ commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 2 . 1 . 1 : c o m p i l e | \ j a v a x . p e r s i s t e n c e : p e r s i s t e n c e a p i : j a r : 1 . 0 : c o m p i l e + o r g . h i b e r n a t e : h i b e r n a t e commonsa n n o t a t i o n s : j a r : 3 . 0 . 0 . ga : c o m p i l e + xstream : xstream : j a r : 1 . 0 . 2 : c o m p i l e + commonsl a n g : commonsl a n g : j a r : 2 . 3 : c o m p i l e \ jdom : jdom : j a r : 1 . 0 : c o m p i l e

1 3 5 7 9 11 13 15 17

[ INFO ] o r g . r e g o l a : r e g o l a j s f : j a r : 1 . 1 SNAPSHOT [ INFO ] + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e

2.4. DIPENDENZE
4 6 8 10

25

12

14 16 18 20 22 24 26

28 30 32 34 36 38 40 42 44 46 48

50 52 54

56 58

[ INFO ] | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e [ INFO ] + o r g . r e g o l a : r e g o l a eventb r o k e r : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] | \ commonsl a n g : commonsl a n g : j a r : 2 . 3 : c o m p i l e [ INFO ] + o r g . r e g o l a : r e g o l a v a l i d a t i o n : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | + c g l i b : c g l i b nodep : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] | + o r g . h i b e r n a t e : h i b e r n a t e commonsa n n o t a t i o n s : j a r : 3 . 0 . 0 . ga : c o m p i l e [ INFO ] | \ jdom : jdom : j a r : 1 . 0 : c o m p i l e [ INFO ] + o r g . r e g o l a : r e g o l a s e c u r i t y : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | \ o r g . s p r i n g f r a m e w o r k . s e c u r i t y : s p r i n g s e c u r i t y c o r e : j a r : 2 . 0 . 0 : c o m p i l e [ INFO ] + j u n i t : j u n i t : j a r : 4 . 4 : t e s t [ INFO ] + f r e e m a r k e r : f r e e m a r k e r : j a r : 2 . 3 . 8 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e [ INFO ] | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g web : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t s u p p o r t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k : s p r i n g webmvc : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] + o r g . t u c k e y : u r l r e w r i t e f i l t e r : j a r : 3 . 0 . 4 : c o m p i l e [ INFO ] | + ant : ant : j a r : 1 . 5 : c o m p i l e [ INFO ] | \ l o g 4 j : l o g 4 j : j a r : 1 . 2 . 8 : c o m p i l e [ INFO ] + j a v a x . s e r v l e t : s e r v l e t a p i : j a r : 2 . 4 : p r o v i d e d ( s c o p e not updated t o compile ) [ INFO ] + o r g . h i b e r n a t e : h i b e r n a t e a n n o t a t i o n s : j a r : 3 . 2 . 1 . ga : c o m p i l e [ INFO ] | \ j a v a x . p e r s i s t e n c e : p e r s i s t e n c e a p i : j a r : 1 . 0 : c o m p i l e [ INFO ] + o r g . h i b e r n a t e : h i b e r n a t e : j a r : 3 . 2 . 3 . ga : c o m p i l e [ INFO ] | + n e t . s f . e h c a c h e : e h c a c h e : j a r : 1 . 2 . 3 : c o m p i l e [ INFO ] | + j a v a x . t r a n s a c t i o n : j t a : j a r : 1 . 0 . 1 B : c o m p i l e [ INFO ] | + asm : asma t t r s : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | + dom4j : dom4j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] | + a n t l r : a n t l r : j a r : 2 . 7 . 6 : c o m p i l e [ INFO ] | + c g l i b : c g l i b : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] | + asm : asm : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | \ commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] + a s p e c t j : a s p e c t j w e a v e r : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] + xstream : xstream : j a r : 1 . 0 . 2 : c o m p i l e [ INFO ] + o r g . apache . m y fa ce s . c o r e : myfacesa p i : j a r : 1 . 2 . 4 : c o m p i l e [ INFO ] + o r g . apache . m y fa ce s . c o r e : myfacesimpl : j a r : 1 . 2 . 4 : c o m p i l e [ INFO ] | + commonsd i s c o v e r y : commonsd i s c o v e r y : j a r : 0 . 4 : c o m p i l e [ INFO ] | + commonsc o d e c : commonsc o d e c : j a r : 1 . 3 : c o m p i l e [ INFO ] | + commonsb e a n u t i l s : commonsb e a n u t i l s : j a r : 1 . 7 . 0 : c o m p i l e [ INFO ] | \ commonsd i g e s t e r : commonsd i g e s t e r : j a r : 1 . 8 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t c o r e : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f a p i : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimoa c t i v a t i o n _ 1 . 1 _spec : j a r : 1 . 0 . 2 : c o m p i l e [ INFO ] | | + o r g . c o d e h a u s . woodstox : wstxa s l : j a r : 3 . 2 . 4 : c o m p i l e [ INFO ] | | + o r g . apache . n e e t h i : n e e t h i : j a r : 2 . 0 . 4 : c o m p i l e [ INFO ] | | \ o r g . apache . c x f : c x f commonschemas : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + com . sun . xml . bind : jaxbimpl : j a r : 2 . 1 . 6 : c o m p i l e [ INFO ] | + o r g . apache . ws . commons . schema : XmlSchema : j a r : 1 . 4 . 2 : c o m p i l e [ INFO ] | + o r g . apache . geronimo . s p e c s : geronimojavamail_1 . 4 _spec : j a r : 1 . 3 : c o m p i l e [ INFO ] | \ com . sun . xml . f a s t i n f o s e t : F a s t I n f o s e t : j a r : 1 . 2 . 2 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t f r o n t e n d s i m p l e : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . geronimo . s p e c s : geronimojaxws_2 . 1 _spec : j a r : 1 . 0 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t b i n d i n g s soap : j a r : 2 . 1 . 1 : c o m p i l e

26
60 62 64

CAPITOLO 2. INSTALLAZIONE

66 68 70 72 74 76

78 80

82

84 86 88 90 92

94

96

[ INFO ] | | + o r g . apache . c x f : c x f t o o l s common : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | + v e l o c i t y : v e l o c i t y : j a r : 1 . 4 : c o m p i l e [ INFO ] | | | | \ v e l o c i t y : v e l o c i t y dep : j a r : 1 . 4 : r u n t i m e [ INFO ] | | | + com . sun . xml . bind : jaxbx j c : j a r : 2 . 1 . 6 : c o m p i l e [ INFO ] | | | \ o r g . apache . geronimo . s p e c s : geronimowsmetadata_2 . 0 _spec : j a r : 1 . 1 . 2 : c o m p i l e [ INFO ] | | \ o r g . apache . c x f : c x f r t d a t a b i n d i n g j a x b : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | \ j a v a x . xml . soap : s a a j a p i : j a r : 1 . 3 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t f r o n t e n d jaxws : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t b i n d i n g s xml : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t wsaddr : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | \ com . sun . xml . m e s s a g i n g . s a a j : s a a j impl : j a r : 1 . 3 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t d a t a b i n d i n g a e g i s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + n e t . j a v a . dev . s t a x u t i l s : s t a x u t i l s : j a r : 2 0 0 6 0 5 0 2 : c o m p i l e [ INFO ] | \ j a x e n : j a x e n : j a r : 1 . 1 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t t r a n s p o r t s l o c a l : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t t r a n s p o r t s h t t p : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t t r a n s p o r t s jms : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | \ o r g . apache . geronimo . s p e c s : geronimojms_1 . 1 _spec : j a r : 1 . 1 . 1 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t management : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f common u t i l i t i e s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . geronimo . s p e c s : geronimoannotation_1 . 0 _spec : j a r : 1 . 1 . 1 : c o m p i l e [ INFO ] | + j a v a x . xml . bind : jaxba p i : j a r : 2 . 1 : c o m p i l e [ INFO ] | + o r g . apache . geronimo . s p e c s : geronimos t a x api_1 . 0 _spec : j a r : 1 . 0 . 1 : c o m p i l e [ INFO ] | + w s d l 4 j : w s d l 4 j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] | \ xmlr e s o l v e r : xmlr e s o l v e r : j a r : 1 . 2 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t wss e c u r i t y : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . ws . s e c u r i t y : w s s 4 j : j a r : 1 . 5 . 4 : c o m p i l e [ INFO ] | | + o r g . apache . s a n t u a r i o : x m l s e c : j a r : 1 . 4 . 0 : c o m p i l e [ INFO ] | | + opensaml : opensaml : j a r : 1 . 1 : c o m p i l e [ INFO ] | | \ b o u n c y c a s t l e : bcprovj d k 1 3 : j a r : 1 3 2 : c o m p i l e [ INFO ] | + x a l a n : x a l a n : j a r : 2 . 7 . 0 : c o m p i l e [ INFO ] | \ b o u n c y c a s t l e : bcprovj d k 1 4 : j a r : 1 3 6 : r u n t i m e [ INFO ] + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . f a c e s : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . webflow : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . b i n d i n g : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . j s : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] \ j b o s s : j b o s s e l : j a r : 1 . 0 : c o m p i l e [ INFO ] o r g . r e g o l a : r e g o l a j s f i c e f a c e s : j a r : 1 . 1 SNAPSHOT [ INFO ] + o r g . r e g o l a : r e g o l a j s f : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e [ INFO ] | + o r g . r e g o l a : r e g o l a eventb r o k e r : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | \ commonsl a n g : commonsl a n g : j a r : 2 . 3 : c o m p i l e [ INFO ] | + o r g . r e g o l a : r e g o l a v a l i d a t i o n : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | + c g l i b : c g l i b nodep : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] | | + o r g . h i b e r n a t e : h i b e r n a t e commonsa n n o t a t i o n s : j a r : 3 . 0 . 0 . ga : c o m p i l e [ INFO ] | | \ jdom : jdom : j a r : 1 . 0 : c o m p i l e [ INFO ] | + o r g . r e g o l a : r e g o l a s e c u r i t y : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | \ o r g . s p r i n g f r a m e w o r k . s e c u r i t y : s p r i n g s e c u r i t y c o r e : j a r : 2 . 0 . 0 : c o m p i l e [ INFO ] | + f r e e m a r k e r : f r e e m a r k e r : j a r : 2 . 3 . 8 : c o m p i l e

2 4 6 8 10

12

14

2.4. DIPENDENZE

27

16 18 20 22 24

26 28 30 32 34 36 38 40 42 44 46

48 50 52

54

56 58 60

62 64 66 68 70

[ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | + a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e [ INFO ] | | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g web : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t s u p p o r t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k : s p r i n g webmvc : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | + o r g . t u c k e y : u r l r e w r i t e f i l t e r : j a r : 3 . 0 . 4 : c o m p i l e [ INFO ] | | + j u n i t : j u n i t : j a r : 4 . 4 : t e s t ( v e r s i o n managed from 3 . 8 . 1 ; s c o p e managed from c o m p i l e ) [ INFO ] | | + j a v a x . s e r v l e t : s e r v l e t a p i : j a r : 2 . 3 : c o m p i l e [ INFO ] | | + ant : ant : j a r : 1 . 5 : c o m p i l e [ INFO ] | | \ l o g 4 j : l o g 4 j : j a r : 1 . 2 . 8 : c o m p i l e [ INFO ] | + o r g . h i b e r n a t e : h i b e r n a t e a n n o t a t i o n s : j a r : 3 . 2 . 1 . ga : c o m p i l e [ INFO ] | | \ j a v a x . p e r s i s t e n c e : p e r s i s t e n c e a p i : j a r : 1 . 0 : c o m p i l e [ INFO ] | + o r g . h i b e r n a t e : h i b e r n a t e : j a r : 3 . 2 . 3 . ga : c o m p i l e [ INFO ] | | + n e t . s f . e h c a c h e : e h c a c h e : j a r : 1 . 2 . 3 : c o m p i l e [ INFO ] | | + j a v a x . t r a n s a c t i o n : j t a : j a r : 1 . 0 . 1 B : c o m p i l e [ INFO ] | | + asm : asma t t r s : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | | + dom4j : dom4j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] | | + a n t l r : a n t l r : j a r : 2 . 7 . 6 : c o m p i l e [ INFO ] | | + c g l i b : c g l i b : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] | | \ asm : asm : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | + a s p e c t j : a s p e c t j w e a v e r : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | + xstream : xstream : j a r : 1 . 0 . 2 : c o m p i l e [ INFO ] | + o r g . apache . m y fa ce s . c o r e : myfacesa p i : j a r : 1 . 2 . 4 : c o m p i l e [ INFO ] | + o r g . apache . m y fa ce s . c o r e : myfacesimpl : j a r : 1 . 2 . 4 : c o m p i l e [ INFO ] | | + commonsd i s c o v e r y : commonsd i s c o v e r y : j a r : 0 . 4 : c o m p i l e [ INFO ] | | \ commonsc o d e c : commonsc o d e c : j a r : 1 . 3 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t c o r e : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f a p i : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | + o r g . apache . geronimo . s p e c s : geronimoa c t i v a t i o n _ 1 . 1 _spec : j a r : 1 . 0 . 2 : c o m p i l e [ INFO ] | | | + o r g . c o d e h a u s . woodstox : wstxa s l : j a r : 3 . 2 . 4 : c o m p i l e [ INFO ] | | | + o r g . apache . n e e t h i : n e e t h i : j a r : 2 . 0 . 4 : c o m p i l e [ INFO ] | | | \ o r g . apache . c x f : c x f commonschemas : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + com . sun . xml . bind : jaxbimpl : j a r : 2 . 1 . 6 : c o m p i l e [ INFO ] | | + o r g . apache . ws . commons . schema : XmlSchema : j a r : 1 . 4 . 2 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimojavamail_1 . 4 _spec : j a r : 1 . 3 : c o m p i l e [ INFO ] | | \ com . sun . xml . f a s t i n f o s e t : F a s t I n f o s e t : j a r : 1 . 2 . 2 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t f r o n t e n d s i m p l e : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimojaxws_2 . 1 _spec : j a r : 1 . 0 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t b i n d i n g s soap : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | + o r g . apache . c x f : c x f t o o l s common : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | | + v e l o c i t y : v e l o c i t y : j a r : 1 . 4 : c o m p i l e [ INFO ] | | | | | \ v e l o c i t y : v e l o c i t y dep : j a r : 1 . 4 : r u n t i m e [ INFO ] | | | | + com . sun . xml . bind : jaxbx j c : j a r : 2 . 1 . 6 : c o m p i l e [ INFO ] | | | | \ o r g . apache . geronimo . s p e c s : geronimowsmetadata_2 . 0 _spec : j a r : 1 . 1 . 2 : c o m p i l e [ INFO ] | | | \ o r g . apache . c x f : c x f r t d a t a b i n d i n g j a x b : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | \ j a v a x . xml . soap : s a a j a p i : j a r : 1 . 3 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t f r o n t e n d jaxws : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t b i n d i n g s xml : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t wsaddr : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | \ com . sun . xml . m e s s a g i n g . s a a j : s a a j impl : j a r : 1 . 3 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t d a t a b i n d i n g a e g i s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + n e t . j a v a . dev . s t a x u t i l s : s t a x u t i l s : j a r : 2 0 0 6 0 5 0 2 : c o m p i l e [ INFO ] | | \ j a x e n : j a x e n : j a r : 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t t r a n s p o r t s l o c a l : j a r : 2 . 1 . 1 : c o m p i l e

28
72 74

CAPITOLO 2. INSTALLAZIONE

76

78

80 82 84 86 88

90

92

94 96 98 100 102 104 106

[ INFO ] | + o r g . apache . c x f : c x f r t t r a n s p o r t s h t t p : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t t r a n s p o r t s jms : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | \ o r g . apache . geronimo . s p e c s : geronimojms_1 . 1 _spec : j a r : 1 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t management : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f common u t i l i t i e s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimoannotation_1 . 0 _spec : j a r : 1 . 1 . 1 : c o m p i l e [ INFO ] | | + j a v a x . xml . bind : jaxba p i : j a r : 2 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimos t a x api_1 . 0 _spec : j a r : 1 . 0 . 1 : c o m p i l e [ INFO ] | | + w s d l 4 j : w s d l 4 j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] | | \ xmlr e s o l v e r : xmlr e s o l v e r : j a r : 1 . 2 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t wss e c u r i t y : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . ws . s e c u r i t y : w s s 4 j : j a r : 1 . 5 . 4 : c o m p i l e [ INFO ] | | | + o r g . apache . s a n t u a r i o : x m l s e c : j a r : 1 . 4 . 0 : c o m p i l e [ INFO ] | | | + opensaml : opensaml : j a r : 1 . 1 : c o m p i l e [ INFO ] | | | \ b o u n c y c a s t l e : bcprovj d k 1 3 : j a r : 1 3 2 : c o m p i l e [ INFO ] | | + x a l a n : x a l a n : j a r : 2 . 7 . 0 : c o m p i l e [ INFO ] | | \ b o u n c y c a s t l e : bcprovj d k 1 4 : j a r : 1 3 6 : r u n t i m e [ INFO ] | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . f a c e s : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . webflow : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . b i n d i n g : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . j s : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | \ j b o s s : j b o s s e l : j a r : 1 . 0 : c o m p i l e [ INFO ] + com . i c e s o f t : i c e f a c e s : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | + com . i c e s o f t : i c e f a c e s comps : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | + com . i c e s o f t : i c e f a c e s f a c e l e t s : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | + com . i c e s o f t : b a ck p or t u t i l : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | + j a v a x . e l : e l a p i : j a r : 1 . 2 : c o m p i l e [ INFO ] | + j a v a x . e l : e l r i : j a r : 1 . 2 : c o m p i l e [ INFO ] | + commonsb e a n u t i l s : commonsb e a n u t i l s : j a r : 1 . 7 . 0 : c o m p i l e [ INFO ] | + commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 3 . 2 : c o m p i l e [ INFO ] | + commonsd i g e s t e r : commonsd i g e s t e r : j a r : 1 . 7 : c o m p i l e [ INFO ] | + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] | + commonsl o g g i n g : commonsl o g g i n g a p i : j a r : 1 . 1 : c o m p i l e [ INFO ] | + x e r c e s : x e r c e s I m p l : j a r : 2 . 7 . 1 : c o m p i l e [ INFO ] | \ xmla p i s : xmla p i s : j a r : 1 . 3 . 0 2 : c o m p i l e [ INFO ] \ commonsf i l e u p l o a d : commonsf i l e u p l o a d : j a r : 1 . 2 : c o m p i l e [ INFO ] o r g . r e g o l a : r e g o l a r e s t : j a r : 1 . 1 SNAPSHOT [ INFO ] + o r g . r e g o l a : r e g o l a j s f i c e f a c e s : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | + o r g . r e g o l a : r e g o l a j s f : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e [ INFO ] | | + o r g . r e g o l a : r e g o l a eventb r o k e r : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | + o r g . r e g o l a : r e g o l a v a l i d a t i o n : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | | + c g l i b : c g l i b nodep : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] | | | \ o r g . h i b e r n a t e : h i b e r n a t e commonsa n n o t a t i o n s : j a r : 3 . 0 . 0 . ga : c o m p i l e [ INFO ] | | + o r g . r e g o l a : r e g o l a s e c u r i t y : j a r : 1 . 1 SNAPSHOT: c o m p i l e [ INFO ] | | | \ o r g . s p r i n g f r a m e w o r k . s e c u r i t y : s p r i n g s e c u r i t y c o r e : j a r : 2 . 0 . 0 : c o m p i l e [ INFO ] | | + f r e e m a r k e r : f r e e m a r k e r : j a r : 2 . 3 . 8 : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | | + a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e [ INFO ] | | | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g web : j a r : 2 . 0 . 8 : c o m p i l e

2 4 6 8

10

12 14 16

2.4. DIPENDENZE

29

18 20 22 24 26 28 30 32 34 36 38 40 42 44

46 48 50 52

54

56

58 60 62 64 66 68 70 72

[ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g t x : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g c o n t e x t s u p p o r t : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g webmvc : j a r : 2 . 5 . 4 : c o m p i l e [ INFO ] | | + o r g . t u c k e y : u r l r e w r i t e f i l t e r : j a r : 3 . 0 . 4 : c o m p i l e [ INFO ] | | | + j a v a x . s e r v l e t : s e r v l e t a p i : j a r : 2 . 3 : c o m p i l e [ INFO ] | | | + ant : ant : j a r : 1 . 6 . 5 : c o m p i l e [ INFO ] | | | \ l o g 4 j : l o g 4 j : j a r : 1 . 2 . 8 : c o m p i l e [ INFO ] | | + o r g . h i b e r n a t e : h i b e r n a t e a n n o t a t i o n s : j a r : 3 . 2 . 1 . ga : c o m p i l e [ INFO ] | | | \ j a v a x . p e r s i s t e n c e : p e r s i s t e n c e a p i : j a r : 1 . 0 : c o m p i l e [ INFO ] | | + o r g . h i b e r n a t e : h i b e r n a t e : j a r : 3 . 2 . 3 . ga : c o m p i l e [ INFO ] | | | + n e t . s f . e h c a c h e : e h c a c h e : j a r : 1 . 2 . 3 : c o m p i l e [ INFO ] | | | + j a v a x . t r a n s a c t i o n : j t a : j a r : 1 . 0 . 1 B : c o m p i l e [ INFO ] | | | + asm : asma t t r s : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | | | + dom4j : dom4j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] | | | + a n t l r : a n t l r : j a r : 2 . 7 . 7 : c o m p i l e [ INFO ] | | | \ c g l i b : c g l i b : j a r : 2 . 1 _3 : c o m p i l e [ INFO ] | | + a s p e c t j : a s p e c t j w e a v e r : j a r : 1 . 5 . 3 : c o m p i l e [ INFO ] | | + xstream : xstream : j a r : 1 . 0 . 2 : c o m p i l e [ INFO ] | | + o r g . apache . m y fa ce s . c o r e : myfacesa p i : j a r : 1 . 2 . 4 : c o m p i l e [ INFO ] | | + o r g . apache . m y fa ce s . c o r e : myfacesimpl : j a r : 1 . 2 . 4 : c o m p i l e [ INFO ] | | | \ commonsd i s c o v e r y : commonsd i s c o v e r y : j a r : 0 . 4 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t f r o n t e n d s i m p l e : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t d a t a b i n d i n g a e g i s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | \ n e t . j a v a . dev . s t a x u t i l s : s t a x u t i l s : j a r : 2 0 0 6 0 5 0 2 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t t r a n s p o r t s l o c a l : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t t r a n s p o r t s jms : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | \ o r g . apache . geronimo . s p e c s : geronimojms_1 . 1 _spec : j a r : 1 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t management : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t wss e c u r i t y : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | + o r g . apache . ws . s e c u r i t y : w s s 4 j : j a r : 1 . 5 . 4 : c o m p i l e [ INFO ] | | | | + o r g . apache . s a n t u a r i o : x m l s e c : j a r : 1 . 4 . 0 : c o m p i l e [ INFO ] | | | | + opensaml : opensaml : j a r : 1 . 1 : c o m p i l e [ INFO ] | | | | \ b o u n c y c a s t l e : bcprovj d k 1 3 : j a r : 1 3 2 : c o m p i l e [ INFO ] | | | + x a l a n : x a l a n : j a r : 2 . 7 . 0 : c o m p i l e [ INFO ] | | | \ b o u n c y c a s t l e : bcprovj d k 1 4 : j a r : 1 3 6 : r u n t i m e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . f a c e s : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . webflow : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . b i n d i n g : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k . webflow : o r g . s p r i n g f r a m e w o r k . j s : j a r : 2 . 0 . 3 . RELEASE : c o m p i l e [ INFO ] | | \ j b o s s : j b o s s e l : j a r : 1 . 0 : c o m p i l e [ INFO ] | + com . i c e s o f t : i c e f a c e s : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | | + com . i c e s o f t : i c e f a c e s comps : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | | + com . i c e s o f t : i c e f a c e s f a c e l e t s : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | | + com . i c e s o f t : b a ck p or t u t i l : j a r : 1 . 7 . 2 : c o m p i l e [ INFO ] | | + j a v a x . e l : e l a p i : j a r : 1 . 2 : c o m p i l e [ INFO ] | | + j a v a x . e l : e l r i : j a r : 1 . 2 : c o m p i l e [ INFO ] | | + commonsb e a n u t i l s : commonsb e a n u t i l s : j a r : 1 . 7 . 0 : c o m p i l e [ INFO ] | | + commonsc o l l e c t i o n s : commonsc o l l e c t i o n s : j a r : 3 . 2 : c o m p i l e [ INFO ] | | + commonsd i g e s t e r : commonsd i g e s t e r : j a r : 1 . 7 : c o m p i l e [ INFO ] | | + commonsl o g g i n g : commonsl o g g i n g a p i : j a r : 1 . 1 : c o m p i l e [ INFO ] | | + x e r c e s : x e r c e s I m p l : j a r : 2 . 7 . 1 : c o m p i l e [ INFO ] | | \ xmla p i s : xmla p i s : j a r : 1 . 3 . 0 2 : c o m p i l e [ INFO ] | \ commonsf i l e u p l o a d : commonsf i l e u p l o a d : j a r : 1 . 2 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f r t f r o n t e n d j a x r s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f common u t i l i t i e s : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e

30
74

CAPITOLO 2. INSTALLAZIONE

76

78 80 82

84 86 88

90

92 94 96 98

100 102 104 106 108 110 112

114

116

118 120 122 124 126

[ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimoannotation_1 . 0 _spec : j a r : 1 . 1 . 1 : c o m p i l e [ INFO ] | | + j a v a x . xml . bind : jaxba p i : j a r : 2 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimos t a x api_1 . 0 _spec : j a r : 1 . 0 . 1 : c o m p i l e [ INFO ] | | + w s d l 4 j : w s d l 4 j : j a r : 1 . 6 . 1 : c o m p i l e [ INFO ] | | + xmlr e s o l v e r : xmlr e s o l v e r : j a r : 1 . 2 : c o m p i l e [ INFO ] | | + o r g . apache . ws . commons . schema : XmlSchema : j a r : 1 . 4 . 2 : c o m p i l e [ INFO ] | | \ commonsl a n g : commonsl a n g : j a r : 2 . 4 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f a p i : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimoa c t i v a t i o n _ 1 . 1 _spec : j a r : 1 . 0 . 2 : c o m p i l e [ INFO ] | | + o r g . c o d e h a u s . woodstox : wstxa s l : j a r : 3 . 2 . 4 : c o m p i l e [ INFO ] | | + o r g . apache . n e e t h i : n e e t h i : j a r : 2 . 0 . 4 : c o m p i l e [ INFO ] | | \ o r g . apache . c x f : c x f commonschemas : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t c o r e : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + com . sun . xml . bind : jaxbimpl : j a r : 2 . 1 . 6 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimojavamail_1 . 4 _spec : j a r : 1 . 3 : c o m p i l e [ INFO ] | | \ com . sun . xml . f a s t i n f o s e t : F a s t I n f o s e t : j a r : 1 . 2 . 2 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t f r o n t e n d jaxws : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . geronimo . s p e c s : geronimojaxws_2 . 1 _spec : j a r : 1 . 0 : c o m p i l e [ INFO ] | | + asm : asm : j a r : 2 . 2 . 3 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t b i n d i n g s soap : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | + o r g . apache . c x f : c x f t o o l s common : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | | | + v e l o c i t y : v e l o c i t y : j a r : 1 . 4 : c o m p i l e [ INFO ] | | | | | \ v e l o c i t y : v e l o c i t y dep : j a r : 1 . 4 : r u n t i m e [ INFO ] | | | | + com . sun . xml . bind : jaxbx j c : j a r : 2 . 1 . 6 : c o m p i l e [ INFO ] | | | | \ o r g . apache . geronimo . s p e c s : geronimowsmetadata_2 . 0 _spec : j a r : 1 . 1 . 2 : c o m p i l e [ INFO ] | | | \ o r g . apache . c x f : c x f r t d a t a b i n d i n g j a x b : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t b i n d i n g s xml : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + o r g . apache . c x f : c x f r t wsaddr : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | | + j a v a x . xml . soap : s a a j a p i : j a r : 1 . 3 : c o m p i l e [ INFO ] | | \ com . sun . xml . m e s s a g i n g . s a a j : s a a j impl : j a r : 1 . 3 : c o m p i l e [ INFO ] | + j a v a x . ws . r s : j s r 3 1 1 a p i : j a r : 0 . 6 : c o m p i l e [ INFO ] | + o r g . apache . c x f : c x f r t t r a n s p o r t s h t t p : j a r : 2 . 1 . 1 : c o m p i l e [ INFO ] | + j a x e n : j a x e n : j a r : 1 . 1 : c o m p i l e [ INFO ] | | \ jdom : jdom : j a r : 1 . 0 : c o m p i l e [ INFO ] | + o r g . apache . a bde ra : abderac o r e : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | | \ o r g . apache . a bde ra : abderai 1 8 n : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | + o r g . apache . a bde ra : abderap a r s e r : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | | \ o r g . apache . ws . commons . axiom : axiomimpl : j a r : 1 . 2 . 5 : c o m p i l e [ INFO ] | | \ o r g . apache . ws . commons . axiom : axioma p i : j a r : 1 . 2 . 7 : c o m p i l e [ INFO ] | + o r g . apache . a bde ra : abderae x t e n s i o n s j s o n : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | | + o r g . apache . a bde ra : abderas e r v e r : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | | + o r g . apache . a bde ra : abderae x t e n s i o n s main : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | | \ o r g . apache . a bde ra : abderae x t e n s i o n s html : j a r : 0 . 4 . 0 i n c u b a t i n g : c o m p i l e [ INFO ] | | \ nu . v a l i d a t o r . h t m l p a r s e r : h t m l p a r s e r : j a r : 1 . 0 . 5 : c o m p i l e [ INFO ] | + o r g . c o d e h a u s . j e t t i s o n : j e t t i s o n : j a r : 1 . 0 : c o m p i l e [ INFO ] | \ o r g . apache . xmlbeans : xmlbeans : j a r : 2 . 3 . 0 : c o m p i l e [ INFO ] + o r g . apache . c x f : c x f d i s t r i b u t i o n m a n i f e s t : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s v a l i d a t o r : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s w s d l t o c o r e : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s m i s c t o o l s : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s w s d l t o d a t a b i n d i n g j a x b : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s c o r b a : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s w s d l t o f r o n t e n d jaxws : j a r : 2 . 1 . 1 : t e s t

2.4. DIPENDENZE
[ INFO ] | + o r g . apache . c x f : c x f t o o l s w s d l t o f r o n t e n d j a v a s c r i p t : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f t o o l s j av a2 w s : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f x j c dv : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f x j c t s : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t b i n d i n g s o b j e c t : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t b i n d i n g s c o r b a : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t b i n d i n g s c o l o c : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t b i n d i n g s h t t p : j a r : 2 . 1 . 1 : t e s t [ INFO ] | | \ o r g . c o d e h a u s . j r a : j r a : j a r : 1 . 0 alpha 4: t e s t [ INFO ] | + o r g . apache . c x f : c x f r t d a t a b i n d i n g xmlbeans : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t wsrm : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t wsp o l i c y : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t f r o n t e n d j s : j a r : 2 . 1 . 1 : t e s t [ INFO ] | | \ r h i n o : j s : j a r : 1 . 6 R7 : t e s t [ INFO ] | + o r g . apache . c x f : c x f r t j a v a s c r i p t : j a r : 2 . 1 . 1 : t e s t [ INFO ] | \ o r g . apache . c x f : c x f bu n dle : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . mortbay . j e t t y : j e t t y u t i l : j a r : 6 . 1 . 9 : t e s t [ INFO ] | \ o r g . s l f 4 j : s l f 4 j a p i : j a r : 1 . 3 . 1 : t e s t [ INFO ] + o r g . apache . c x f : c x f r t t r a n s p o r t s httpj e t t y : j a r : 2 . 1 . 1 : t e s t [ INFO ] | + o r g . mortbay . j e t t y : j e t t y : j a r : 6 . 1 . 9 : t e s t [ INFO ] | + o r g . s l f 4 j : s l f 4 j j d k 1 4 : j a r : 1 . 3 . 1 : t e s t [ INFO ] | \ o r g . apache . geronimo . s p e c s : geronimos e r v l e t _ 2 . 5 _spec : j a r : 1 . 2 : t e s t [ INFO ] \ commonsh t t p c l i e n t : commonsh t t p c l i e n t : j a r : 3 . 0 . 1 : c o m p i l e [ INFO ] + j u n i t : j u n i t : j a r : 4 . 4 : t e s t [ INFO ] + commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e [ INFO ] \ commonsc o d e c : commonsc o d e c : j a r : 1 . 2 : c o m p i l e [ [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ INFO ] [ o r g . r e g o l a : r e g o l a c o d e a s s i s t e n c e : j a r : 1 . 1 SNAPSHOT + o r g . r e g o l a : r e g o l a c o r e : j a r : 1 . 1 SNAPSHOT: c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g beans : j a r : 2 . 5 . 4 : c o m p i l e | | \ o r g . s p r i n g f r a m e w o r k : s p r i n g c o r e : j a r : 2 . 5 . 4 : c o m p i l e | + o r g . s p r i n g f r a m e w o r k : s p r i n g aop : j a r : 2 . 5 . 4 : c o m p i l e | | \ a o p a l l i a n c e : a o p a l l i a n c e : j a r : 1 . 0 : c o m p i l e | \ o g n l : o g n l : j a r : 2 . 6 . 9 : c o m p i l e + j u n i t : j u n i t : j a r : 4 . 4 : t e s t + f r e e m a r k e r : f r e e m a r k e r : j a r : 2 . 3 . 8 : c o m p i l e + commonsb e a n u t i l s : commonsb e a n u t i l s : j a r : 1 . 7 . 0 : c o m p i l e | \ commonsl o g g i n g : commonsl o g g i n g : j a r : 1 . 1 : c o m p i l e + o r o : o r o : j a r : 2 . 0 . 8 : c o m p i l e + commonsl a n g : commonsl a n g : j a r : 2 . 3 : c o m p i l e + commonsi o : commonsi o : j a r : 1 . 4 : c o m p i l e + commons c l i : commons c l i : j a r : 1 . 0 : c o m p i l e + jdom : jdom : j a r : 1 . 0 : c o m p i l e + x e r c e s : x e r c e s I m p l : j a r : 2 . 4 . 0 : p r o v i d e d + j a x e n : j a x e n : j a r : 1 . 1 . 1 : p r o v i d e d | + dom4j : dom4j : j a r : 1 . 6 . 1 : p r o v i d e d | + xmla p i s : xmla p i s : j a r : 1 . 3 . 0 2 : p r o v i d e d | \ xom : xom : j a r : 1 . 0 : p r o v i d e d | + x e r c e s : xmlParserAPIs : j a r : 2 . 6 . 2 : p r o v i d e d | + x a l a n : x a l a n : j a r : 2 . 6 . 0 : p r o v i d e d | \ com . ibm . i c u : i c u 4 j : j a r : 2 . 6 . 1 : p r o v i d e d + j a v a x . p e r s i s t e n c e : p e r s i s t e n c e a p i : j a r : 1 . 0 : c o m p i l e + o r g . j d e s k t o p : b e a n s b i n d i n g : j a r : 1 . 2 . 1 : c o m p i l e + o r g . j d e s k t o p : appframework : j a r : 1 . 0 . 3 : c o m p i l e + o r g . j d e s k t o p : swingworker : j a r : 1 . 1 : c o m p i l e \ j s y n t a x p a n e : j s y n t a x p a n e : j a r : 0 . 9 . 1 : c o m p i l e

31

128 130 132 134 136 138 140 142 144 146 148

150 152

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29

32

CAPITOLO 2. INSTALLAZIONE

2.5

Eclipse IDE

Per lavorare su un progetto Regola kit con Eclipse basta lanciare il comando seguente che provvede a creare tutti i le necessari a quellambiente:
n i c o l a @ c a s p e r : ~ / p r o j e c t s / y o u r P r o j e c t# mvn e c l i p s e : e c l i p s e

A questo punto basta importare il progetto nel workspace con la voce di menu File | Import : magari senza settare lopzione di copia e quindi lavorando sul progetto nella sua cartella originale. Per installare i plugin necessari al funzionamento dellassistente alla scrittura del codice (vedi il paragrafo a pagina 7.4 nella pagina 50 ) basta semplicemente ricopiare il le ... dentro la cartella eclipse/plugin e riavviare Eclipse.

Capitolo

3
pom.xml runtime.properties log4j.xml hibernate.cfg.xml ApplicationResources.properties applicationContext-*.xml <stesse cartelle dei packages> designtime.properties log4j.xml hibernate.reveng.xml applicationContext-*-test.xml jetty/env.xml il le principale di Maven 2 propriet di runtime la verbosit dei log la congurazione principale di Hibernate i testi tradotti nelle varie lingue le congurazioni di Spring i mappaggi di Hibernate propriet a design time la verbosit dei log Hibernate tools le congurazioni di Spring datasource per Jetty

Struttura di un progetto
Questo capitolo funziona un po come una cartina stradale e rimanda ad altri capitoli per lapprofondimento.

/ src/main/resources/

src/test/resources/

3.1

Lo standard Maven 2

Fra i tanti vantaggi oerti di cui si pu beneciare utilizzando Maven 2 vi sono quelli derivanti dalladesione ad uno standard (che i teorici dei giochi deniscono equilibrio di Nash); infatti disponendo i diversi le di un progetto in modo convenuto consente agli sviluppatori (e i sistemisiti) di orientarsi da subito su un progetto estraneo, a sistemi di supporto alla scrittura di trovare senza congurazione le risorse di cui abbisognano ed in generale consentono a soggetti diversi e lontani (nello spazio e nel tempo) di cooperare sullo stesso 33

34

CAPITOLO 3. STRUTTURA DI UN PROGETTO

progetto senza conitti. La struttura esatta di progetto web reperibile su (mav), per in estrema sintesi, la gerarchie delle cartelle prevede al primo livello la cartella dei sorgenti (src) e quella con gli artifatti prodotti (target), ad esempio le classi compilate ed i war le. La cartella src primariamente suddivisa in due sottocartelle speculari, una contiene sorgenti di produzione (main) ed una quelli di test. Queste sottocartelle (di main e test) contengono i sorgenti java (cartella java) e le risorse (dentro resources), prevalentamente i le di congurazione. Da rilevare che la cartella main contiene anche la sottocartella webapp dove si trova la webroot, ovvero le pagine web dellapplicazione ed il le web.xml.

3.2

Liniezione delle dipendenze

TODO: La distinzione tra i tre livelli di bean

3.3

La localizzazione

La localizzazione consiste nelle tecniche per tradurre i testi, laspetto e le form di input di unapplicazione nelle diverse lingue. Regola kit utilizza i Resource Bundle di Java per risolvere questo aspetto come indicato in (i18). Nella cartella src/main/resources sono presenti diversi le di propriet il cui nome presenta la radice comune ApplicationResources, ad esempio: ApplicationResources en.properties ApplicationResources it.properties Queste le replicano la stessa chiave traducendola nella varie lingue. Ad esempio dentro ApplicationResources en possiamo trovare la chiave errors.required a cui associato un testo inglese:
1

e r r o r s . r e q u i r e d=t h e f i e l d

i s required .

Nel le ApplicationResources it sar possibile fornire una traduzione per la chiave errors.required semplicemente ridenendola.
1

e r r o r s . r e q u i r e d=campo n e c e s s a r i o .

Anch questo meccanismo di localizzazione funzioni Regola kit provvede automaticamente a selezionare il giusto le in base alle impostazioni del browser che utilizza lapplicazione. Inoltre necessario rammentarsi di non includere mai direttamente dei testi allinterno delle pagine web ma di

3.4. LE CONNESSIONI AL DATABASE

35

richiamare le chiavi denite dentro i le ApplicationResources. Ad esempio nelle pagine jsp bisogna inserire qualcosa di simile a:
1

<fmt : message key=" e r r o r s . r e q u i r e d "/>

Per le pagine jsf invece possibile utilizzare il managed bean mgs.


1

#{msg [ e r r o r s . r e q u i r e d ] }

3.4

Le connessioni al database

Le connessioni al database sono di due tipi a seconda dellambiente in cui sta girando lapplicazione. Per lambiente di run-time necessario indicare il nome JNDI del datsource fornito dallapplication server mentre a designtime bisogna proprio impostare tutte le caratteristiche di una connessione. In entrami i casi la congurazione riguarda limpostazione di propriet di congurazione dentro i le design-time.properties e run-time.properties. Per maggiori dettagli ed esempi di congurazione per i diversi application server si rimanda a 4 nella pagina 37.

3.5

Verbosit dei log

TODO: log4j e come interagisce con JBoss

3.6

La sezione dei test

TODO: come congurare i test e quali le utilizzano.

3.7

Applicazione Servlet

TODO: Davvero in breve la struttura

36

CAPITOLO 3. STRUTTURA DI UN PROGETTO

Capitolo

Database
4.1 Congurazione di run-time

Le applicazioni JEE generalmente lasciano la gestione delle connessioni database al container. In questo modo possibile per i sistemisti modicare, ad esempio, la url di connessione oppure il numero di connessioni in pool senza modicare lapplicazione n dovere eettuare una riconsegna (redeploy). Ogni container congura in modo diverso per ogni datasource caratterizzato necessariamenta da un nome JDNI, ad esempio java:comp/env/jdbc/miodatabase. Questo nome utilizzato dallapplicazione per recuperare la connessione e, in denitiva, connettersi al database. Nelle applicazioni Regola kit il nome JNDI del datasource specicato nella propriet di runtime jee.datasrouce (nel le src/main/resource/runtime.properties).
1

j e e . d a t a s o u r c e=j a v a : comp/env/ j d b c / D a t a s o u r c e

Con questo la congurazione di runtime della vostra applicazione terminata, non ci sono altre variabili da impostare. Un problema tipico di congurazione riportato di diversi utenti limpossibilit di connettersi al datasource per avere utilizzato un indirizzo JNDI sbagliato. La causa del problema che il nome con cui lapplication server espone la connessione non esattamente quello specicato nella congurazione: perch ad esempio viene preposta la stringa java: o a volte java:comp/env/. Per facilitare la soluzione di questo tipo di problema concludiamo il paragrafo riportando qualche congurazione di datasource per gli application server pi diusi. Ad esempio JBoss richiede di ricopiare nella cartella di deploy del server utilizzato un le con il nome del tipo *-ds.xml (ad esempio miadatasource-ds.xml) con un contenuto simile al seguente:
1

<?xml version=" 1 . 0 " e n c o d i n g="UTF8" ?>

37

38

CAPITOLO 4. DATABASE

3 5 7 9 11 13 15 17 19

<d a t a s o u r c e s> <l o c a l txd a t a s o u r c e> <j n d i name>j d b c / s e r v i c e s</ j n d i name> <c o n n e c t i o n u r l>j d b c : o r a c l e : t h i n : @ 1 3 3 . 2 2 2 . 0 . 1 : 1 5 2 2 : S I D</ c o n n e c t i o n u r l> <u s e r name>username</ u s e r name> <password></ password> <d r i v e r c l a s s>o r a c l e . j d b c . d r i v e r . O r a c l e D r i v e r</ d r i v e r c l a s s> <e x c e p t i o n s o r t e r c l a s s name> o r g . j b o s s . r e s o u r c e . a d a p t e r . j d b c . vendor . O r a c l e E x c e p t i o n S o r t e r </ e x c e p t i o n s o r t e r c l a s s name> <minp o o l s i z e>5</minp o o l s i z e> <maxp o o l s i z e>20</maxp o o l s i z e> </ l o c a l txd a t a s o u r c e> </ d a t a s o u r c e s>

In questo caso nella congurazione dellapplicazione dovete indicare il nome indicato per preceduto da java: come indicato di seguito.
1

j e e . d a t a s o u r c e=j a v a : j d b c / s e r v i c e s

Per quanto riguarda Jetty il le di congurazione env.xml contiene lindicazione del datasource.
1

3 5 7

<?xml version=" 1 . 0 " ?> < !D C Y E C o n f i g u r e PUBLIC "//Mort Bay C o n s u l t i n g //DTD C o n f i g u r e //EN" O T P " h t t p : // j e t t y . mortbay . o r g / c o n f i g u r e . dtd "> <C o n f i g u r e c l a s s=" o r g . mortbay . j e t t y . webapp . WebAppContext"> <New i d=" j i r a ds " c l a s s=" o r g . mortbay . j e t t y . p l u s . naming . R e s o u r c e "> <Arg>j d b c / D a t a s o u r c e</Arg> <Arg> <New c l a s s=" o r g . enhydra . j d b c . s t a n d a r d . S t a n d a r d C o n n e c t i o n P o o l D a t a S o u r c e "> <S e t name=" U r l ">j d b c : m y s q l : // l o c a l h o s t / c l i e n t i</ S e t> <S e t name=" DriverName ">com . mysql . j d b c . D r i v e r</ S e t> <S e t name=" User ">n i c o l a</ S e t> </New> </Arg> </New> </ C o n f i g u r e>

9 11 13 15

Jetty aggiunge al nome congurato la stringa java:comp/env/ per cui lindirizzo JNDI da utilizzare il seguente:
1

j e e . d a t a s o u r c e=j a v a : comp/env/ j d b c / D a t a s o u r c e

Lo stesso indirizzo JNDI pu essere utilizzato anche per un datasource fornito da Tomcat, utilizzando una congurazione simile alla seguente per il le context.xml:
1 3

<Context > ... <R e s o u r c e name=" j d b c / D a t a s o u r c e " auth=" C o n t a i n e r " t y p e=" j a v a x . s q l . DataSource " maxActive=" 100 " maxIdle=" 30 " maxWait=" 10000 "

4.2. CONFIGURAZIONE DI DESIGN-TIME


5

39

username=" n i c o l a " password=" " d r i v e r C l a s s N a m e="com . mysql . j d b c . D r i v e r " u r l=" j d b c : m y s q l : // l o c a l h o s t / c l i e n t i " /> </ Context>

TODO: Mi chiedo come mai il dialetto sia specicato come propriet di designtime ma non come propriet di runtime.

4.2

Congurazione di design-time

Tra le caratteristiche invidiabili del framework Spring vi la possibilit di testare lapplicazione fuori dal container con notevoli risparmio di tempo e relativo aumento di produttivit. I servizi necessari ai test sono oerti direttamente da Spring che si sostituisce al container, ad esempio, nella gestione delle transazioni e nei datasource. In questultimo caso necessario specicare tutte le propriet di una connessione (come il driver, la url, la username e la password) come propriet di designtime (nel le src/test/resources/designtime.properties).
1 3 5 7

... hibernate hibernate hibernate hibernate hibernate ...

. . . . .

d i a l e c t=o r g . h i b e r n a t e . d i a l e c t . MySQLDialect c o n n e c t i o n . d r i v e r _ c l a s s = com . mysql . j d b c . D r i v e r c o n n e c t i o n . u r l = j d b c : mysql : / / l o c a l h o s t / c l i e n t i c o n n e c t i o n . username = n i c o l a c o n n e c t i o n . password =

Da notare che necessario specicare anche la variabile hibernate.dialect con il tipo di dialetto di database utilizzato. I tipi disponibili sono molti ed elencati nella documentazione di Hibernate, alcuni esempi comuni sono MySQL5Dialect, OracleDialect, PostgreSQLDialect, HSQLDialect e SQLServerDialect.

4.3

Transazioni JTA

Se lapplicazione dovesse utilizzare un motore di transazioni fornito dal container JEE (ad esempio JBoss) bisognerebbe modicare le congurazioni in due diversi punti; primo rimuovere il le jta.jar da quelli presente nella cartella WEB-INF/lib, per farlo aggiungere le seguenti linee al le pom.xml;
1 3 5

<dependency> <g r o u p I d>j a v a x . t r a n s a c t i o n</ g r o u p I d> < a r t i f a c t I d>j t a</ a r t i f a c t I d> <version> 1 . 0 . 1 B</ version> <s c o p e>p r o v i d e d</ s c o p e> </ dependency>

40

CAPITOLO 4. DATABASE

Secondo bisogna istruire Hibernate per collegarsi al gestore di transazioni esterno; nel le src/main/resources/applicationContext-resources.xml suciente sostituire limportazione iniziale relativa alla persistenza con la seguente:
<i mp ort r e s o u r c e=" c l a s s p a t h : / r e g o l a c o n f i g / a p p l i c a t i o n C o n t e x t p e r s i s t e n c e l o c a l . xml" />

Capitolo

Persistenza
5.1 Hibernate

TODO: Qui si dice che lorm predenito da Regola kit Hibernate, perch estremamente essibile e su database preesistenti consente di gestire anche i casi pi anomali. Perch non usiamo ancora JPA (immaturo).

5.2

Congurazione

TODO: I le hibernate.cfg.xml ed i mappaggi. Alcuni esempi di base per questi le.

5.3

Generatori automatici

TODO: Esempi di congurazione di hibernate.reveng.xml ed esempi (tutti) dei vari goals disponibili a riga di comando.

5.4

Altri ORM

TODO: Si parla del supporto sperimentale per gli altri orm.

41

42

CAPITOLO 5. PERSISTENZA

Capitolo

Messa in produzione
6.1 Produrre i pacchetti war ed ear

TODO: Qui si spiega come produrre i pacchetti e cosa contengano al loro interno

6.2

Application Server

TODO: Perch non usare Jetty ed esempi di congurazione per Tomcat e JBoss. Si rimanda al capitolo dei database per la congurazione dei datasource. Per utilizzare CXF allintenro di JBOSS necessario impostare il parametro di avvio della virtual machine javax.xml.soap.MessageFactory al valore com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.

6.3

Integrazione continua

TODO: Perch serve e come congurare i le standard dei progetti di Regola kit

43

44

CAPITOLO 6. MESSA IN PRODUZIONE

Capitolo

Sviluppo
Questo capitolo apre la parte dedicata alle funzionalit oerte da Regola kit relativamente allo sviluppo. Lasciandosi alle spalle le congurazioni.

7.1

Domain Driven Development

TODO: Molto in breve si spiega come ci si incentri sul modello.

7.2

Livelli

TODO: Si presentano i vari livelli e si rimanda a capitoli successivi per i dettagli

7.3

Model Pattern

Regola kit nasce per agevolare la realizzazione di applicazioni web destinate a gestire moli piuttosto ampie di dati generalmente persistite su un database relazionale. Un problema ricorrente in questi contesti quello che si potrebbe sinteticamente indicare come come la questione dei sottoinsiemi, ovvero fornire una risposta generale alle domande: come estrarre in modo conveniente sottoinsiemi di una certa entit dal database? E come rappresentare in modo sintetico questi sottoinsiemi allinterno di un form html oppure in unapplicazione desktop? La soluzione proposta da Regola kit riteniamo che possa essere ritenuta sucientemente assodata e generica da ambire al rango di design pattern (magari un minore); se cos fosse pensiamo che la descrizione del problema unitamente 45

46

CAPITOLO 7. SVILUPPO

alla soluzione individuata possa essere identicata col nome di Model Pattern (o in alternativa Selection). Nei prossimi paragra cercheremo di formalizzare questo nuovo pattern descrivendone intenti e forze in gioco. Si avvisa n dora che materremo il discorso a livello teorico presentando solo esempi astratti utili unicamente per comprendere la portata della soluzione proposta. Rimandiamo al paragrafo 8.4 nella pagina 51 per illustrare limplementazione di riferimento di Model Pattern (quella contenuta in Regola kit) e spiegarne lutilizzo allinterno delle vostre applicazioni.

7.3.1

Intento

Model Pattern vuole fornire un design appropriato per individuare un sottoinsieme di oggetti del modello di dominio e rappresentare questo sottoinsieme in modo conveniente allinterno del livello di presentazione.

7.3.2

Forze

In una categoria piuttosto ampia di applicazioni (che comprende la quasi totalit di applicazioni web) gli oggetti del modello salvano il loro stato in modo persistente su database, magari attraverso dei framework ORM (ad esempio Hibernate, JPA, ecc.). Non di rado il numero di istanze persistenti, per tipologia di classe, veramente elevato cosa che complica in primis lestrazione (1) (ovvero il ltraggio) delle istanze. Sempre dalla mole dei dati deriva la necessit di ordinare (2) e paginare (3) gli oggetti estratti: ovvero raggrupparli in sotto gruppi contenenti al pi un certo numero di elementi. Un altra richiesta tipica delle applicazioni di cui stiamo parlando quella di rappresentare gli oggetti del modello estratti in modo parziale, ovvero mostrare solo un sotto gruppo di propriet, in modo da fornire, in un solo colpo docchio, tutti gli elementi necessari per prendere delle decisioni sui dati eliminando le propriet superue. Questo sezionamento delle classi del modello si chiama proiezione (4). Del sottoinsieme degli elementi del modello individuato e estratto dal database (reidratato) inoltre necessario fornire delle rappresentazioni sintetiche da utilizzare in diversi punti dellapplicazione. Si prenda per esempio la classe Studente ed il form html che consente di eetture le operazione di editing sulle sue propriet quali nome, cognome ed altre. Si consideri poi che tra le propriet della classe Studente vi sia anche la collezione di classi del tipo Esami che contenga gli esami sostenuti no alla data corrente. Bene, il problema spesso quello di mostrare nello stesso form html contenete le propriet di

7.3. MODEL PATTERN

47

Studente anche la collezione di Esami: in questo caso la rappresentazione corretta potrebbe variare in base alle nalit applicative. Ad esempio le segreterie di facolt potrebbero essere interessati allelenco completo di tutti gli esami (nessuna sintesi), i docenti potrebbero volere esclusivamente la media delle valutazione degli esami (applicare una metrica), lucio delle imposte potrebbe essere interessato solo al fatto di aver sostenuto almeno un esame (e quindi un intero che esprime il numero di esami superati). Tutte queste rappresentazioni (elenco, metrica ed intero) sono una descrizione del sottoinsieme di oggetti del modello Esami. Inoltre si consideri il caso in cui la collezione di Esami fosse vuota o nulla, in questo caso diverse rappresentazioni tradurrebbero il valore null nel modo pi appropriato rispetto al contesto (ad esempio con una stringa che indica lassenza di esami, o con una segnalazione di errore o quantaltro). In ogni caso per ogni sottoinsieme di oggetti del modello emerge prepotente la necessit di provvedere ad una o pi rappresentazione sintetica (5). Quindi ricapitolando le forze che caratterizzano il problema: 1. 2. 3. 4. 5. estrazione di dati eciente da una mole ampia o ampissima ordinare le istanze di modello estratte paginare le istanze di modello estratte eettuare delle proiezioni sulle istanze di modello estratte fornire delle rappresentazioni sintetiche della totalit di istanze estratte (cio del sottoinsieme di tutta la popolazione di istanze estratto)

7.3.3

Esempio

Per amore di concretezza riportiamo un esempio che possa aiutare a comprendere meglio il problema descritto nel paragrafo precedente e la soluzione proposta da Model Pattern. Immaginiamo di avere una collezione di oggetti persista su database, tutti appartenenti alla medesima classe Prodotto, che presentano solo due propriet: id, un intero che tiene la chiave primaria, e la descrizione del prodotto stesso.
1 3 5 7

public c l a s s P r o d o t t o { private I n t e g e r i d ; private S t r i n g d e s c r i z i o n e ; // g e t t e r and s e t t e r p e r t u t t i i campi ... }

Il problema quello di descrivere in modo sintetico sottoinsiemi di oggetti della classe Prodotto. Procederemo per gradi iniziando con il sottoinsieme diciamo denito in modo sintetico, dalla descrizione seguente: il sottoinsieme

48

CAPITOLO 7. SVILUPPO

di tutti gli oggetti la cui descrizione inizia con la parola manuale. Lequivalente informatico di questa denizione costiuito da uninstanza della classe seguente (che svolge il ruolo di Model Pattern):
public c l a s s P r o d o t t o P a t t e r n
2

private S t r i n g i n i z i o D e s c r i z i o n e ;
4 6

// g e t t e r and s e t t e r p e r t u t t i i campi ... }

In particolare il sottoinsieme pu essere denito da un oggetto della classe ProdottoPattern che ha come propriet inizioDescrizione la stringa manuale. Si pu notare che ProdottoPattern non contiene n il sottoinsieme n il codice per estrarlo da database; si limita solo a fornirne una descrizione sintetica del sottoinsieme. Arricchiamo questo primo esempio includendo anche lordine degli oggetti contenuti nel sottoinsieme , ad esempio richiedendo che siano ordinati in base alla propriet id. In questo caso la classe Model Pattern potrebbe modicarsi cos:
1 3 5 7

public c l a s s P r o d o t t o P a t t e r n

private S t r i n g i n i z i o D e s c r i z i o n e = manuale ; private S t r i n g [ ] o r d i n e = { i d } ; // g e t t e r and s e t t e r p e r t u t t i i campi ... }

In questo modo sarebbe in grado di descrivere il sottoinsieme ordinato anche se in modo un po rozzo infatti si trascura la possibilit di ordinare in modo ascendente o discendente. Comunque lesempio dovrebbe rendere lidea di come le classi Model Pattern si limitino a descrivere i sottoinsiemi senza contenere codice per lestrazione dello stesso. Questo servizio infatti fornito dalle classi a corredo come quelle fornite da Regola kit che consentono, dato un oggetto del tipo Model Pattern, di ottenere il sottoinsieme voluto. La sda consiste nella predisposizione di un architettura che consenta di utilizzare dei Model Pattern semplici come quelli mostrati in questi esempi ma in grado di funzionare correttamente (ad esempio indicando che la propriet inizioDescrizione si riferisce alla propriet descrizione di Prodotto) su diversi orm. Si rimanda al paragrafo successivo per una descrizione esatta dellarchitettura. Fino a questo momento abbiamo trattato solo la capacit di Model Pattern di esprimere una selezione, adesso ci occuperemo della funzione di rappresentazione del sottoinsieme selezionato. Immaginiamo di dover mostrare in una pagina web il sottoinsieme in modo sintetico (ovvero senza elencare in una colonna tutti i suoi elementi). Modichiamo Model Pattern per aggiungere la propriet sintesi.

7.3. MODEL PATTERN


public c l a s s P r o d o t t o P a t t e r n
2 4 6

49
{

8 10 12 14

public g e t S i n t e s i ( ) { i f ( i n i z i o D e s c r i z i o n e == n u l l ) { return P r o d o t t i con d e s c r i z i o n e i n i z i a n t e con : inizioDescrizione ; } else { return " T u t t i d i p r o d o t t i . " ; } } }

Come si vede la propriet sintesi contiene la logica per fornire una semplice rappresentazione del sottoinsieme anche nel caso in cui inizioDescrizione sia nullo.

7.3.4

Architettura

Model Pattern propone di avvilire le forze del problema utilizzando una classe (Pattern) per ogni tipo nel modello che si occupi di due distinti aspetti: 1. individuare il sottoinsieme selezionato 2. fornire (zero o pi) rappresentazione del sottoinsieme selezionato Per quanto riguarda il primo punto bisogna precisare n da subito che la classe Pattern non contiene in nessun modo il codice necessario allestrazione della selezione o la selezione stessa. Invece si occupa di contenere le informazioni necessarie a descrivere in modo esatto il sottoinsieme, ovvero descriverlo in modo esatto rispetto ai seguenti punti: 1. 2. 3. 4. quali istanze sono comprese nel sottoinsieme e quali esluse con quali ordine le istanze entrano nel sottoinsieme in che modo il sottoinsieme paginato quali proiezioni eettuare su ogni singola istanza del sottoinsieme

La classe Pattern si occupa anche di contenere zero o pi rappresentazioni del sottoinsieme che descrive da utilizzare in altrettanti punti dellapplicazione (tipicamente un qualche livello di presentazione, o la produzione di report, ecc.). A tal proposito predispone il metodo
1

void i n i t ( C o l l e c t i o n <Model> s u b s e t )

questo metodo prende in ingresso un sottoinsieme e provvede ad inizializzare le rappresentazioni di subset secondo la logica contenuta in pattern;

50

CAPITOLO 7. SVILUPPO

[TODO: nda Lorenzo, in futuro potrebbe essere utile utilizzare questo stesso metodo per inizializzare anche la parte di descrizione 1) in base ad un subset, ovvero produrre il ltro che estrarrebbe eventualmente subset?]

7.4

Generatori

TODO: Qui si elencano i generatori disponibili e cosa scrivano. Se il paragrafo diventasse troppo lungo allora lo mettiamo su un capitolo a parte.

Capitolo

Dao
8.1 Scopo

TODO: A cosa serve DAO?

8.2

GenericDao

TODO: Se ne descrivono interfacce e si presentano esempi duso (dei test dunit) che si snodano tra i vari paragra.

8.3

Creare un custom dao

TODO: linterfaccia, limplementazione ed inne la congurazione di Spring. Si ricorda che esiste un generatore per questo.

8.4

Ricerche con Model Pattern

Nel paragrafo 7.3 nella pagina 45 stato presentato in modo formale un nuovo design pattern chiamato Model Pattern; stato spiegato come intenda risolvere il probema dellestrazione di un sottoinsieme di oggetti e di come intenda fornire una rappresentazione sintetica di questo oggetto. La soluzione proposta, si visto, prevede lutilizzo di una classe che svolga il ruolo di ModelPattern, ovvero sia contemporaneamente in grado di individuare quali elementi estrarre e di rappresentarli senza per contenere al suo interno n il sottoinsieme n la logica per lestrazione. La discussione rimasta per a livello astratto rimandando la descrizione di come Model Pattern possa 51

52

CAPITOLO 8. DAO

essere utilizzato concretamente allinterno di unapplicazione Regola kit; nei prossimi paragra vedremo quindi limplementazione di riferimento di Model Pattern contenuta in Regola kit (precisamente nei moduli regola-core, regoladao e sottomoduli) per scoprire come progettare un classe ModelPattern con diversi criteri di ltraggio e ordinamento e la utilizzeremo lungo i diversi livelli applicativi, dal DAO alla presentazione. Per maggiore concretezza immagineremo di doverci occupare, diciamo, della classe Prodotto riportata di seguito.
1 3 5 7

class Prodotto { Integer id ; String descrizione ; // seguono g e t t e r / s e t t e r p e r o g n i campo ... }

8.4.1

ModelPattern

Regola kit fornisce una classe di base org.regola.model.ModelPattern da cui derivare il nostro ModelPattern; questa classe presenta alcune facilitazioni per specicare gli ordinamenti e la paginazione ed accettata quasi in ogni livello applicativo, dai GenericDao no a controllori web che si occupano di disegnare la tabella con il sottoinsieme. Tenendo a mente la classe Prodotto una prima versione del nostro ModelPattern potrebbe essere la seguente:
1 3

c l a s s P r o d o t t o P a t t e r n extends o r g . r e g o l a . model . ModelPattern implements S e r i a l i z a b l e { Integer chiave ;

5 7 9 11

@Equals ( " i d " ) public I n t e g e r g e t C h i a v e ( ) { return c h i a v e ; } ... }

Soermiamoci un attimo su alcuni elementi che trasformano la nostra classe in un ModelPattern utilizzabile con Regola kit: nome della classe una convenzione di Regola kit prevede che ogni ModelPatter dovrebbe chiamarsi col nome della classe di modello a cui si riferisce (nel nostro caso Prodotto) seguito dal susso Pattern, per cui ProdottoPattern derivazione la nostra classe deve derivare dalla classe org.regola.model.ModelPattern fornita con Regola kit

8.4. RICERCHE CON MODEL PATTERN

53

serilizzazione la nostra classe deve essere progettata per la serializzazione e quindi necessariamente implementare linterfaccia di marker java.io.Serializable La classe ProdottoPattern cos realizzata predisposta per individuare particolari sottoinsiemi di instanze Prodotto che presentano particolari valori della propriet id, in particolare tutte le istanze di Prodotto che hanno id uguale alla propriet chiave di ProdottoPattern. Il legame tra chiave ed id realizzato mediante lannotazione @Equals (alla riga 6) che, posta sul getter della propriet chiave di ProdottoPattern, unisce questultima alla propriet delloggetto di modello specicata dentro lannotazione stessa (in questo caso id). Bisogna chiarire da subito che non la classe ModelPattern ad individuare un sottoinsieme ma ogni sua istanza per cui, tornando al nostro esempio, bisogna istanziare un oggetto del tipo ProdottoPattern.
P r o d o t t o P a t t e r n p a t t e r n = new P r o d o t t o P a t t e r n ( ) ;
2

p a t t e r n . s e t C h i a v e ( 2 3 4 5 3 2 ) ; // ora p a t t e r n r a p p r e s e n t a un s o t t o i n s i e m e

Dopo lassegnazione pattern (loggetto) e non ProdottoPattern (la classe) in grado di individuare un sottoinsieme di oggetti Prodotto aventi la propriet id uguale a 234532 (essendo id una chiave primaria il sottoinsieme conterr al pi un elemento). Da notare come loggetto pattern non contenga in s il sottoinsieme ma solo la descrizione sintetica di questo; per ottenere il sottoinsieme bisogna rivolgersi alla classe ProdottoDao invocando il metodo nd.
1 3 5

P r o d o t t o P a t t e r n p a t t e r n = new P r o d o t t o P a t t e r n ( ) ; pattern . setChiave (234532) ; L i s t <Prodotto> p r o d o t t i = prodottoDao . f i n d ( p a t t e r n ) ;

Ora che abbiamo visto concretamente come creare ed utilizzare una classe ModelPattern possiamo scendere nel dettaglio ricordando che Model Pattern deve individuare con esattezza il sottoinsieme, in particolare deve occuparsi di ordinamento, paginazione e proiezione. Nei prossimi paragra quindi scopriremo come specicare: 1. 2. 3. 4. 5. la selezione da eettuare i criteri di ordinarmento la paginazione da eettuare le propriet da comprendere nella proiezione fornire rappresentazioni sintetiche del sottoinsieme indicato

54

CAPITOLO 8. DAO

8.4.2

La selezione

La selezione avviene impostando alcuni criteri di ltraggio sul ModelPattern. Ogni criterio caratterizzato da: 1. la propriet del modello a cui si applica 2. il tipo di criterio (ad esempio ugualianza, appartenenza, ecc.) 3. il valore da utilizzare per il confronto Riprendendo lesempio del paragrafo precedente troviamo un unico criterio di ltraggio, di tipo ugualianza, che confronta la propriet di modello id con il valore della propriet chiave di ProdottoPattern.
1 3

c l a s s P r o d o t t o P a t t e r n extends o r g . r e g o l a . model . ModelPattern implements S e r i a l i z a b l e { Integer chiave ;

5 7 9 11

@Equals ( " i d " ) public I n t e g e r g e t C h i a v e ( ) { return c h i a v e ; } ... }

La propriet di modello pu trovarsi direttamente sulla classe radice, ovvero quella a cui riferisce ModelPattern (nellesempio Prodotto) oppure su classi a questa collegate tramite associazioni del tipo uno-a-uno, molti-auno od uno-a-molti. In generale si navigano le associazioni utilizzando come separatore il punto tranne che per relazioni uno-a-molti (collezioni) dove si utilizza il simbolo [] postsso. Nel dettaglio: radice uno-a-uno molti-a-uno uno-a-molti il nome della propriet il punto il punto [] postsso ed il punto id nome indirizzo.via categoria.descrizione cliente.nome fattura.progressivo elmenti[].nome elementi[].dettagli[].progressivo

Il tipo del criterio impostato scegliendo lannotazione tra quelle presenti in Regola kit. Attualmente possibile scegliere tra le annotazioni seguenti:

8.4. RICERCHE CON MODEL PATTERN Equals NotEquals Like GreatherThan LessThan In ugualianza disugualianza il like maggiore minore appartenenza

55

Il valore di ogni criterio una propriet di ModelPattern individuata annotandone il getter. Il tipo di questa propriet deve corrispondere a quello del modello tranne per il criterio In per cui necessario specicare unarray. Lesempio seguente fornisce una rappresentazione piuttosto completa di quando esposto:
2 4 6 8 10 12 14 16 18 20 22 24 26

public c l a s s CustomerPattern extends ModelPattern implements S e r i a l i z a b l e { private I n t e g e r i d ; @Equals ( " i d " ) public . I n t e g e r g e t I d ( ) { return i d ; } private S t r i n g f i r s t N a m e ; @Like ( v a l u e = " f i r s t N a m e " , c a s e S e n s i t i v e = true ) public S t r i n g g e t F i r s t N a m e ( ) { return f i r s t N a m e ; } private S t r i n g [ ] lastNames ; @In ( " lastName " ) public S t r i n g [ ] getLastNames ( ) { return lastNames ; } private I n t e g e r i n v o i c e I d ;

28 30 32 34

@Equals ( " i n v o i c e s [ ] . i d " ) public I n t e g e r g e t I n v o i c e I d ( ) { return i n v o i c e I d ; } }

8.4.3

Ordinamento

Sugli oggetti selezionati possibile impostare criteri di ordinamento in base alle propriet della radice del modello o sugli oggetti ad essa associati. Limplementazione di Model Pattern presente in Regola kit utilizza per

56

CAPITOLO 8. DAO

specicare gli ordinamenti (cos come le proiezioni) la classe ModelProperty, una specie di descrittore di una generica propriet. Si instazia cos:
ModelProperty mp = new ModelProperty ( " i d " , " c u s t o m e r . column . " , Order . a s c ) ;

ModelProperty contiene il nome della propriet (in base a cui ordinare), un presso da utilizzare per individuare in modo univoco la propriet allinterno di tutta lapplicazione ed, inne, la direzione dellordinamento (acendente o discendente). Nellesempio si esprime un ordinamento ascentente sulla propriet id, individuata nellapplicazione come customer.column.id. Per speciare lordinamento basta popolare la lista sortedProperties di ModelPattern con tante istanze di ModelProperty in base allordinamento da realizzare. Ad esempio:
1

ModelProperty i d = new ModelProperty ( " i d " , " c u s t o m e r . column . " , Order . a s c ) ; ModelProperty s t r e e t = new ModelProperty ( " a d d r e s s . s t r e e t " , " c u s t o m e r . column . " , Order . d e s c ) ; modelPattern . g e t S o r t e d P r o p e r t i e s . c l e a r ( ) ; m o d e l P a t t e r n . g e t S o r t e d P r o p e r t i e s . add ( i d ) ; m o d e l P a t t e r n . g e t S o r t e d P r o p e r t i e s . add ( s t r e e t ) ;

3 5

In questo caso si impone un ordinamento crescente per id e descrescente per la propriet strret delloggetto associato address.

8.4.4

Paginazione

Sugli oggetti cos selezionati ed ordinati possibile eettuare unolteriore selezione dividendolo in blocchi contigui dette pagine contenenti al pi n elementi. ModelPattern consente di impostare la dimensione delle pagine cos come impostare la pagina da selezionare. Ad esempio:
2

modelPattern . s e t P a g e S i z e ( 2 0 ) ; modelPattern . setCurrentPage ( 0 ) ;

Qui si suddivide linsieme ordinato in pagina con al pi di 20 oggetti, il primo blocco comprende gli oggetti da [0, 19], il secondo da [20, 39] e cos via. Inoltre si seleziona la prima pagina (la numerazione delle pagine parte da 0), ovvero gli oggetti da [0, 19].

8.4.5

Proiezione

Fino a qui abbiamo visto come eettuare la selezione, ordinarla e limitarla ad un certo numero di elementi. inoltre possibile limitare non solo il numero ma anche le propriet del singolo oggetto del sottoinisieme. Ad esempio pu essere conveniente limitarsi a considerare solo la propriet id e name piuttosto che il complesso di tutte le propriet della radice del modello e/o degli oggetti associati. Questo genere di limitazione si chiama proiezione. Il meccanismo

8.4. RICERCHE CON MODEL PATTERN

57

per specicare le proiezione dentro Regola kit si basa sempre sugli oggetti ModelProperty, basta popolare la lista visibleProperties di ModelPattern con le propriet che si intende proiettare.
2

ModelProperty i d = new ModelProperty ( " i d " , " c u s t o m e r . column . " , Order . a s c ) ; ModelProperty s t r e e t = new ModelProperty ( " a d d r e s s . s t r e e t " , " c u s t o m e r . column . " , Order . d e s c ) ; modelPattern . g e t V i s i b l e P r o p e r t i e s . c l e a r ( ) ; m o d e l P a t t e r n . g e t V i s i b l e P r o p e r t i e s . add ( i d ) ; m o d e l P a t t e r n . g e t V i s i b l e P r o p e r t i e s . add ( s t r e e t ) ;

4 6

Nellesempio si eettua una proiezione comprendente esclusivamente le propriet id e strett delloggetto associato street.

8.4.6

Rappresentazione

TODO:

58

CAPITOLO 8. DAO

Capitolo

Servizio
9.1 Scopo

TODO: A cosa serve il livello di Servizio? (spr)

9.2

GenericManager

TODO: Come crearlo. Si ricorda che esiste un generatore per questo.

9.3

Transazioni

TODO: come sono demarcate e come aggiungere politiche diverse per aprire e chiudere transazioni

9.4

Politiche di detach

Gli EJB, n dal loro esordio nel 1998, hanno nascosto le classi di modello al livello di presentazione ed utilizzato in loro vece delle classi apposite, i Data Transfer Object. Questi DTO avevano il compito di raccogliere una visione appiattita del modello che per contenesse tutte e sole le informazioni necessarie al livello di presentazione. Erano oggetti di passaggio, tutti dati e nessuna logica che nascondevano la complessit del modello agli strati superiori, realizzando di fatto un disaccoppiamento forte tra questi livelli. Nonostante questo pregio i DTO hanno contribuito molto alla fama di pesantezza degli EJB in quanto, anche in progetti piccoli, risultava evidente che il lavoro per creare, popolare e sincronizzare i DTO con la classi di modello era 59

60

CAPITOLO 9. SERVIZIO

di gran lunga superiore ai beneci. La domanda sorta spontanea a molti era: perch non passare ai livelli superiori direttamente le classi di modello? Molti progetti hanno dimostrato che la strada praticabile con successo e formalizzato i vari modi per farlo. In questo paragrafo presenteremo due pattern per utilizzare direttamente le classi di modello nel livello di presentazione conosciuti rispettivamente come pojo faade e modello esposto.

9.4.1

Pojo faade

Questo pattern per utilizzare le classi di modello mantiene larchitettura complessiva degli EJB interponendo tra la presentazione ed il modello un apposito livello (faade) il cui compito ancora quello di fornire servizi per la presentazione. La dierenza principale con gli EJB per risiede in due aspetti: 1. Il livello faade costituito da semplici pojo 2. Invece che DTO si passano oggetti di modello, opportunamente trattati Del primo punto bisogna sottolineare che il livello faade, come negli EJB, ancora responsabile di aprire e chiudere le transazioni cos come della sicurezza (autenticazione ed autorizzazione). La dierenza che non necessario un container JEE per ottenere questi servizi ma sono realizzati tramite un container invertito (come Spring) e la programmazione orientata agli aspetti (AOP). Con il vantaggio di poter eettuare tutti i test fuori dal container. Il secondo punto invece richiede alcuni approfondimenti che discuter di seguito. incapsulamento del modello Il modello, secondo la denizione pi accettata di Model Driven Development (MDD), una realt attiva in grado di utilizzare risorse esterne, ad esempio pu presentare dei metodi per salvarsi su database. Se il livello di presentazione chiamasse direttamente questi metodi verrebbe meno la funzione centralizzatrice dei pojo faade ed il sistema solleverebbe diverse eccezioni legate allassenza di transazioni attive sul livello di presentazione. Per ovviare a questo problema esistono alcune tecniche: convenzione si stabilisce che nessun sviluppatore chiami mai questi metodi e si limiti ad ignorarli. Per gruppi numerosi potrebbe essere necessario raorzare la convenzione magari marcando i metodi da ignorare con delle annotazioni ed utilizzare un compilatore ad aspetti che riporti come errore ogni chiamata a questi metodi eettuata nel livello di presentazione.

9.4. POLITICHE DI DETACH

61

visibilit dei metodi ovvero marcare i metodi come private o protected. Spesso per il modello sparso in vari package Java per cui questa possibilit non praticabile. utilizzare interfacce il livello di presentazione scritto non in termini delle classi del modello ma in termini di sotto interfacce che ne espongano solo alcuni metodi nascondendone altri. Pu essere realizzato in due modi: realizzare le interfacce direttamente sul modello una strada tecnicamente complessa perch richiede di scrivere metodi covarianti, di arontare il problema delle collezioni immutabili ed inoltre non consente comunque di esporre quei metodi che richiedevano computazioni realizzabili solo nel livello di modello (perch ad esempio richiedono laccesso al database) creare degli adapter hanno lo svantaggio principale di essere terribilmente complicati e niscono spesso per somigliare ai DTO (in termini dei soli svantaggi).

oggetti staccati (detached) Gli elementi del modello possono eettuare implicitamente delle richieste al motore di persistenza in modo invisibile per i client. Il caso pi esemplare quello delle collezioni che gli ORM gestiscono a volte in modalit di caricamento dierito (lazy o late loading). Ovvero gli elementi delle collezione sono recuperati dal database solo al momento del primo accesso ad un elemento, in modo trasparente. Il problema che nel livello di presentazione sessioni ORM e transazioni non sono disponibili con conseguente errore a run time. Esistono in generale due tipi di soluzioni:

Eliminare i caricamenti dieriti ovvero eettuare delle congurazioni per gli ORM (dette mappaggi) che carichino subito tutte le collezioni leggendole dal database assieme alloggetto che le contiene. Bisogna per ricordare che questa strada non percorribile quando la mole dei dati notevole o lo schema del database non lo consenta; circostanze, queste, molte frequenti nella pratica. Fare scattare i caricamenti dieriti ovvero prima di passare al livello di presentazione gli oggetti del modello fare scattare tutti i caricamenti dieriti. Spesso gli ORM hanno metodi appositi per fare questo (ad esempio Hibernate ha il metodo Hibernate.initialize() ).

62 Vantaggi di Pojo Faade

CAPITOLO 9. SERVIZIO

Confrontando Pojo Faade, in particolare con gli EJB Faade, emergono diversi punti di forza che riassumo brevemente: sviluppo pi facile e (quindi) veloce per la possibilit di testare fuori dal container e lassenza di DTO che, come visto, possono essere molto onerosi in termini di tempo. possono eliminare la necessit di un container visto che non pi necessario per transazioni e sicurezza potrebbe non essere necessario utilizzare un container completo JEE nel progetto. demarcazione essibile delle transazioni la congurazione tramite AOP delle transazione pu avere un livello di essibilit inaudito nel mondo EJB. Confrontando invece Pojo Faade con il pattern del modello esposto (presentato nel prossimo paragrafo) si possono isolare i seguenti vantaggi: livello di presentazione facilitato perch non richiesta una tecnica particolare di gestione delle transazioni sul livello di presentazione, come vedremo vista coerente dei dati del database tutti i dati sono esposti dai pojo faade e sono quindi raccolti allinterno di ununica transazione. Questo pu non essere vero nel pattern del modello esposto. Svantaggi di Pojo Faade Gli svantaggi principali rispetto agli EJB faade sono: mancanza di standard lo standard JEE non prevede Spring (per ora e purtroppo) quindi i problemi possono essere di vario genere. In verit Spring largamente riconosciuto nella comunit di sviluppatori tanto che moltissime librerie o sono espressamente dedicata a Spring oppure sono facilmente integrabili. Inoltre molte congurazioni standard sono riconosciute da Spring (ad esempio le annotazioni per i web service o per la persistenza). Comunque a titolo di esempio i problemi legati alla mancanza di standard possono essere: ottenere il pojo faade il client potrebbe non sapere come ottenere unistanza del faade, ad esempio un generatore che espone una classe come end point di un servizio web potrebbe non sapere come ottenere unistanza del pojo faade. sicurezza la dichiarazione dei vincoli di sicurezza avviene in modo fuori standard e quindi non portabile.

9.4. POLITICHE DI DETACH

63

transazioni iniziate su client remoti attualmente non supportato da framework come Spring: i pojo faade non possono partecipare a transazioni avviate esternamente. Con riferimento al pattern del modello esposto i principali svantaggi sono: problemi con gli oggetti staccati come visto nei paragra precedenti pu richiedere una codica minuziosa e dicile accertare che tutti gli oggetti siano eettivamente staccati dal motore di persistenza. Inoltre gli errori si presentano solo a runtime, cosa che rende pi dicile la loro individuazione. incapsulamento del modello come abbiamo visto pu risultare molto complesso nascondere alcuni metodi ai client.

9.4.2

Modello esposto

Un altra tecnica per evitare limpiego dei DTO non si limita ad utilizzare le classi di modello per la presentazione ma imbocca la strada pi radicale di rinunciare ad un livello di faade fornendo direttamente accesso ad un modello non pi staccato (detached) ma attivo e transazionale. Il modello esposto noto anche col nome di Open Session In View o anche Open Persistence Manager In View. Quando possibile utilizzare il modello esposto Per poter utilizzare questo modello sono necessarie due condizioni inderogabili per il livello di presentazione che deve infatti: poter gestire la sessione dellORM accedere da locale al modello (sono escluse connessioni remote) In assenza di queste due condizioni necessario ripiegare su soluzioni alternative come pojo faade. Come funziona Per consentire al modello di funzionare nel livello di presentazione necessario occuparsi di due aspetti fondamentali: gestire la sessione La sessione utilizzata dallORM deve rimanere aperta per tutta la durata di una richiesta HTTP o addirittura per diverse richieste. Per fare questo una soluzione consolidata ricorrere ad un ltro HTTP che si occupi prima di mantenere aperta la sessione ed

64

CAPITOLO 9. SERVIZIO inne di chiuderla anche in presenza di eccezioni. Spring presenta gi dei ltri per svolgere questa funzione, tra cui OpenSessionInViewFilter. I vantaggi dellimpiego di un ltro sono: sicurezza il ltro viene sempre invocato allinizio ed alla ne della richiesta riusabilit lo stesso ltro pu essere riusato in diverse applicazioni ortogonalit possibile aggiungere e rimuovere il ltro senza modicare il codice del livello di presentazione.

gestire le transazioni La gestione delle transazioni potrebbe avvenire a livello di presentazione (ovvero essere delegata al ltro della sessione) oppure al livello del modello (ovvero gestita con AOP). Nel primo caso la transazione viene aperta allinizio della richiesta dal ltro della sessione e chiusa al termine. Nel secondo caso (AOP) possibile aprire e chiudere le transazioni in base ad uno schema molto pi essibile, come ad esempio attorno alle classi di modello che si occupano dei servizi. Entrambi gli approcci presentano vantaggi e svantaggi:

9.4.3

Conversazioni

Nelle applicazioni web una singola operazione di business pu essere completata solo attraverso diverse richieste HTTP; ad esempio mediante la compilazione da parte dellutente di alcune pagine in sequenza e solo al completamento dellultima loperazione si considera o conclusa o annullata. In termini di interazione utente queste operazioni si chiamano conversazioni (o transazioni lunghe o anche transazioni utente) e sono gestite in modo completamente diverso nel pattern dei pojo faade piuttosto che nel modello esposto. Nei pojo faade la sessione dellORM inizia e si conclude allinterno della singola richiesta HTTP, per cui allinterno di una conversazione (che si compone di diverse richiesta HTTP) vengono usate sessioni diverse. Gli oggetti di modello prima di passare al livello di presentazione sono staccati (detached) dal motore di persistenza e poi riattaccati (reattached) nella richiesta HTTP successiva. Questa modalit operativa prevede quindi transazioni sul database limitate allinterno delle richieste HTTP e dedica molta attenzione alla fase di attach e detach degli oggetti dallORM. Nel pattern del modello esposto invece si utilizza la stessa sessione dellORM per tutta la durata della conversazione. Gli oggetti di modello passati al livello di presentazione non sono mai staccati (detached) ma rimangono sempre nel contesto di persistenza dellORM. Le transazioni sul database sono invece aperte e chiuse allinterno delle richieste HTTP per evitare dei lock sulle righe delle tabelle ed il conseguente degrado per tutta lapplicazione. Per assicurare la

9.4. POLITICHE DI DETACH

65

coerenza dei dati tra le varie transazioni necessario abilitare un meccanismo per individuare eventuali variazione sui dati trattati, ad esempio una politica di lock ottimistico.

66

CAPITOLO 9. SERVIZIO

Capitolo

10
Scopo

Presentazione Web
10.1

TODO: Di cosa si occupa questo livello?

10.2

Tecnologie

TODO: Panoramica brevissima su JSF, Spring WebFlow e Spring MVC.

10.3

Pagina di lista

TODO: Partendo da un esempio si provvede a spiegare quali sono i le coinvolti e come devono essere congurati. Si ricorda che esiste un generatore per questo.

10.4

Pagina di form

TODO: Partendo da un esempio si provvede a spiegare quali sono i le coinvolti e come devono essere congurati. Si ricorda che esiste un generatore per questo.

10.5

Componenti aggiuntivi

Per sopperire alla mancanza di alcuni componenti nel tool kit di IceFaces (ad esempio di una tabella in grado di visualizzare una sotto tabella annidata) 67

68

CAPITOLO 10. PRESENTAZIONE WEB

Regola kit propone alcuni componenti da considerarsi sostituti temporanei, ovvero da utilizzare solo no a quando non saranno disponibili delle versioni uciali con le medesime caratteristiche fornite IceFaces. Includere i componenti di Regola kit allinterno di una pagina template di facelets richiede di specicare tra i namespace utilizzati anche http://www.regola-kit.org/jsf, come nellesempio;
2 4

<html xmlns=" h t t p : //www. w3 . o r g /1999/ xhtml " x m l n s : u i=" h t t p : // j a v a . sun . com/ j s f / f a c e l e t s " ... x m l n s : r e g o l a=" h t t p : //www. r e g o l a k i t . o r g / j s f "> ...

10.5.1

expandibleTable

Questo componente espande HtmlDataTable di IceFaces facendogli disegnare, a richiesta, una riga aggiuntiva subito dopo ogni riga disegnata. Il contenuto di questa riga aggiuntiva descritto nel facet innerRow come nellesempio seguente:
1

<r e g o l a : e x p a n d i b l e T a b l e i d=" data " v a r=" primo " v a l u e="#{d a t a C o n t r o l l e r . model } "> < f : f a c e t name=" innerRow "> <i c e : o u t p u t T e x t v a l u e=" Riga a g g i u n t i v a " /> </ f : f a c e t name=" innerRow "> <i c e : c o l u m n> . . . </ i c e : c o l u m n> <i c e : c o l u m n> . . . </ i c e : c o l u m n> ... </ r e g o l a : e x p a n d i b l e T a b l e>

3 5 7 9 11

Qualsiasi componente descritto dentro il facet innerRow viene renderizzato nella riga aggiuntiva, per cui pu essere utilizzata per disegnare una sotto tabella relativa alla riga precedente, ovvero una tabella nidicata. Ad esempio supponiamo di avere un semplice modello di due classi: Primo che contiene una lista di Secondo.
1 3 5 7 9

public c l a s s Primo { int id ; S t r i n g nome ; S t r i n g cognome ; L i s t <Secondo> f i g l i = new A r r a y L i s t <Secondo >() ; // a c c e s s o r }

11

public c l a s s Secondo {
13 15

S t r i n g uno ; S t r i n g due ;

10.5. COMPONENTI AGGIUNTIVI

69

17

// a c c e s s o r }

Il componente expandibleTable non richiede come modello una lista oggetti del tipo Primo ma una lista della classe di utilit ExpandibleItem che wrappano la classe originale ad aggiungono una propriet booleana per indicare se la riga aggiuntiva della tabella deve essere disegnato o meno. Per eettuare questo wrapping si pu utilizzare il metodo di utilit wrapList.
A r r a y L i s t <Primo> p r i m i = new A r r a y L i s t <Primo >() ;
2

Primo primo ;
4 6 8 10 12 14 16

primo = new Primo ( 1 , "Adam" , " Smith " ) ; primo . f i g l i . add (new Secondo ( " 1 . 1 " , " 1 . 2 " ) ) ; primo . f i g l i . add (new Secondo ( " 1 . 3 " , " 1 . 4 " ) ) ; primo . f i g l i . add (new Secondo ( " 1 . 5 " , " 1 . 6 " ) ) ; p r i m i . add ( primo ) ; primo = new Primo ( 2 , " Karl " , "Marx" ) ; primo . f i g l i . add (new Secondo ( " 2 . 1 " , " 2 . 2 " ) ) ; primo . f i g l i . add (new Secondo ( " 2 . 3 " , " 2 . 4 " ) ) ; primo . f i g l i . add (new Secondo ( " 2 . 5 " , " 2 . 6 " ) ) ; p r i m i . add ( primo ) ; ...

18

L i s t model = E x p a n d i b l e I t e m . w r a p L i s t ( p r i m i ) ;

Il modello cos trattato deve essere fornito da un managed bean ad esempio dataController:
1 3 5 7 9 11 13

public c l a s s D a t a C o n t r o l l e r { L i s t model ; public D a t a C o n t r o l l e r ( ) { ... model = E x p a n d i b l e I t e m . w r a p L i s t ( p r i m i ) ; } // a c c e s s o r }

Lultimo tassello del puzzle il template faceltet da utilizzare che potrebbe essere simile a questo:
1

<i c e : f o r m> <r e g o l a : e x p a n d i b l e T a b l e i d=" data " v a r=" primo " v a l u e="#{d a t a C o n t r o l l e r . model } "> < f : f a c e t name=" innerRow "> <i c e : d a t a T a b l e v a r=" f i g l i o " v a l u e="#{primo . t a r g e t . f i g l i } "> <i c e : c o l u m n> < f : f a c e t name=" h e a d e r "> <i c e : o u t p u t T e x t v a l u e="UNO" />

3 5 7

70
9 11 13 15 17 19 21 23 25 27 29 31 33 35

CAPITOLO 10. PRESENTAZIONE WEB


</ f : f a c e t> <i c e : o u t p u t T e x t v a l u e="#{ f i g l i o . uno } " /> </ i c e : c o l u m n> <i c e : c o l u m n> . . . </ i c e : c o l u m n> </ i c e : d a t a T a b l e> </ f : f a c e t> <i c e : c o l u m n> < f : f a c e t name=" h e a d e r "> <i c e : o u t p u t T e x t v a l u e=" " /> </ f : f a c e t> <i c e : s e l e c t B o o l e a n C h e c k b o x v a l u e="#{primo . expanded } " p a r t i a l S u b m i t=" t r u e " /> </ i c e : c o l u m n> <i c e : c o l u m n> < f : f a c e t name=" h e a d e r "> <i c e : o u t p u t T e x t v a l u e="ID" /> </ f : f a c e t> <i c e : o u t p u t T e x t v a l u e="#{primo . t a r g e t . i d } " /> </ i c e : c o l u m n>

<i c e : c o l u m n> . . . </ i c e : c o l u m n> </ r e g o l a : e x p a n d i b l e T a b l e> </ i c e : f o r m>

Da notare che le espressioni utilizzate per il binding devono tener conto che loggetto in lista del tipo ExpandibleItem e non del tipo Primo, per cui per accedere alle propriet di questultimo necessario passare attraverso la propriet ExpandibleItem.target. Inne si consideri come la propriet ExpandibleItem.expanded determini la visibilit della riga aggiuntiva.

Capitolo

11
Servizi Web SOAP

Application mashup
11.1

Un modo molto comune per consentire ad applicazioni esterne di accedere al livello di servizio delle applicazioni scritte con Regola kit quello di esportare uno o pi bean situati in quel livello tramite servizio web (web service). Per farlo necessario che la classe sia progettata in modo da consentire la costruzione della busta SOAP o, in generale, in modo da consentire la conversione dei parametri scambiati in una qualche forma di XML; ad esempio buona norma utilizzare tipo serializzabili, rendere transitorie le associazioni che non si intende trasferire nel servizio, gestire le ricorsioni nel grafo di oggetti, ecc. Regola kit utilizza CXF per gestire in toto i servizi web, per cui si rimanda alla documentazione uciale per le tante e utili opzioni disponibili. Di seguito presenteremo un esempio piuttosto comune di basato su JAX-WS realizzato a partire da codice Java esistente nel livello di presentazione. La prima cosa marcare linterfaccia del servizio con lannotazione WebService :
2 4

@WebService public i n t e r f a c e HelloWorldManager { S t r i n g sayHi (@WebParam( name=" t e x t " ) S t r i n g t e x t ) ; }

Anche la classe che realizza questa interfaccia deve essere annotata per precisare, ad esempio, il nome del servizio stesso:
2 4 6 8

@WebService ( e n d p o i n t I n t e r f a c e = "demo . s e r v i c e . HelloWorld " , s e r v i c e N a m e = " HelloWorld " ) public c l a s s HelloWorldManagerImpl implements HelloWorldManager { public S t r i n g sayHi ( S t r i n g t e x t ) { return " H e l l o " + t e x t ; }

71

72
}

CAPITOLO 11. APPLICATION MASHUP

A questo punto rimane da congurare il bean in modo tale che costituisca un Service End Point. Nellesempio di seguito viene modicato il le applicationContext-services.xml in modo da prevedere anche il protocollo di sicurezza WS-Security:
1

3 5 7 9 11 13 15 17

<j a x w s : e n d p o i n t i d=" h e l l o W o r l d " implementor="demo . s e r v i c e . impl . HelloWorldManagerImpl " a d d r e s s=" / s e r v i c e s / HelloWorld "> <j a x w s : f e a t u r e s> <bean c l a s s=" o r g . apache . c x f . f e a t u r e . L o g g i n g F e a t u r e " /> </ j a x w s : f e a t u r e s> <j a x w s : i n I n t e r c e p t o r s> <bean c l a s s=" o r g . apache . c x f . ws . s e c u r i t y . w s s 4 j . W S S 4 J I n I n t e r c e p t o r "> <c o n s t r u c t o r a r g> <map> <e n t r y key=" a c t i o n " v a l u e=" UsernameToken Timestamp " /> <e n t r y key=" passwordType " v a l u e=" PasswordText " /> <e n t r y key=" p a s s w o r d C a l l b a c k C l a s s " v a l u e=" S e r v e r P a s s w o r d C a l l b a c k " /> </map> </ c o n s t r u c t o r a r g> </ bean> </ j a x w s : i n I n t e r c e p t o r s> </ j a x w s : e n d p o i n t>

Da notare tra le features labilitazione del log e tra gli inIntercaptors la congurazione della classe WSS4JInInterceptor che predispone il servizio di sicurezza WS-Security, in questo caso basato su Timestamp e su semplice password in chiaro. Conclude il tutto la classe ServerPasswordCallback che si occupa di vericare le password in ingresso.
1 3 5 7 9 11 13

public c l a s s S e r v e r P a s s w o r d C a l l b a c k implements C a l l b a c k H a n d l e r { public void h a n d l e ( C a l l b a c k [ ] c a l l b a c k s ) throws IOException , UnsupportedCallbackException { WSPasswordCallback pc = ( WSPasswordCallback ) c a l l b a c k s [ 0 ] ; i f ( pc . g e t I d e n t i f e r ( ) . e q u a l s ( " j o e " ) ) { i f ( ! pc . g e t P a s s w o r d ( ) . e q u a l s ( " password " ) ) { throw new S e c u r i t y E x c e p t i o n ( " wrong password " ) ; } } } }

CXF consente inoltre di congurare un client per il servizio in modo analogo ance se un po prolisso:
1 3 5

<bean i d=" p r e n o t a z i o n i " c l a s s="demo . s e r v i c e . HelloWorldManager " f a c t o r y bean=" c l i e n t F a c t o r y " f a c t o r y method=" c r e a t e " /> <bean i d=" c l i e n t F a c t o r y " c l a s s=" o r g . apache . c x f . jaxws . JaxWsProxyFactoryBean "> <p r o p e r t y name=" s e r v i c e C l a s s " v a l u e=" i t . k i o n . s e r v i c e . P r e n o t a z i o n i M a n a g e r " /> <p r o p e r t y name=" a d d r e s s " v a l u e=" h t t p : // l o c a l h o s t / soap / s e r v i c e s / HelloWorld " /> <p r o p e r t y name=" o u t I n t e r c e p t o r s ">

11.2. SERVIZI WEB REST

73

9 11 13 15 17 19 21 23 25 27

< l i s t> <bean c l a s s=" o r g . apache . c x f . ws . s e c u r i t y . w s s 4 j . WSS4JOutInterceptor "> <c o n s t r u c t o r a r g> <map> <e n t r y key=" a c t i o n " v a l u e=" UsernameToken Timestamp " /> <e n t r y key=" passwordType " v a l u e=" PasswordText " /> <e n t r y key=" u s e r " v a l u e=" j o e " /> <e n t r y key=" p a s s w o r d C a l l b a c k C l a s s " v a l u e=" C l i e n t P a s s w o r d C a l l b a c k " /> </map> </ c o n s t r u c t o r a r g> </ bean> <bean c l a s s=" o r g . apache . c x f . i n t e r c e p t o r . L o g g i n g O u t I n t e r c e p t o r " /> </ l i s t> </ p r o p e r t y> <p r o p e r t y name=" i n I n t e r c e p t o r s "> < l i s t> <bean c l a s s=" o r g . apache . c x f . i n t e r c e p t o r . L o g g i n g I n I n t e r c e p t o r " /> </ l i s t> </ p r o p e r t y> </ bean>

Qui possibile vedere la congurazione per la sicurezza (speculare a quella lato server) , la congurazione del log e la classe ClientPasswordCallback responsabile di presentare al server le password.
1 3 5 7 9

public c l a s s C l i e n t P a s s w o r d C a l l b a c k implements C a l l b a c k H a n d l e r { public void h a n d l e ( C a l l b a c k [ ] c a l l b a c k s ) throws IOException , UnsupportedCallbackException { WSPasswordCallback pc = ( WSPasswordCallback ) c a l l b a c k s [ 0 ] ; // s e t t h e password f o r our message . pc . s e t P a s s w o r d ( " password " ) ; } }

CXF una libreria davvero completa che consente di realizzare servizi web in modalit diversa (ad esempio partendo dal WSDL piuttosto che dal codice Java, oppure utilizzando SOAP o servizi di tipo REST, ecc.). Si invita quindi a consultare la documentazione per avere un quadro generale delle funzioni disponibili. Per utilizzare CXF allintenro di JBOSS 4.2.2 necessario impostare il parametro di avvio della virtual machine javax.xml.soap.MessageFactory al valore com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.

11.2

Servizi Web REST

Un servizio di tipo REST pu essere realizzato sempre annotando una classe di tipo manager (nel livello quindi di servizio) nel modo seguente:
1 3

@Path ( " /nomes e r v i z i o / " ) @ProduceMime ( " t e x t /xml" ) public c l a s s RestManager {

74

CAPITOLO 11. APPLICATION MASHUP

@POST @Path ( " / f o o /{ i d }/{nome} " ) public Dto postFoo ( @PathParam ( " i d " ) S t r i n g id , @PathParam ( "nome" ) S t r i n g nome , Dto parametro ) { return new Dto ( i d + " : " + nome + " : " + parametro . prova ) ;

7 9 11

} @PUT @Path ( " / f o o /{ i d }/{nome} " ) public Dto putFoo ( @PathParam ( " i d " ) S t r i n g id , @PathParam ( "nome" ) S t r i n g nome , Dto parametro ) { return new Dto ( i d + " : " + nome + " : " + parametro . prova ) ;

13 15 17

} @GET @Path ( " / f o o /{ i d }/{nome} " ) public S t r i n g getFoo ( @PathParam ( " i d " ) i n t id , @PathParam ( "nome" ) S t r i n g nome ) { return "GET d i : " + i d + " : " + nome ;

19 21 23

} @DELETE @Path ( " / f o o /{ i d }/{nome} " ) public S t r i n g d e l e t e F o o ( @PathParam ( " i d " ) i n t id , @PathParam ( "nome" ) S t r i n g nome ) { return "DELETE d i : " + i d + " : " + nome ;

25 27 29

} }

Le cose importanti da sottolineare sono: 1. lannotazione @Path che specica la url alla quale risponde il servizio ed le singole operazioni, nellesempio /nome-servizio/foo. 2. I parametri di tipo primitivi (stringhe, diciamo) sono passati alloperazione aggiungendoli alla url. Sempre nellannotazione @Path possibile indicare i nomi dei parametri ( @Path(/foo/id/nome) )che poi saranno eettivamente passati al metodo Java con lannotazione @PathParam (ad esempio @PathParam(id) ). 3. il metodo http al quale loperazione deve rispondere ad esempio @POST, @GET , @PUT e @DELETE La registrazione del servizio in Spring richiede semplicemente qualcosa di simile ad questo:
1 3 5 7

< j a x r s : s e r v e r i d=" t e s t S e r v i c e " a d d r e s s=" / "> <j a x r s : s e r v i c e B e a n s> < r e f bean=" t e s t S e r v i c e I m p l " /> </ j a x r s : s e r v i c e B e a n s> </ j a x r s : s e r v e r> <bean i d=" t e s t S e r v i c e I m p l " c l a s s=" i t . k i o n . s e r v i c e . RestManager " />

Per invocare i servizi di tipo REST Regola kit mette a disposizione RestClient, una piccola classe che dovrebbe rendere agevole linvocazione di ser-

11.3. PORTLET

75

vizi. Ad esempio: per un invocare un servizio col metodo http GET si pu procedere come segue:
1

S t r i n g r e s u l t = g e t ( u r l , param1 , param2 ,

. . . , paramN ) ;

I parametri sono utilizzati per costruire la url che diventa qualcosa di simile ad ( url/param1/param2/.../paramN). Enche possibile passare una singola entit nel body della richiesta HTTP, tipicamente una frammento di xml che rappresenta unistanza di un oggetto (creato con la classe di utilit di Regola kit JAXBMarshaller):
2

Dto dto = new Dto ( ) ; S t r i n g dtoXml = toXml ( " o r g . r e g o l a . ws" , " dto " , dto ) ; S t r i n g r e s u l t = p o s t ( u r l , dtoXml , 1 , " s a l v e ! " ) ;

Anche il valore di ritorno dei servizi spesso sono dei documenti xml che rappresentano un oggetto; per ottenere loggetto di partenza si pu ricorrere sempre alla classe JAXBMarshaller:
2

S t r i n g r e s u l t = put ( u r l , dtoXml , 1 , " s a l v e ! " ) ; Dto dto = fromXml ( " o r g . r e g o l a . ws" , r e s u l t ) ;

Nota bene: prima di eettuare le conversioni oggetto/xml necessario utilizzare il compilatore di JAXB per annotare le classi coinvolte e produrre un oggetto del tipo ObjectFactory (si veda la documentazione di JAXB). Ad esempio, partendo da uno schema xml che descrive il documento relativo ad una certa classe, diciamo Dto, bisogna invocare il compilatore di JAXB come segue:
1

x j c schema1 . xsd p i t . i l . tuo . package d s r c / main / j a v a

A questo punto tutte le classi coinvolte saranno create nel package it.il.tuo.package unitamente alla classe ObjectFactory. Inne se per qualche bizzarra circostanza si disponesse solo della classe e non dello schema relativo, sar possibile usare il metodo di utilit JAXBMarshaller.generateSchema() per ottenere uno schema di base.

11.3

Portlet

Le pagine di delle applicazioni Regola kit possono essere fruite normalmente attraverso il browser (come abbiamo descritto nei capitoli precedenti) e, nel contempo, esportate come Portlet; questo doppio canale di fruizione ore il vantaggio di poter esportare la vostra applicazione allinterno di portale, di testare la vostra Portlet semplicemente dal browser e, inne, di poter utilizzare lo stesso stack operativo di Regola kit (dao, manager, Model Pattern, ecc.) per realizzare Portlet. Per trasformare una pagina web in una Portlet necessario adottare alcune accortezza allinterno del modello facelet (il le con estensione .xhtml)

76

CAPITOLO 11. APPLICATION MASHUP

e specicare alcune congurazioni. Per quando riguardo il primo punto bisogna limitarsi ad inserire il tag ice:portlet dopo il tag f:view e prima di tutta la gerarchia di componenti. Ecco un semplice esempio di pagina abilitata ad essere un modello di Portlet:
1

3 5 7 9 11 13

< !D C Y E html PUBLIC "//W3C//DTD XHTML 1 . 0 T r a n s i t i o n a l //EN" O T P " h t t p : //www. w3 . o r g /TR/ xhtml1 /DTD/ xhtml1t r a n s i t i o n a l . dtd "> <html xmlns=" h t t p : //www. w3 . o r g /1999/ xhtml " x m l n s : u i=" h t t p : // j a v a . sun . com/ j s f / f a c e l e t s " x m l n s : h=" h t t p : // j a v a . sun . com/ j s f / html " x m l n s : f=" h t t p : // j a v a . sun . com/ j s f / c o r e " x m l n s : i c e=" h t t p : //www. i c e s o f t . com/ i c e f a c e s / component "> <body> <f : v i e w> < i c e : p o r t l e t> P o r t l e t d i e se m pi o r e a l i z z a t a con Regola k i t </ i c e : p o r t l e t> </ f : v i e w> </ body> </ html>

Per quanto riguarda le congurazioni bisogna intervenire prima di tutto sul le /WEB-INF/portlet.xml per elencare le Portlet esportate dallapplicazione e per ciascuna indicare il nome (nellesempio MyPortlet) e la pagina web da utilizzare come modello (ad esempio /myportlet.html). Per le altre congurazioni si rimanda alla documentazione uciale relativa alle Portlet. Ecco un esempio di congurazione:
2

4 6 8 10 12 14 16 18 20

<?xml version=" 1 . 0 " ?> <p o r t l e t app xmlns=" h t t p : // j a v a . sun . com/xml/ ns / p o r t l e t / p o r t l e t app_1_0 . xsd " version=" 1 . 0 " x m l n s : x s i=" h t t p : //www. w3 . o r g /2001/XMLSchemai n s t a n c e " x s i : s c h e m a L o c a t i o n=" h t t p : // j a v a . sun . com/xml/ ns / p o r t l e t / p o r t l e t app_1_0 . xsd h t t p : // j a v a . sun . com/xml/ ns / p o r t l e t / p o r t l e t app_1_0 . xsd "> < p o r t l e t> <p o r t l e t name>MyPortlet</ p o r t l e t name> <d i s p l a y name>Regola k i t P o r t l e t</ d i s p l a y name> <p o r t l e t c l a s s>com . i c e s o f t . f a c e s . webapp . h t t p . p o r t l e t . M a i n P o r t l e t</ p o r t l e t c l a s s> <i n i t param> <name>com . i c e s o f t . f a c e s .VIEW </name> <v a l u e>/ m y p o r t l e t . html</ v a l u e> </ i n i t param> <s u p p o r t s> <mimet y p e>t e x t / html</mimet y p e> <p o r t l e t mode>view</ p o r t l e t mode> </ s u p p o r t s> <p o r t l e t i n f o> < t i t l e>Regola k i t P o r t l e t Example</ t i t l e> <s h o r t t i t l e>My P o r t l e t</ s h o r t t i t l e> <keywords>r e g o l a k i t i c e f a c e s p o r t l e t</ keywords> </ p o r t l e t i n f o> </ p o r t l e t> </ p o r t l e t app>

A questo punto la vostra applicazione in grado di essere consegnata dentro un portale aderente alle speciche Portlet 1.0, ad esempio LifeRay o JeetSpeed alla cui documentazione rimandiamo per i dettagli del deploy. Di seguito per illustreremo come importare la nostra applicazione allin-

11.4. MASHUP

77

terno di un container Pluto che consiste semplicemente nellaggiungere allinterno del /WEB-INF/web.xml una servelt del tipo PortletServlet associata ad ogni Portlet esposta (nellesempio MyPortlet) e mappata allindirizzo /PlutoInvoker/NomePortlet. Ecco il frammento da aggiungere al le web.xml:
2 4 6 8 10 12 14

< s e r v l e t> <s e r v l e t name>MyPortlet</ s e r v l e t name> <s e r v l e t c l a s s>o r g . apache . p l u t o . c o r e . P o r t l e t S e r v l e t</ s e r v l e t c l a s s> <i n i t param> <paramname>p o r t l e t name</paramname> <paramv a l u e>MyPortlet</paramv a l u e> </ i n i t param> <l o a d ons t a r t u p>1</ l o a d ons t a r t u p> </ s e r v l e t> <s e r v l e t mapping> <s e r v l e t name>MyPortlet</ s e r v l e t name> <u r l p a t t e r n>/ P l u t o I n v o k e r / MyPortlet</ u r l p a t t e r n> </ s e r v l e t mapping>

Inne bisogna consegnare la nostra applicazione nella stessa istanza del container (ad esempio di Tomcat 5.5) in cui sta girando il container Pluto. Ricordiamo che le applicazioni Regola kit sono congurate di default per essere un container Pluto (oltre che un fornitore di Portlet) e quindi possono visualizzare Portlet di altre applicazioni (realizzate o meno con Regola kit). Vediamo come.

11.4

Mashup

Unapplicazione realizza un mashup quando le proprie pagine raccolgono allinterno frammenti di altre applicazioni. Regola kit realizza il mashup di Portlet e fornisce strumenti per agevolare la realizzazioni di Portlet come descritto nel paragrafo precedente. Le applicazioni Regola kit sono di default dei contenitori di Portlet basati su Pluto, quindi non necessario realizzare nessuna congurazione per abilitare questa funzionalit tranne ricordarsi di abilitare, a livello di container, la funzionalit di accedere al altri contesti. In Tomcat 5.5 questo si realizza specicando nel descrittore di contesto qualcosa di simile a questo:
1

<Context c r o s s C o n t e x t=" t r u e " />

Ricordiamo che il contesto si pu congurare dentro la cartella conf di Tomcat, oppure dentro conf/Catalina/localhost o addirittura dentro la web root nel le META-INF/context.xml. I Portlet ad importare allinterno della vostra applicazione devono essere consegnati nello stesso application server dove gira il container. Attualmente possibile utilizzare esclusivamente delle pagine jsp per eettuare il mashup

78

CAPITOLO 11. APPLICATION MASHUP

dei vari portlet. Ecco un esempio di pagina in cui viene inclusa una Portlet chiamata MyPortlet, fornita da unapplicazione che si trova nel contesto homes:
1 3 5 7

11 13 15 17

<% t a g l i b u r i=" h t t p : // j a v a . sun . com/ j s t l / c o r e " p r e f i x=" c " % @ > <% t a g l i b u r i=" h t t p : // p o r t a l s . apache . o r g / p l u t o " p r e f i x=" p l u t o " % @ > <html> <head> < t i t l e>Prova</ t i t l e> < s t y l e t y p e=" t e x t / c s s " t i t l e =" c u r r e n t S t y l e " media=" s c r e e n "> @import "<c : o u t v a l u e=" ${ pageContext . r e q u e s t . c o n t e x t P a t h } "/>/ p l u t o . c s s " ; @import "<c : o u t v a l u e=" ${ pageContext . r e q u e s t . c o n t e x t P a t h } "/>/ p o r t l e t sp ec 1 . 0 . c s s " ; </ s t y l e> < s c r i p t t y p e=" t e x t / j a v a s c r i p t " s r c="<c : o u t v a l u e=" ${ pageContext . r e q u e s t . c o n t e x t P a t h } "/>/ p l u t o . j s "></ s c r i p t> </ head> <body> <h1>Questa p a g i n a i n c l u d e l a p o r t l e t con nome MyPortlet</ h1> < p l u t o : p o r t l e t p o r t l e t I d=" / homes . MyPortlet "> <p l u t o : r e n d e r /> </ p l u t o : p o r t l e t> </ body> </ html>

Capitolo

12
Autenticazione

Sicurezza
12.1

Lautenticazione mediante SSO di ogni applicazione richiede una serie di scambi tra lapplicazione stessa e Cas che sono rappresentati nel graco seguente e descritti poco dopo:

Figura 12.1: Processo di autenticazione 1. Quando un browser tenta di accedere per la prima volta ad unapplicazione (dora in poi Client) realizzata con Regola kit e protetta con cas il browser viene reindirizzato allapplicazione Cas (dora in poi CAS) passandole come parametro una stringa che rappresenta il servizio richiesto. Su CAS attraverso un form HTML lutente inserisce username e password. A questo punto, se lautenticazione andata a buon ne, CAS conosce il netID dellutente autenticato, ad esempio nicola.santi@unibo.it 79

80

CAPITOLO 12. SICUREZZA 2. CAS ridirige il browser allapplicazione Client passandole come parametro il service ticket, un numero che servir poi in seguito. 3. Client richiama CAS passandogli il service ticket appena ricevuto ed una URL chiamata pgt url che CAS user in seguito. A questa chiamata CAS risponde con il netID dellutente (nicola.santi@unibo.it) ed un altra stringa, il pgtIOU che servir in seguito. 4. CAS richiama il client alla url che aveva ricevuto nella richiesta precedente (la pgt url) ed invia a Client di nuovo lo stesso pgtIOU di prima perch Client verichi che siano uguali ed inoltre invia un pgt da usare in seguito nellautenticazione di tipo proxy. A questo punto lautenticazione di un utente che voleva accedere a Client tramite browser terminata. Rimane da spiegare lautenticazione di tipo proxy, ovvero se Client decide di invocare ad esempio un servizio web di unaltra applicazione, diciamo Server senza doversi riautenticare. 5. Client invia il pgt a CAS che gli risponde con il proxy ticket, una stringa da passare a Server. 6. Client richiama Server e gli passa il proxy ticket. 7. Server contatta CAS passandogli il proxy ticket e la pgt url. A questa chiamata CAS risponde con il netID dellutente (nicola.santi@unibo.it) ed un altra stringa, il pgtIOU che servir in seguito. Questo passaggio del tutto simile a quello numero 3. Seguir una passaggio simile a 4 in cui CAS chiamer Server passandogli pgt e pgtIOU.

Le url coinvolte nei passaggi precedenti sono congurabili allinterno dellapplicazione Client modicando alcune propriet nel le src/main/webapp/WEBINF/cas.properties. La tabella seguente riporta le url coinvolte per ogni passo unitamente alla propriet da congurarare ed il suo valore di default: step 1 2 3,7 4 5 6 URL login url service url validation url pgt url proxy url la url specica del servizio parametro cas.loginUrl=/login cas.main=/personale/j_acegi_cas_security_check cas.validationUrl=/proxyValidate cas.pgtUrl=/casProxy cas.proxyUrl=/proxy

12.2

Congurazione di Cas

Anch la propria applicazione (Client o Server) possa usufruire del SSO deve registrare presso Cas uno (o pi servizi). I servizi sono essenzialmente

12.3. CONFIGURAZIONE DI CLIENT

81

identicati da una stringa che deve corrispondere (anche solo parzialmente come vedremo) con la service url richiamata da Cas al punto 2. Per non restare nel vago immaginiamo di dover registrare un servizio per unapplicazione che risponde alla url https://tirocini.unibo.it e la cui service url sia https://tirocini.unibo.it/j_acegi_cas_security_check. Il nome del servizio pu coincidere con questa url oppure con una suo sottoparte come ad esempio https://tirocini.unibo.it/* (si prega di notare lasterisco). Si rammenta che nel caso di autorizzazione di tipo proxy necessario utilizzare due servizi distinti, uno per lautenticare lapplicazione Client da passare nel passo 1 ed quello da utilizzare per lapplicazione Server per il passo 5; da notare che il secondo servizio deve coincidere (anche solo parzialmente) con la url di Server mentre il primo con la url di Client.

12.3

Congurazione di Client

Nonostante le possibilit di Cas siano particolarmente ampie, la congurazione di default realizzata da Regola kit dovrebbe soddisfare le esigenze pi comuni di unapplicazione web. In questo caso la congurazione si limita a modicare il nome del servizio e lhost dove risponde Cas allinterno del le src/main/webapp/WEB-INF/cas.properties.
2 4 6 8 10

# s e r v i z i r e g i s t r a t i p e r q u e s t a a p p l i c a z i o n e ( da r i p o r t a r e s u l s e r v e r CAS) c a s . s e r v i c e . p r o x i e d=/ s e r v i c e s / c a s . main=/ p e r s o n a l e / j _ a c e g i _ c a s _ s e c u r i t y _ c h e c k # url di test c a s . h o s t U r l=h t t p s : // l o c a l h o s t : 8 4 4 3 / c a s c a s . ourAppUrl=h t t p s : // l o c a l h o s t : 8 4 4 3 /${ a r t i f a c t I d } # url di produzione prod . c a s . h o s t=h t t p s : // l o c a l h o s t : 8 4 4 3 / c a s prod . c a s . ourAppUrl=h t t p s : // l o c a l h o s t : 8 4 4 3 /${ a r t i f a c t I d }

Nellesempio abbiamo congurato due servizi, uno per lautenticazione di tipo proxy ovvero quando la nostra applicazione funziona come Server alla url /services e laltra per quando lapplicazione nostra funziona come Client. In questo caso conviene usare come nome del servizio la nostra service url, come nellesempio. Le altre propriet specicano le url della nostra applicazione e del server Cas sia in produzione sia in test. La prossima congurazione da modicare si trova del le src/main/webapp/WEBINF/security-cas.xml e prevede limpostazione delle url da proteggere e per ciascuna di esse quale gruppo a titolo per visualizzarle.
1

<bean i d=" f i l t e r C h a i n P r o x y " c l a s s=" o r g . a c e g i s e c u r i t y . u t i l . F i l t e r C h a i n P r o x y "> <p r o p e r t y name=" f i l t e r I n v o c a t i o n D e f i n i t i o n S o u r c e "> <v a l u e>

82

CAPITOLO 12. SICUREZZA

5 7 9 11 13 15 17 19 21 23 25 27 29 31 33

CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT / images/=#NONE # / s c r i p t s /=#NONE # / s t y l e s /=#NONE # / p o r t a l . j s p=h t t p S e s s i o n C o n t e x t I n t e g r a t i o n F i l t e r , l o g o u t F i l t e r M a i n , c a s P r o c e s s i n g F i l t e r , / p e r s o n a l e /= h t t p S e s s i o n C o n t e x t I n t e g r a t i o n F i l t e r , l o g o u t F i l t e r M a i n , c a s P r o c e s s i n g F i l t e r </ v a l u e> < ! Put c h a n n e l P r o c e s s i n g F i l t e r b e f o r e s e c u r i t y C o n t e x t H o l d e r A w a r e R e q u e s t F i l t e r t o t u r n on SSL s w i t c h i n g > </ p r o p e r t y> </ bean> < ! s p e c i f i c a r u o l i che possono a c c e d e r e a l l e d i v e r s e u r l > <bean i d=" f i l t e r I n v o c a t i o n I n t e r c e p t o r " c l a s s=" o r g . a c e g i s e c u r i t y . i n t e r c e p t . web . F i l t e r S e c u r i t y I n t e r c e p t o r "> <p r o p e r t y name=" a u t h e n t i c a t i o n M a n a g e r " r e f=" c a s A u t h e n t i c a t i o n M a n a g e r " /> <p r o p e r t y name=" a c c e s s D e c i s i o n M a n a g e r " r e f=" a c c e s s D e c i s i o n M a n a g e r " /> <p r o p e r t y name=" o b j e c t D e f i n i t i o n S o u r c e "> <v a l u e> PATTERN_TYPE_APACHE_ANT / p o r t a l . j s p=admin , u s e r / e s t e r n i / r i c h i e s t a .=ROLE_ANONYMOUS, admin , u s e r / e s t e r n i / l o g i n M i g r a z i o n e .=ROLE_ANONYMOUS, admin , u s e r / / . htm=admin , u s e r / / . j s p =admin , u s e r </ v a l u e> </ p r o p e r t y> </ bean>

Questo quanto occorre generalmente per consentire alla propria applicazione di funzionare sia come Client che come Server. Nel resto di questo capitolo mostreremo le altre possibili variazioni che comprendono la modica del le src/main/webapp/WEB-INF/security-cas.xml ma richiedono una conoscenza pi approfondita di Cas e Acegi Securty.

12.4

Presentazione

Il sistema di sicurezza costruito attorno ad una catena di oggetti chiamati ltri che vengono eseguiti in cascata e cooperano per assolvere i diversi compiti nei quali la funzione della sicurezza si concretizza. Esistono molti ltri standard ma comunque possibile aggiungerne di personalizzati ad esempio per aggiungere un sistema di autenticazione proprietario o non ancora implementato. Lelenco che segue indica i ltri standard nellordine con cui sono eseguiti e per ciascuno il nome della classe che lo implementa ed un alias per riferirsi ad esso:

12.4. PRESENTAZIONE

83

CHANNEL_FILTER ChannelProcessingFilter CONCURRENT_SESSION_FILTER ConcurrentSessionFilter SESSION_CONTEXT_INTEGRATION_FILTER HttpSessionContextIntegrationFilter LOGOUT_FILTER LogoutFilter X509_FILTER X509 PreAuthenticatedProcessigFilter PRE_AUTH_FILTER Subclass of AstractPreAuthenticatedProc CAS_PROCESSING_FILTER CasProcessingFilter AUTHENTICATION_PROCESSING_FILTER AuthenticationProcessingFilter BASIC_PROCESSING_FILTER BasicProcessingFilter SERVLET_API_SUPPORT_FILTER classname REMEMBER_ME_FILTER RememberMeProcessingFilter ANONYMOUS_FILTER AnonymousProcessingFilter EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilter NTLM_FILTER NtlmProcessingFilter FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptor SWITCH_USER_FILTER SwitchUserProcessingFilter Prima di calarci nel dettaglio dei ltri pi importanti conviene concentrarci sulla congurazione pi importante del sistema, ovvero quella che specica quali di questi ltri utilizzare per una certa url e che si concretizza nella denizione del bean lterChainProxy:
1 3 5 7 9 11 13

<bean i d=" f i l t e r C h a i n P r o x y " c l a s s=" o r g . a c e g i s e c u r i t y . u t i l . F i l t e r C h a i n P r o x y "> <p r o p e r t y name=" f i l t e r I n v o c a t i o n D e f i n i t i o n S o u r c e "> <v a l u e> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT / images/=#NONE # / s c r i p t s /=#NONE # / s t y l e s /=#NONE # /= h t t p S e s s i o n C o n t e x t I n t e g r a t i o n F i l t e r , l o g o u t F i l t e r , a u t h e n t i c a t i o n P r o c e s s i n g F i l t e r , s e c u r i t y C o n t e x </ v a l u e> </ p r o p e r t y> </ bean>

Laspetto piuttosto intimidatorio sulle prime ma in eetti si limita a specicare le catene di ltri da adottare per le url indicate, nellesempio dispone di non utilizzare nessun ltro (#NONE#) per le url /images/**, /scripts/**, e /style/**. Per tutte le altre url (/**) invece si utilizza la catena dei sette ltri specicati. Si pu notare che le url sono indicate utilizzando la notazione di ANT essendo stato passato il parametro PATTERN_TYPE_APACHE_ANT, alternativamente si potevano utilizzare le espressioni regolari. Come si diceva ogni ltro assolve un compito specico e deve essere congurato per modicarne comportamento; ad esempio lultimo dei sette ltri specicati nella catena, lterInvocationInterceptor, si occupa di stabilire quali utenti (o quali gruppi di utenti) possano accedere alle pagine

84 protette. Si pu congurare come segue:


1 3 5 7 9 11 13 15

CAPITOLO 12. SICUREZZA

<bean i d=" f i l t e r I n v o c a t i o n I n t e r c e p t o r " c l a s s=" o r g . a c e g i s e c u r i t y . i n t e r c e p t . web . F i l t e r S e c u r i t y I n t e r c e p t o r "> <p r o p e r t y name=" a u t h e n t i c a t i o n M a n a g e r " r e f=" a u t h e n t i c a t i o n M a n a g e r " /> <p r o p e r t y name=" a c c e s s D e c i s i o n M a n a g e r " r e f=" a c c e s s D e c i s i o n M a n a g e r " /> <p r o p e r t y name=" o b j e c t D e f i n i t i o n S o u r c e "> <v a l u e> PATTERN_TYPE_APACHE_ANT / s e r v i c e s /=ROLE_ANONYMOUS, admin , u s e r / l o g i n .=ROLE_ANONYMOUS, admin , u s e r / / . html=admin , u s e r </ v a l u e> </ p r o p e r t y> </ bean>

Iniziamo dalla propriet dal nome oscuro objectDenitionSource che specica una serie di url (sempre nel formato ANT) e per ciascuno quale utente o ruolo ha il permesso di accesso; ad esempio le url del tipo /services/* possono essere accedute da tutti (utenti anonimi cio quelli con il ruolo ROLE_ANONYMOUS, lutente admin e lutente user). Stessa cosa per la pagina di login mentre per tutte le altre pagine laccesso consentito solo agli utenti user ed admin. Da notare come queste regole siano applicate in cascata, cos come quelle specicate nella congurazione della catena dei ltri. Come spesso accade la congurazione di un bean ne richiede altri, nel caso di lterInvocationInterceptor si utilizzano anche i bean authenticationManager e accessDecisionManager. Trattiamo prima questultimo che ha il compito di stabilire se un utente possa o meno accedere; di solito si utilizza una congurazione standard per in base al ruolo si pu accedere o meno. La congurazione la seguente.
2 4 6 8 10

<bean i d=" a c c e s s D e c i s i o n M a n a g e r " c l a s s=" o r g . a c e g i s e c u r i t y . v o t e . A f f i r m a t i v e B a s e d "> <p r o p e r t y name=" a l l o w I f A l l A b s t a i n D e c i s i o n s " v a l u e=" f a l s e " /> <p r o p e r t y name=" d e c i s i o n V o t e r s "> < l i s t> <bean c l a s s=" o r g . a c e g i s e c u r i t y . v o t e . R o l e V o t e r "> <p r o p e r t y name=" r o l e P r e f i x " v a l u e=" " /> </ bean> </ l i s t > </ p r o p e r t y> </ bean>

Laltro bean utilizzato per congurare lterInvocationInterceptor authenticationManager, si tratta di un bean importantissimo che utilizzato anche da altri ltri (ad esempio authenticationProcessingFilter, il terzo ltro della catena di sette congurata sopra). Il bean authenticationManager si occupa infatti di fornire i componenti che eettuano lautenticazione dell utente corrente (ad esempio ma non necessariamente utilizzando username

12.4. PRESENTAZIONE

85

e password) e fornire loggetto che rappresenta quellutente ed i ruoli ricoperti allinterno del sistema di sicurezza. Ora, dal momento che i metodi per autenticare un utente potrebbero essere diversi, ad esempio prima su una database poi in caso di fallimento su un altro poi in caso di fallimento tramite LDAP e cos via authenticationManager contiene la lista di questi servizi di autenticazione chiamati authentication provider:
1 3 5 7 9

<bean i d=" a u t h e n t i c a t i o n M a n a g e r " c l a s s=" o r g . a c e g i s e c u r i t y . p r o v i d e r s . ProviderManager "> <p r o p e r t y name=" p r o v i d e r s "> < l i s t> < r e f l o c a l=" d a o A u t h e n t i c a t i o n P r o v i d e r " /> < r e f l o c a l=" a n o n y m o u s A u t h e n t i c a t i o n P r o v i d e r " /> < r e f l o c a l=" r e m e m b e r M e A u t h e n t i c a t i o n P r o v i d e r " /> </ l i s t > </ p r o p e r t y> </ bean>

Come si pu immaginare esistono gi pronti per luso diversi authentication provider come l anonymousAuthenticationProvider che provvede le credenziali per lutente anonimo, la cui congurazione si limita a dare un nome (anonymous) a questo particolare utente.
2 4

<bean i d=" a n o n y m o u s A u t h e n t i c a t i o n P r o v i d e r " c l a s s=" o r g . a c e g i s e c u r i t y . p r o v i d e r s . anonymous . A n o n y m o u s A u t h e n t i c a t i o n P r o v i d e r "> <p r o p e r t y name=" key " v a l u e=" anonymous " /> </ bean>

Invece l authentication provider rememberMeAuthenticationProvider si occupa di autenticare un utente in base ad un cookie precedentemente salvato sul browser, la cui congurazione (riutilizzando luthenticationManager ) non riportata di seguito per evitare di perdere il lo del discorso. Ci occupiamo invece del daoAuthenticationProvider perch ricopre un ruolo di rilievo nel sistema di sicurezza. Infatti la classe DaoAuthenticationProvider in grado di utilizzare tutti i meccanismi di autenticazioni basati su username e password forniti col sistema semplicemente delegando lindividuazione dellutente e del ruolo ad un bean chiamato userDetailsService.
2 4 6

<bean i d=" d a o A u t h e n t i c a t i o n P r o v i d e r " c l a s s=" o r g . s p r i n g f r a m e w o r k . s e c u r i t y . p r o v i d e r s . dao . D a o A u t h e n t i c a t i o n P r o v i d e r "> <p r o p e r t y name=" u s e r D e t a i l s S e r v i c e " r e f=" inMemoryDaoImpl " /> <p r o p e r t y name=" s a l t S o u r c e " r e f=" s a l t S o u r c e " /> <p r o p e r t y name=" passwordEncoder " r e f=" passwordEncoder " /> </ bean>

Nellesempio lo userDetailsService utitlizzato inMemoryDaoImpl che si limita a leggere utenti e password direttamente dal le di congurazione.

86

CAPITOLO 12. SICUREZZA

12.5

Congurazione semplicata

Nel paragrafo precedente abbiamo specicato la catena dei ltri da applicare per ogni url e poi indicato per ogni url quale utente o gruppo pottesse accedere. Inne abbiamo fornito un semplice sistema di autenticazione basato su un le di congurazione di utenti, gruppi e password. In molti hanno pensato che, per quanto essibile, il sistema di congurazione sopra descritto risulti davvero complicato e nalmente nella versione 2.0 (oltre al cambio di nome da Acegi a Spring Security) stato introdotto un sistema di congurazione basato su congurazioni di default ed implementato utilizzando un namespace specico. Il risulto che tutta la congurazione descritta precedentemente pu essere realizzato come segue:
<h t t p autoc o n f i g= t r u e >
2 4 6 8 10 12

<i n t e r c e p t u r l <i n t e r c e p t u r l <i n t e r c e p t u r l <i n t e r c e p t u r l <i n t e r c e p t u r l </ h t t p>

p a t t e r n=" / " a c c e s s="# NONE #" /> p a t t e r n=" / " a c c e s s="# NONE #" /> p a t t e r n=" / " a c c e s s="# NONE #" /> p a t t e r n=" / s e r v i c e s / " a c c e s s="ROLE_ANONYMOUS, admin , u s e r " /> p a t t e r n=" / / . html " a c c e s s="admin , u s e r " />

14

<a u t h e n t i c a t i o n p r o v i d e r> <u s e r s e r v i c e> <u s e r name=" j i m i " password=" j i m i s p a s s w o r d " a u t h o r i t i e s="ROLE_USER, ROLE_ADMIN" /> <u s e r name=" bob " password=" bobspassword " a u t h o r i t i e s="ROLE_USER" /> </ u s e r s e r v i c e> </ a u t h e n t i c a t i o n p r o v i d e r>

La cosa importante da segnalare che la nuova congurazione non sostituisce la precedente ma la realizza in modo automatico; ad esempio il tag <http> ed <intercept-url> deniscono implicitamente lterInvocationInterceptor specicando una catena di ltri di default mentre <authenticationprovider> crea un daoAuthenticationProvider e <user-service> un userDetailsService del tipo InMemoryDaoImpl. Questi authentication provider sono poi associati ad un bean authenticationManager proprio come quello specicato precedentemente. Si rimanda poi alla documentazione uciale per esempi in cui si mescolano le due modalit di congurazione in modo da ridurre al minimo il codice necessario a mettere in sicurezza la vostra applicazione.

Capitolo

13
Autorizzazioni

Plitvice Security
Questo documento ancora in fase di redazione cos come la libreria a cui si riferisce.

13.1

Si presentano le strutture dati: - Ruolo - Contesto

13.2

Ruolo

La classe Ruolo raccoglie principalmente una collezione di diritti di cui parleremo ampiamente tra poco. Ogni ruolo identicato da un intero unico per tutte le applicazioni e presenta una descrizione per chiarirne la nalit; questultima pu essere utilizzate nei livelli di presentazione. Ogni ruolo ha validit per unapplicazione, ovvero contiene diritti da utilizzare solo con una specica applicazione. Le applicazioni sono individuate anchesse da un intero e sono persistite in unapposita tabella di database. Si diceva che ogni ruolo contiene una collezione di diritti, ovvero di classi del tipo Diritto; gli elementi comuni ad ogni diritto sono un identicativo unico (un intero) ed un Ambito che rappresenta un ulteriore partizionamento oltre a quello gi menzionato dellapplicazione, specicato nel ruolo. Ad esempio esiste lambito dei tirocini che raccoglie tutti i diritti relativi alla grande area della gestione dei tirocini. Inoltre tutti i diritti possono fare riferimento ad unentit, ovvero un elemento del modello come indicato nel Domain Driven Development. Lelenco delle entit persistito su database, in due tabelle e a ciascuno assegnato un identicativo univoco. Inne i diritti possono essere di due tipi: di workow o applicativi. 87

88

CAPITOLO 13. PLITVICE SECURITY

13.2.1

Diritti di workow

I diritti relativi a workow si riferiscono ad un usso e specicano le autorizzazioni, ovvero se lidentit assunta dallutente corrente possa o meno segnalare una transizione oppure ottenere lelenco di tutti i documenti che si trovino in un certo stato. Di conseguenza ogni diritto di workow specica il nome del usso da utilizzare. I diritti di workow si ripartiscono, per quanto detto, in diritti da applicare agli stati e diritti da applicare alle transizioni. Questi ultimi, se presenti, consentono allidentit corrente di segnalare una transizione. Il default, ovvero in caso di assenza di uno specico diritto di questo tipo, la transazione non pu essere segnalata da nessuno. I diritti di workow che si applicano agli stati consentono di elencare tutti i documenti che si trovino in quello stato. In assenza di un particolare diritto chiunque pu richiedere lelenco completo dei documenti per quel certo stato. Da notare come questo tipo di diritti ammette un meccanismo di eccezione che consente anche ai non aventi diritto di elencare tutti i documenti in un certo stato; si rimanda alla propriet vincoloLettura di AutorizzazioneUtente e linterfaccia Visibilit per dettagli in merito.

13.2.2

Diritti applicativi

I diritti applicativi sono delle mere etichette, delle stringhe di caratteri che ricoprono un preciso signicato solo per una certa applicazione. Ad esempio il permesso individuato dalla stringa OT_INS assume un signicato solo per lapplicazione dei tirocini (ovvero quella specicata nel ruolo che contiene il diritto) che conosce quindi come comportarsi; in particolare se il permesso presente consente linserimento di nuove oerte di tirocini.

13.3

Contesti

I contesti costituiscono un sistema per limitare la visibilit delle entit; ogni applicazione presenta un modello di contesto specico del problema da arontare. In generale ogni contesto individuato in modo univoco (per lapplicazione che lo usa) con un intero.

13.3.1

Tirocini

Qui si illustrano Regole, Destinatari, ecc.

13.4. INSIEME DELLE IDENTIT

89

13.3.2

Plitvice

Qui si illustrano i contesti di Plitvice.

13.4

Insieme delle identit

Ogni utente autenticato potrebbe essere associabile a diversi ruoli o diversi contesti, ad esempio lutente con netID nicola.santi@unibo.it potrebbe scegliere tra il contesto di amministratore che consente di vedere ogni entit ed il contesto di operatore della facolt di Economia che limita le entit visibili a quelle aerenti a tale facolt. Prima di operare con unapplicazione pu essere richiesto allutente autenticato di scegliere quale identit usare; nellesempio se entrare come amministratore o come operatore. Questa scelta pu essere intesa come lindividuazione di un particolare elemento (lidentit) da un insieme che contiene tutte le identit per lutente autenticato. Come vedremo nel paragrafo successivo esiste un servizio applicativo che consente di ottenere linsieme delle identit cos come strumenti per ottenere una singola identit. Questultima rappresentata da un oggetto del tipo AutorizzazioneUtente:
1

public c l a s s A u t o r i z z a z i o n i U t e n t e implements S e r i a l i z a b l e {
3

protected S t r i n g nome ;
5

protected Long [ ]
7

idRuoli ; idContesti ;

protected Long [ ]
9

protected Long idAmbito ;


11

protected Long i d E s t e r n o S e l e z i o n a t o ;
13

private Long i d R i c h i e s t a R e g i s t r a z i o n e ;
15

transient protected V i s i b i l i t a
17

visibilita ;

protected S t r i n g t i p o ;
19

private I n t e g e r v i n c o l o L e t t u r a ;
21

Questa classe pensata per funzionare come DTO, ovvero come un oggetto da trasferire anche attraverso la rete per specicare lidentit correntemente assunta dallutente autenticato. Si veda il modulo plitvice workow per un esempio di funzionamento di questa classe. Tra le propriet spicca nome, che contiene il netID dellutente. Necessarie le propriet idRuoli, idContesti ed

90

CAPITOLO 13. PLITVICE SECURITY

idAmbito che contengono rispettivamente i ruoli, i contesti e lambito scelti tra quelli presenti nellinsieme delle identit per lutente autenticato. Per una discussione delle propriet visibilit, tipo e vincoloLettura si rimmanda al paragrafo Visibilit.

13.5

Il processo di autorizzazione

Denire linterfaccia da utilizzare

13.6

Restrizione di visibilit

La classe AutorizzazioneUtente rappresenta, come si visto, lidentit correntemente scelta dallutente autenticato. Si tratta di un DTO che il client deve inviare magari attraverso la rete ad un servizio, ad esempio un manager che gestisca un workow, per consentire a questultimo di applicare correttamente le autorizzazioni.
1

public c l a s s A u t o r i z z a z i o n i U t e n t e implements S e r i a l i z a b l e {
3

...
5

transient protected V i s i b i l i t a
7

visibilita ;

protected S t r i n g t i p o ;
9

private I n t e g e r v i n c o l o L e t t u r a ;
11

Le tre propriet elencate consentono al servizio (non al client) di implementare un meccanismo molto comodo per limitare la visibilit delle entit del modello mediante limpiego dellinterfaccia Visibilita.
public i n t e r f a c e V i s i b i l i t a extends S e r i a l i z a b l e {
2

void p u o G e s t i r e ( S e r i a l i z a b l e document ) ;
4

Il client non dovr impostare nessuna visibilit (la propriet rimane a null) ma si deve limitare ad impostare il tipo che non altro se non una stringa contenente un valore simbolico con un signicato specico per il client. Sar invece il servizio che riceve lAutorizzazioneUtente che dovr provvedere a progettare ed istanziare unimplementazione di Visibilita sulla base della propriet tipo impostato dal client. Esiste un meccanismo abbastanza comodo per istanziare diversi tipi di visibilit creando delle classi del tipo VisibilitaFactory:

13.6. RESTRIZIONE DI VISIBILIT


1 3

91

public i n t e r f a c e V i s i b i l i t a F a c t o r y { public V i s i b i l i t a c r e a t e ( A u t o r i z z a z i o n i U t e n t e i d e n t i t a ) throws TypeUnkonownException ; }

Tutte le factory create sono poi riunite in una catena del tipo VisibilitaFactoryChain mediante la seguente congurazione di Spring:
1

3 5 7

<bean i d=" v i s i b i l i t a F a c t o r y C h a i n " c l a s s=" i t . k i o n . p l i t v i c e . a u t o r i z z a z i o n i . v i s i b i l i t a . V i s i b i l i t a F a c t o r y C h a i n " > <p r o p e r t y name=" f a c t o r i e s "> < l i s t> <bean c l a s s=" E s t e r n o V i s i b i l t a F a c t o r y " /> </ l i s t > </ p r o p e r t y> </ bean>

La visibilitaFactoryChain cos ottenuta richiesta come prorpiet da tutti i servizi che aderiscono allo standard per il controllo delle autorizzazioni di Plitvice kit (ad esempio WorkowManager). Visto come il server provveda, una volta ricevuto il DTO, a creare una visibilit ed assegnarla allo stesso DTO, pu essere utile capire come utilizzare una gerarchia di classi basate su Visibilita. Ogni servizio o gruppo di servizi pu estendere linterfaccia di base con dei metodi comuni per restringere le selezioni, ad esempio con dei metodi che prendano come parametro di input un ModelPattern. Ad esempio, nel caso di utenti esterni che debbano visualizzare solo le richieste della propria azienda sarebbe possibile creare una classe simile a questa:
1 3 5 7 9 11 13 15 17

public c l a s s A b s t r a c t V i s i b i l i t a implements V i s i b i l i t a { public void l i m i t a R i c h i e s t e ( R i c h i e s t a P a t t e r n p ) { //non f a c c i o n u l l a } ... } public c l a s s V i s i b i l i t a E s t e r n i extends A b s t r a c t V i s i b i l i t a { private Long i d R i c h i e s t a ; @Override public void l i m i t a R i c h i e s t e ( R i c h i e s t a P a t t e r n p ) { p. setId ( idRichiestaRegistrazione ) ; } ... }

Dal momento che AutorizzazioniUtente passato ad ogni servizio e contiene allinterno la visibilit dellutente corrente possibile utilizzare in modo conveniente il polimorsmo come nellesempio seguente:
1

public void f a i Q u a l c o s a ( . . . ,

RichiestaPattern p , AutorizzazioniUtente i )

92
{
3

CAPITOLO 13. PLITVICE SECURITY

AbstractVisibilita v = ( AbstractVisibilita ) i . getVisibilita () ; v . limitaRichieste (p) ; ... }

In questo modo il servizio pu ignorare quale sia la classe concreta che implementa la visibilit e limitarsi a chiamare il metodo limitaRichieste() che non far nulla tranne nel caso di un utente esterno.

13.7

Condivisione di scelte

Dove si spiega il meccanismo per condividere le scelte di unutente (tra cui Identit) tra unapplicazione e laltra.

Capitolo

14
Terminologia e convenzioni

Plitvice Workow
14.1

Un workow si compone di una serie di stati collegati luno a laltro tramite passaggi detti transizioni. Il modo pi utile per rappresentare un workow quello di utilizzare un grafo come quello seguente:

Figura 14.1: Graco di un workow Nel usso di esempio sono presenti cinque stati: start, iniziale, istruzione, approvato e riutato. Nella denizione di un nuovo usso conviene rammentarsi di aderire ad alcune convenizioni stabilite da Plitvice kit: ad esempio conviene utilizzare come nomi degli stati a) solo caratteri minuscoli e possibilemente b) preferire gli aggettivi ai sostantivi. Ogni workow deve necessariamente c) iniziare con lo stato start che deve prevedere d) ununica transizione denominata avvia. Tornando allesempio le altre transizioni sono prendi in carico, torna a iniziale, approva e riuta; da notare la convenzione 93

94

CAPITOLO 14. PLITVICE WORKFLOW

di utilizzare e) dei verbi in modo imperativo per denire le transizioni. Inne alcuni stati sono detti terminali perch una volta raggiunti non pi possibile lasciarli (nellesempio approvato e riutato).

14.2

Tabella di marcia

Le applicazioni Regola kit possono essere congurate per la gestione di workow semplicemente aggiungendo una dipendenza al modulo plitviceworkow. Predisporre invece un proprio gestore di ussi richiede diverse operazioni: denire un Workow creare un WorkowRepository denire un Ruolo con i relativi Diritti progettare una classe di Visibilit creare un AuthenticationManager progettare il documento progettare la classe WorkowManager progettate la classe WorkowActions

In eetti sembrano parecchie ma in realt sono piuttosto veloci da approntare perch Plitvice kit fornisce tutte le classi di basi necessarie ad unapplicazione reale: ad esempio sono gi previsti i supporti per i WorkowRepository su database o in memoria tramite mock. Nel corso della presentazione verranno toccati tutti i punti dellelenco e si provveder a realizzare un esempio concreto per la gestione di un Workow denominato accordo in grado di gestire un documento di tipo Accordo.

14.3

Workow

Plitvice kit utilizza JBoos jBPM internamente per la gestione dei Workow. La denizione di un Workow avviene quindi mediante un le XML che raccoglie gli stati e le transizioni. Per chi utilizza Eclipse disponibile un comodo plug in visuale che pu essere di un qualche aiuto nella progettazione del workow. Anch la denizione sia fruibile da Plitvice kit necessario che si attenga alle seguenti convenzioni: il le xml contenente la denizione deve essere salvato nella posizione src/main/resources/workows/nomeusso/processdenition.xml il nodo iniziale di ogni usso deve chiamarsi start

14.4. WORKFLOWREPOSITORY

95

dal nodo iniziale deve uscire solo una transizione denominata avvia ogni transizione che prevede una modica di database deve essere associata ad unazione gestita dalla classe PersistenceAction come nel frammento di denizione seguente:
1 3

<s t a t e name=" i n i z i a l e "> < t r a n s i t i o n t o=" i s t r u z i o n e " name=" p r e n d i i n c a r i c o "> <a c t i o n c l a s s=" i t . k i o n . p l i t v i c e . w o r k f l o w . s e r v i c e . impl . P e r s i s t e n c e A c t i o n "></ a c t i o n> </ t r a n s i t i o n> </ s t a t e>

i nomi degli stati devono contenere solo caratteri minuscoli e possibilmente essere espressi mediante aggettivi (tipo iniziale, approvato, ecc.) i nomi delle transizioni devono contenere solo caratteri minuscoli e possibilmente essere espressi mediante verbi nel modo imperativo (tipo accetta, riuta, ecc.)

14.4

WorkowRepository

Un WorkowRepository unentit di modello che consente di accedere a tutti i Workow disponibili per lapplicazione in modo che i WorkowManager possano, conoscendone solo il nome, accedere a tutte le propriet di un usso, compresa la denizione. Generalmente il repository si concretizza semplicemente in una tabella di database che elenchi i diversi workow e ne raccolga gli attributi. Plitvice kit prevede una classe per gestire questa tabella, WorkowRepositoryHibernate. Alternativamente, spesso impiegati per la fase di test, si pu creare un repository in memoria popolato mediante congurazione di Spring (si veda ad esempio WorkowRepositoryMock).

14.5

Autorizzazioni

Lautorizzazione su un workow consiste nello stabilire se lidentit correntemente assunta dellutente autenticato possa o meno segnalare una certa transizione oppure abbia i permessi per elencare i documenti in un certo stato. Lo schema delle autorizzazioni quello denito nel modulo plitvice security che prevede il concetto di Ruolo a cui fa capo una collezione di diritti (Diritto); questi ultimi possono essere di natura applicativa oppure relativi ai workow. Inne questi ultimi si distinguono per occuparsi degli stati oppure delle transizioni. Gli elementi comuni ad ogni diritto sono un identicativo unico (un intero) ed un Ambito che rappresenta un partizionamento su base applicativa;

96

CAPITOLO 14. PLITVICE WORKFLOW

ad esempio esiste lambito dei tirocini che raccoglie tutti i diritti relativi alla grande area della gestione dei tirocini. Inoltre tutti i diritti fanno riferimento ad unEntit, ovvero un elemento del modello con un ciclo di vita ampio secondo i dettami del Domain Driven Development. Lelenco delle Entit persistito su database e a ciascuna assegnato un identicativo univoco. I diritti relativi a workow contengono invece sempre lindicazione del usso.1 I diritti di workow di tipo transazione prevedono la possibilit di segnalare una specica transazione. Il default, ovvero in caso di assenza di uno specico diritto, la transazione non pu essere segnalata da nessuno. I diritti di workow di tipo stato consentono di elencare tutti i documenti che si trovino in quello stato. In assenza di un particolare diritto chiunque pu richiedere lelenco completo dei documenti per quel certo stato. Comunque anche le identit sprovviste di diritti di elencazione possono riuscire ad ottenere gli elenchi dei documenti utilizzando un meccanismo apposito; si rimanda alla propriet vincoloLettura di AutorizzazioneUtente e linterfaccia Visibilit per dettagli in merito. Le autorizzazioni sono abilitate o disabilitate tramite un aspetto di Spring; per attivarle basta aggiungere le seguenti righe in un le di congurazione di bean:
1 3

< ! Enable @AspectJ s u p p o r t > <a o p : a s p e c t j a u t o p r o x y proxyt a r g e t c l a s s=" f a l s e " /> <bean c l a s s=" i t . k i o n . p l i t v i c e . a u t o r i z z a z i o n i . WorkflowManagerAuthentication " > <p r o p e r t y name=" a u t h e n t i c a t i o n " r e f=" a u t h e n t i c a t i o n M a n a g e r " /> </ bean>

14.6

Il documento

Un workow documentale destinato alla gestione di un documento, ad esempio potrebbe rappresentare i passi necessari e le persone (o gli ufci) coinvolti nel processo uciale di produzione di una pratica. In questo contesto il termine documento si riferisce ad una classe Java, in particolare unentit di modello applicativo per la quale eventualmente stato denito un Model Pattern di Regola kit. Nel corso di questo capitolo, come si detto, presenteremo un esempio concreto il cui documento lentit Accordo:
package i t . k i o n . p l i t v i c e . w o r k f l o w . model ;
2

Attualmente dato un workow discende una ed una sola entit per cui basterebbe lindicazione del usso per risalire inequivocabilmente allentit; comunque al momento in cui questo manuale redatto, sia lid dellentit che il nome del usso devono essere specicate in modo congruente.

14.6. IL DOCUMENTO

97

4 6 8 10 12 14 16 18 20 22 24 26 28

import i t . k i o n . p l i t v i c e . w o r k f l o w . s e r v i c e . impl . AccordoWorkflowActions ; import i t . k i o n . p l i t v i c e . w o r k f l o w . s e r v i c e . impl . AccordoWorkflowActions . S t a t i ; import j a v a . i o . S e r i a l i z a b l e ; public c l a s s Accordo implements S e r i a l i z a b l e { private S t a t i s t a t o = S t a t i . s t a r t ; private Long i d = n u l l ; public void s e t S t a t o ( S t a t i s t a t o ) { this . stato = stato ; } public S t a t i g e t S t a t o ( ) { return s t a t o ; } public void s e t I d ( Long i d ) { this . id = id ; } public Long g e t I d ( ) { return i d ; } }

Durante la fase di progettazione del documento deve essere tenuta in considerazione la relazione forte che lega il documento al workow che lo gestisce; in qualsiasi momento del ciclo di vita del documento deve esistere un modo (un algoritmo) che partendo da unistanza del documento sappia determinare il workow di riferimento unitamente allo stato in cui il workow si trova. In altri termini lo stato del workow deve essere desumibile attraverso il documento stesso, o perch lo contiene direttamente o perch contiene gli elementi per recuperare da un database lo stato del usso. Nel nostro semplice esempio lo stato del usso semplicemente una propriet del documento. Il WorkowManager consentir di eettuare delle selezioni dalla popolazione di tutti i documenti gestiti tramite ussi: sar in particolare possibile ottenere lelenco di tutti i documenti che si trovino in un certo stato oppure gestiti da un certo workow. Per eettuare questo genere dinterrogazioni stato esteso il meccanismo di ModelPattern con due annotazioni, @Stati e @Workow.
1

package i t . k i o n . p l i t v i c e . w o r k f l o w . dao ;
3 5 7 9

import i t . k i o n . p l i t v i c e . w o r k f l o w . model . Workflow ; import i t . k i o n . p l i t v i c e . w o r k f l o w . p a t t e r n . S t a t i ; import o r g . r e g o l a . model . ModelPattern ; public c l a s s A c c o r d o P a t t e r n extends ModelPattern {

98

CAPITOLO 14. PLITVICE WORKFLOW

11 13 15 17 19 21 23 25 27 29 31

S t r i n g [ ] i n S t a t i = new S t r i n g [ ] private Workflow f l u s s o ; @Stati ( ) public S t r i n g [ ] g e t I n S t a t i ( ) { return i n S t a t i ; } public void s e t I n S t a t i ( S t r i n g [ ] this . i n S t a t i = i n S t a t i ; }

{};

inStati ) {

@it . k i o n . p l i t v i c e . w o r k f l o w . p a t t e r n . Workflow public Workflow g e t F l u s s o ( ) { return f l u s s o ; } public void s e t F l u s s o ( Workflow f l u s s o ) { this . f l u s s o = f l u s s o ; } }

Tanto per avere unidea n da subito del funzionamento del ModelPattern nel contesto dei workow pu risultare utile lesempio seguente che richiede al gestore del usso tutti i documenti che si trovino nello stato iniziale mediante una chiamata al metodo elencoProcessiInStati.
2 4 6

A c c o r d o P a t t e r n p a t t e r n = new A c c o r d o P a t t e r n ( ) ; p a t t e r n . s e t I n S t a t i (new S t r i n g [ ] { " i n i z i a l e " } ) ; // r e c u p e r o i l documento g e s t i t o d a l f l u s s o L i s t <Accordo> a c c o r d i = accordoManager . e l e n c o P r o c e s s i I n S t a t i ( p a t t e r n , a u t N i c o l a ) ;

Come si vede prima si imposta AccordoPattern con lo stato dinteresse (iniziale) e poi lo si passa al metodo elencoProcessiInStati

14.7

WorkowManager: funzionamento

Nel livello di servizio, assieme agli altri Business Delegate, i Service Facade ed in generale tutte le classi che consentono di fruire del modello, trovano collocazione i WorkowManager; si tratta di Manager nel senso indicato da Regola kit che orono uninterfaccia comune per la gestione dei ussi di lavoro.
2 4

public i n t e r f a c e WorkflowManager <D extends S e r i a l i z a b l e , ID extends S e r i a l i z a b l e > extends GenericManager<D, ID> { L i s t <D e l e n c o P r o c e s s i I n S t a t i ( ModelPattern p a t t e r n , A u t o r i z z a z i o n i U t e n t e > utente ) ; i n t c o u n t P r o c e s s i I n S t a t i ( ModelPattern p a t t e r n , A u t o r i z z a z i o n i U t e n t e utente ) ;

14.7. WORKFLOWMANAGER: FUNZIONAMENTO

99

S t r i n g s e g n a l a (D p r o c e s s o , S t r i n g t r a n s i z i o n e , A u t o r i z z a z i o n i U t e n t e u t e n t i ) throws P r o c e s s o N o n V a l i d o E x c e p t i o n , T r a n s i z i o n e N o n V a l i d a E x c e p t i o n ; S t r i n g a v v i a F l u s s o ( Workflow f l u s s o , O b j e c t documentoIniziale , AutorizzazioniUtente utenti ) ; S t r i n g avviaFlusso ( Object documentoIniziale , A u t o r i z z a z i o n i U t e n t e u t e n t i ) ; L i s t <S t r i n g > t r a n s i z i o n i D i s p o n i b i l i (D p r o c e s s o , A u t o r i z z a z i o n i U t e n t e utente ) ;

10

12

14

public L i s t <S t r i n g > e l e n c o S t a t i (D p r o c e s s o ) ;


16 18 20

Workflow [ ] }

elencoFlussiGestiti () ;

Ogni WorkowManager si occupa di un solo tipo di documento D (un entit serializzabile e persistibile su database) la cui chiave didenticazione del tipo ID. Ricordo che il tipo D (il documento) pu essere associato ad uno o pi workow tutti gestiti dallo stesso WorkowManager; per sapere quali sono i ussi di lavoro gestiti da un WorkowManager bisogna invocare il metodo elencoFlussiGestiti(). Non bisogna dimenticare che se la classe D del documento pu essere gestita da diversi ussi la singola istanza gestita solo da uno ed un solo usso; ovvero se unistanza inizia il suo percorso allinterno di un workow non pu abbandonarlo pi. Da questo deriva che data istanza di D possibile determinare in modo univoco il usso che la gestisce ed in questo modo utilizzata allinterno degli altri metodi di WorkowManager. Unaltra considerazione generale riguarda il sistema di autorizzazione che verica le credenziali dellutente collegato prima di consentire lelencazione di documenti in un certo stato oppure la segnalazione di una transizione; molti metodi di WorkowManager richiedono il passaggio di un DTO chiamato AutorizzazioniUtente che consente di individuare con esattezza lidentit selezionata dallutente corrente ed applicare i criteri di autorizzazione. Per maggiori dettagli si rimanda al modulo plitvice security. Il primo metodo da invocare per avviare un nuovo servizio avviaFlusso() al quale si pu eventualmente passare un oggetto preliminare che contenga le informazioni necessarie per creare il documento da inserire nel usso. Naturalmente documento e oggetto preliminare possono coincidere se lo si ritiene conveniente. Come si visto data unistanza di documento possibile risalire al usso; nel momento che precede la creazione di un nuovo usso per quellistanza non esiste per cui necessario specicare al metodo avviaFlusso() quale workow utilizzare tra quelli gestiti da uno specico WorkowManager. Se si omette questa indicazione sar utilizzato il primo workow tra quelli gestiti.

100

CAPITOLO 14. PLITVICE WORKFLOW

Una volta avviato un usso possibile elencare tutti i documenti che si trovino in un certo stato tramite il metodo elencoProcessiInStati() passandogli come parametro un ModelPattern come indicato nel paragrafo precedente. Avuto un documento in un certo stato possibile sapere quali siano le transizioni che gli sono consentite dallidentit correntemente assunta tramite il metodo transizioniDisponibili(). Inne per segnalare una transizione (cio cambiare stato) si richiami il metodo segnala().

14.8

WorkowManager: progettazione

La creazione di un servizio di workow si limita alla creazione di uninterfaccia che estenda WorkowManager e nel darne unimplementazione di massima.
2 4 6 8 10 12 14 16 18 20 22 24 26

public i n t e r f a c e AccordoWorkflowManager extends WorkflowManager<Accordo , Long> { } public c l a s s AccordoWorkflowManagerImpl extends WorkflowManagerImpl<Accordo , Long> implements AccordoWorkflowManager { public AccordoWorkflowManagerImpl ( GenericDao<Accordo , Long> dao ) { super ( dao ) ; s e t F l u s s i G e s t i t i (new S t r i n g [ ] { " a c c o r d o " } ) ; } @Override protected void a d d P r o c e s s V a r i a b l e ( P r o c e s s I n s t a n c e i n s t a n c e ) { // TODO Autog e n e r a t e d method s t u b } @Override public Workflow flowForDocument ( Accordo documento ) { return r e p o s i t o r y . findByName ( f l u s s i G e s t i t i [ 0 ] ) ; } }

I metodi di cui occuparsi nellimplementazione sono il costruttore in cui specicare i workow gestiti da questo WorkowManager, nellesempio solo uno di nome accordo che per quando indicato nelle convenzioni relative alle denizioni dei workow deve trovarsi nella posizione src/main/resources/workows/accordo/processdenition.xml. Il metodo owForDocument() consente di individuare a quale usso sia associata listanza del documento; nel nostro esempio ogni istanza gestita da un solo workow. Inne addProcessVariable() consente di inserire delle variabili da utilizzare allinterno delle

14.9. WORKFLOWACTIONS

101

action durante le segnalazioni. Nellesempio non impiegato questo metodo. Il le di denizione di Spring per le classi appena create deve assomigliare al seguente frammento:
1

3 5

<bean i d=" a c c o r d o A c t i o n s " c l a s s=" i t . k i o n . p l i t v i c e . w o r k f l o w . s e r v i c e . impl . AccordoWorkflowActions " > <p r o p e r t y name=" dao " r e f=" accordoDao " /> </ bean> <bean i d=" accordoManager " c l a s s=" i t . k i o n . p l i t v i c e . w o r k f l o w . s e r v i c e . impl . AccordoWorkflowManagerImpl " > <c o n s t r u c t o r a r g> < r e f bean=" accordoDao " /> </ c o n s t r u c t o r a r g> <p r o p e r t y name=" a c t i o n s " r e f=" a c c o r d o A c t i o n s " /> <p r o p e r t y name=" r e p o s i t o r y " r e f=" w or kf low Re po sit or yMo ck " /> <p r o p e r t y name=" v i s i b i l i t a F a c t o r y C h a i n " r e f=" v i s i b i l i t a F a c t o r y C h a i n " /> </ bean>

7 9 11

Come si pu osservare le dipendenze di ogni WorkowManager sono la classe di actions che si occupa come si vedr di denire le logiche di persistenza, un elemento di modello chiamato repository che si occupa di fornire laccesso a tutte le dinizioni dei workow disponibili per lapplicazione ed inne una visibilitaFactoryChain che intimamente legata con i criteri di applicazione delle autorizzazioni per cui si rimanda alla documentazione del modulo plitvice security per i dettagli.

14.9

WorkowActions

La persistenza del workow (e del documento a cui si riferisce) pu essere completamente personalizzata tramite la progettazione di una classe che estenda WorkowActions; i metodi di questa classe saranno richiamati (internamente da WorkowManager ) al momento di attraversare una transizione o quando richiesto un elenco di documenti. Molto probabilmente la vostra classe di action avr un dao di Regola kit tra le dipendenze e lo user nei modi consueti nendo per assomigliare ad una versione complessa di quella presentata qui di seguito:
2 4 6 8 10

public c l a s s AccordoWorkflowActions extends WorkflowActions<Accordo> { public enum S t a t i { s t a r t , i n i z i a l e , i s t r u z i o n e , approvato , }; private AccordoDao dao ; public L i s t <Accordo> e l e n c o P r o c e s s i I n S t a t i ( Workflow f l u s s o , S t r i n g s t a t i , ModelPattern p , A u t o r i z z a z i o n i U t e n t e u t e n t e ) { l o g . i n f o ( " e l e n c o P r o c e s s i I n S t a t i=" ) ; return getDao ( ) . f i n d ( p ) ; []

rifiutato

12

102
14 16

CAPITOLO 14. PLITVICE WORKFLOW

} public i n t c o u n t P r o c e s s i I n S t a t i ( Workflow f l u s s o , S t r i n g ModelPattern p , A u t o r i z z a z i o n i U t e n t e u t e n t e ) { l o g . i n f o ( " c o u n t P r o c e s s i I n S t a t i=" ) ; return getDao ( ) . count ( p ) ; } @Override @StatoCorrente ( ) public S t r i n g g e t S t a t o C o r r e n t e ( Accordo documento ) { return documento . g e t S t a t o ( ) . t o S t r i n g ( ) ; } @Override public S t r i n g a v v i a F l u s s o ( O b j e c t d o c u m e n t o I n i z i a l e , A u t o r i z z a z i o n i U t e n t e utente ) { log . info (" avviaFlusso ") ; Accordo a c c o r d o = new Accordo ( ) ; [] stati ,

18 20 22 24 26 28 30

32 34 36 38 40

accordo . s e t I d (1 l ) ; accordo . setStato ( S t a t i . i n i z i a l e ) ; dao . s a v e ( a c c o r d o ) ; return S t a t i . i n i z i a l e . t o S t r i n g ( ) ; }

42 44

46 48 50

@Transizione ( " prendi in c a r i c o " ) public void s e g n a l a P r e n d i I n C a r i c o ( Accordo documento , S t r i n g t r a n s i z i o n e , AutorizzazioniUtente utente ) { documento . s e t S t a t o ( S t a t i . i s t r u z i o n e ) ; dao . s a v e ( documento ) ; } @Transizione ( " torna a i n i z i a l e " ) public void s e g n a l a T o r n a A I n i z i a l e ( Accordo documento , S t r i n g t r a n s i z i o n e , AutorizzazioniUtente utente ) { documento . s e t S t a t o ( S t a t i . i n i z i a l e ) ; dao . s a v e ( documento ) ; } @ T r a n s i z i o n e ( " approva " ) public void s e g n a l a A p p r o v a ( Accordo documento , S t r i n g t r a n s i z i o n e , AutorizzazioniUtente utente ) { documento . s e t S t a t o ( S t a t i . a p p r o v a t o ) ; dao . s a v e ( documento ) ; } @Transizione ( " r i f i u t a " ) public void s e g n a l a R i f i u t a ( Accordo documento , S t r i n g t r a n s i z i o n e , AutorizzazioniUtente utente ) { documento . s e t S t a t o ( S t a t i . r i f i u t a t o ) ; dao . s a v e ( documento ) ; } public void setDao ( AccordoDao dao ) { t h i s . dao = dao ; }

52 54 56

58 60 62

64 66 68

14.9. WORKFLOWACTIONS
70 72 74

103

public AccordoDao getDao ( ) { return dao ; } }

Nel progettare la classe action bisogna implementare dei metodi la cui rma nota ( ProcessiInStati, countProcessiInStati, getStatoCorrente() e avviaFlusso()) ed aggiungere anche dei metodi (dal nome libero e la rma predeterminata) da associare ad ogni transizione gestita. ElencoProcessiInStati e countProcessiInStati forniscono la base materiale per lestrazione dal database dei documenti nello stato richiesto. Il metodo getStatoCorrente() che consente di determinare, dato un documento, il suo stato attuale. Inne avviaFlusso() provvede a creare un usso nuovo dato un oggetto preliminare. Inoltre devono essere creati tanti metodi quante sono le transizioni che abbisognano di persistenza da marcare con lannotazione @Transizione ed il nome della transazione. Il sistema provveder a chiamare automaticamente questi metodi al momento della segnalazione, subito dopo che lo stato logico del usso stato aggiornato.

104

CAPITOLO 14. PLITVICE WORKFLOW

Bibliograa

[i18] Resource Bundles. http://java.sun.com/developer/ technicalArticles/Intl/ResourceBundles/. [mav] Maven2. http://maven.apache.org/. [spr] Spring Framework. http://www.springframework.com.

105

Indice analitico

applicazione run, 11 componenti expandibleTable, 68 database design-time cong, 14, 39 esempi JBoss, 37 Jetty, 38 run-time cong, 11, 37 transazioni , 39 datasource, vedi database estrazione, vedi model pattern ltri, vedi model pattern generatori master/detail, 16 modello, 14 IDE Eclipse, 17, 32 installazione, 9 model pattern presentazione, 45 modello generazione, 14 progetto 106

creazione, 10 struttura, 12 reverse engineering, 14 selezione, vedi model pattern