Dopo aver creato la struttura del progetto tramite il tool seam-gen, passiamo ad analizzarne le caratteristiche. Il progetto creato infatti è un prodotto completamente funzionale che può già essere trasferito sul server JBoss e provato. Seam-gen non solo ci fornisce una infrastruttura iniziale per la nostra applicazione, ma anche uno strumento per apprendere la logica di JBoss Seam.
Introduzione
Abbiamo visto come sia possibile creare velocemente la struttura di un’applicazione attraverso lo strumento seam-gen. Una delle caratteristiche più utili di questo strumento è il reverse engineering: infatti, inserendo le informazioni relative alla connessione al database, è possibile creare sia le classi degli entity associati alle tabelle, sia le pagine e il codice di gestione per le operazioni di creazione, lettura, scrittura e aggiornamento dei record (CRUD). Tutto questo viene ottenuto attraverso una sessione di domande e risposte necessaria a fornire a seam-gen i dati relativi all’applicazione. Per aggiungere nuove funzionalità alla nostra applicazione diventa ora necessario poter utilizzare un IDE ed in particolare vedremo come importare il progetto in Eclipse. Successivamente analizzeremo l’applicazione interrogandola attraverso il browser e vedremo qualche aspetto interessante adottato da seam-gen.
Inserire il progetto in Eclipse
Il progetto creato da seam-gen è corredato da un build Ant universale che lo rende gestibile da tutti i più famosi IDE senza legarlo in modo particolare a nessuno di essi (come invece avviene utilizzando i plugin specifici per gli ambienti di sviluppo). Per inserire il progetto in eclipse possiamo procedere in due modi diversi.
Importazione del progetto
La prima modalità consiste nell’effettuare l’importazione del progetto che è resa possibile dal fatto che seam-gen genera tutti i file di progetto e di configurazione che Eclipse crea quando si utilizza il wizard New Project. Ad esempio vengono creati i file .project e .classpath che sono i file classici di ogni progetto Eclipse. Viene creato il file explode.launch, che è il file di configurazione dei target Ant nel ciclo di building di Eclipse e che consente di delegare ad Eclipse l’esecuzione del build come parte della sua fase di compilazione. Viene poi creato il file di configurazione debug-jboss-Shop84.launch per agganciare il debugger all’istanza in esecuzione su JBoss AS, ed infine il file shop84.launch per configurare l’uso della console di Hibernate dal plugin di Eclipse JBossTools. Grazie a questi file è molto semplice fare in modo che Eclipse riconosca il progetto come proprio.
Per importare il progetto in Eclipse, è sufficiente scegliere Import dal menu File e seguire il wizard di importazione. Alla fine Eclipse si prenderà carico della gestione del progetto che apparirà nella view Project Navigator.
Questo è tutto! Ora si può passare allo sviluppo dell’applicazione sfruttando i vantaggi che offre Eclipse come ad esempio il legame del codice sorgente di Seam alle librerie del progetto che ci permette di navigare dentro le classi Seam durante il debugging, o la possibilità di richiamare il JavaDoc quando occorre. Inoltre, grazie al file explode.launch, abbiamo l’integrazione del build Ant con il ciclo di compilazione di Eclipse. Per vedere quali target vengono lanciati durante le fasi di compilazione ed eventualmente modificarle, basta andare sulle proprietà del progetto (tasto destro sul progetto) e poi sulla voce Builders.
Figura 1 – Builders del progetto.
Selezionando il builder explode e cliccando su Edit si aprirà una finestra con le associazioni tra target e fase del ciclo di compilazione di Eclipse (scheda Target). Come si può notare nell’immagine seguente (figura 2), quando viene lanciato l’auto-build di Eclipse, vengono eseguite tutte le operazioni previste nei target explode, e buildtest. In questa finestra è anche possibile modificare le operazioni da eseguire durante una particolare fase, semplicemente selezionando i target opportuni.
Figura 2 – Target associati.
Creazione di un nuovo progetto
Nonostante la possibilità di effettuare l’importazione grazie ai file di progetto e configurazione presenti, il build Ant rimane la chiave per la piena portabilità dei progetti nei vari IDE. Per mantenere la portabilità del progetto e nel contempo utilizzare Eclipse è necessario creare un nuovo progetto di tipo General (non un Java Project) e impostare come cartella di lavoro la cartella del progetto creato
Figura 3 – Aggiungere il progetto in Eclipse.
A questo punto possiamo aprire la view Ant, aprire il file build del progetto ed effettuare le varie operazioni lanciando i vari target.
Ispezioniamo l’applicazione
Facciamo adesso partire il server JBoss e raggiungiamo la nostra applicazione digitando nel browser:
http://localhost:8080/shop84
Figura 4 – Home Page.
L’home page non è per ora molto interessante, però si può già vedere che, grazie alle librerie RichFaces, l’applicazione presenta un aspetto “carino”, caratteristica rara per un’applicazione iniziale. Nella parte alta della pagina troviamo un link per esplorare le entities del data model e un altro link per l’autenticazione.
Cliccando su una delle entity viene mostrata la lista di elementi presenti. Questa pagina è suddivisa in due parti. Nella parte bassa troviamo tutti gli elementi presenti nel database e, come si può facilmente vedere, la lista è ordinabile cliccando sulle intestazioni delle colonne. Inoltre ogni elemento ha un link verso la pagina che mostra il dettaglio e un link verso la pagina che ne permette la modifica
Figura 5 – Lista di Entity.
La parte alta della pagina permette invece di fare delle ricerche nella lista utilizzando come chiave di ricerca i campi di tipo stringa.
Oltre a supportare l’ordinamento, la lista di elementi è suddivisa in pagine e in basso si trovano i link per navigare tra le pagine. Altra caratteristica, quando si naviga tra le pagine, l’ordinamento scelto non viene perso e neanche i campi di ricerca vengono resettati. Inoltre ad ogni pagina può essere associato un bookmark.
Figura 6 – Impaginazione.
In fondo troviamo poi un pulsante verso la pagina di inserimento di un nuovo elemento. Come possiamo vedere, nella parte alta di questa pagina possiamo inserire i valori relativi al nostro prodotto, mentre nella parte bassa vediamo la lista degli elementi collegati al prodotto che ovviamente sarà vuota per un nuovo inserimento.
Figura 7 – Nuovo elemento.
Nel caso in cui andiamo ad editare i dati di un prodotto esistente, questa lista sarà piena (in genere) e, se l’elemento è collegato a più entità, troveremo nella parte bassa diverse schede, una per ogni tipologia di entità collegata.
Tutte le operazioni che prevedono la modifica del database richiedono l’autenticazione dell’utente per cui prima di passare alla pagina richiesta viene mostrata la pagina di login
Figura 8 – Login.
E tutto questo… senza aver scritto una riga di codice!
Reverse Engineering
Il comando generate, illustrato nell’articolo precedente, delega molto del suo lavoro allo strumento di Hibernate per il reverse engineering. Le tabelle del database diventano classi entity, e le colonne le proprietà delle corrispondenti classi. Durante la creazione delle pagine CRUD, queste proprietà diventano campi di editing nella pagina di creazione e modifica dell’entity. Durante questi passaggi è seam-gen a determinare il tipo di dati che meglio si adatta alla casella di input analizzando il tipo di dato del campo della tabella. Inoltre la validazione dei dati immessi viene fatta in real time attraverso Ajax.
Le colonne col vincolo Not Null diventano caselle di input obbligatorie e vengono marcate con l’asterisco (*) e ad ogni proprietà dell’entity vengono associati gli opportuni validatori Hibernate al fine di rafforzare i controlli in real time dell’interfaccia.
Dalle foreign key vengono ricavate le relazioni tra le tabelle, e con esse vengono stabilite le relazioni tra i corrispondenti entities e quindi le collezioni che vengono mostrate nella schede in basso viste in precedenza. In ogni riga di tali schede è presente poi un link per modificare le associazioni e scegliere altri entity da collegare.
Questa applicazione di esempio, nata da un database banale creato per scopi didattici, ci fa capire come sia comunque abbastanza semplice, partendo da un database reale, creare un’applicazione completamente funzionale.
Miglioramenti possibili
Rimane sicuramente del lavoro sia per migliorare la funzionalità e sia perchè il reverse engineering, sebbene sia in grado di interpretare benissimo lo schema del database, ancora non riesce a interpretare il nostro pensiero (probabilmente perchè non presente nel DB…). Per ovviare a ciò, è possibile effettuare una configurazione del reverse engineering [3] e apportare le seguenti modifiche:
- personalizzare i nomi delle property e degli entity;
- personalizzare i tipi di dati delle property;
- cambiare globalmente il mapping tra tipo di colonna SQL e tipo Java;
- escludere alcune tabelle;
- creare delle relazioni fra entity non rappresentate da foreign key;
- … e altro ancora
Il file di configurazione che seam-gen usa per il reverse engineering è resources/seam-gen.reveng.xml. Il listato seguente mostra il contenuto di questo file con qualche semplice modifica
“http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd” >
Dopo aver fatto le modifiche al file seam-gen.reveng.xml basta lanciare il comando
seam generate restart
per applicare i cambiamenti e ricreare le classi e i file dell’interfaccia. Bisogna quindi fare attenzione prima di lanciare questo comando per non perdere le modifiche già apportate. Consideriamo pure che il comando generate è una combinazione dei comandi generate-model e generate-ui. Il primo genera le classi degli entities dallo schema del database, mentre il secondo genera le pagine e i controller CRUD partendo dalle preesistenti classi degli entity. Quindi, in base alle nostre esigenze, possiamo lanciare solamente uno dei due comandi e mantenere intatti alcuni dei file già presenti.
Conclusioni
In questo articolo abbiamo visto come importare in Eclipse un progetto creato con seam-gen e abbiamo analizzato i risultati ottenuti dall’uso di questo strumento. Una delle funzionalità maggiormente apprezzate dal sottoscritto è il reverse engineering che si occupa di compiti tediosi lasciando a noi il compito di occuparci di aspetti progettuali più importanti (e sicuramente più interessanti). Questa funzionalità, poi, può essere anche personalizzata agendo opportunamente sul file di configurazione. L’applicazione ottenuta e visionata in questo articolo, oltre ad essere già funzionale, ci permette di scoprire gli aspetti principali di Seam e come i progettisti del framework sono soliti impostare un’applicazione. Credo che lo studio di questa semplice applicazione possa rappresentare un valido metodo per apprendere le caratteristiche di Seam e per questo continueremo ad approfondirla nei prossimi articoli.
Riferimenti
[1] Sito di riferimento per il Framework Seam
[2] Dan Allen, “Seam in Action”, Manning Publications, 2009
[3] Sito di riferimento per Hibernate Tools
http://docs.jboss.org/tools/3.3.0.Final/en/hibernatetools/html/index.html
Nato a Vittoria (RG) ha conseguito la laurea in Ingegneria Informatica all’Università di Catania nel luglio del 2003. Si interessa del mondo Java da più di 10 anni e dopo aver lavorato per 3 anni come sviluppatore software su piattaforma J2EE, oggi svolge attività di consulenza e formazione in provincia di Treviso e cura il sito www.tradingonline-news.com