[Parancoe] Validazione tramite DWR

[Parancoe] Validazione tramite DWR

Posted by gtrev on Lun, 02/04/2007 - 22:52 in


Continuo la serie dei post che riguardano i miei cotributi allo sviluppo di Parancoe.

Come ho già ricordato, Parancoe è una libreria pensata per lo sviluppo di applicazioni web che permetta allo sviluppatore di concentrarsi sul codice e lasciar stare la configurazione.

Se volete partecipare, andate a visitare il sito.

Quello di cui mi sto occupando in questo periodo è l'integrazione nel meccanismo DWR (Direct web remoting) nel processo di validazione dei dati.

DWR è un framework che rende semplice l'integrazione della tecnologia AJAX all'interno di applicazioni Java. In particolare propone un'ottima integrazione con Spring, sul quale Parancoe si basa.

L'idea che è venuta al team di Parancoe è di usare DWR per richiamare la validazione via javascript.

Supponiamo di avere una form di inserimento dati. Attualmente la validazione di questa form avviene solo lato server.

Utilizzando DWR si potrebbe validare il campo appena questo è stato editato, risparmiando all'utente l'invio di una form sintatticamente non corretta.

Le operazioni da fare per l'integrazione di DWR con la libreria di validazione di Parancoe sono:

  1. Definire un entry point unico richiamabile via Ajax
  2. Integrare la configurazione di DWR all'interno di Parancoe in modo che lo sviluppatore trovi DWR già attivo di default
  3. Definire un custom tag da usare all'interno della JSP che integri la chiamata a DWR senza che lo sviluppatore debba scrivere codice javascript

In questo post mi concentrerò sul primo punto.

DWRValidator

Il meccanismo di validazione di Parancoe si basa sulla libreria springmodules-validator. Per chi fosse interessato ad una descrizione di tale libreria, rimando al post Validazione in Parancoe.

La classe che compie la validazione è la classe BeanValidator. Tale classe eredita da Validator che mette a disposizione un metodo di validazione la cui firma è:

/**
* Applies all validation rules as defined in the
* {@link org.springmodules.validation.bean.conf.
* BeanValidationConfiguration}
* retrieved for the given bean from the configured
* {@link org.springmodules.validation.bean.conf.loader.
* BeanValidationConfigurationLoader}.
*
* @see Validator#validate(Object, org.springframework.validation.Errors)
*/
public void validate(Object obj, Errors errors) { ... }

Questo metodo si aspetta un'istanza dell'oggetto da validare (obj), istanza creata da Spring a partire dai dati inseriti nella form. La firma di questo metodo non lo rende facilmente integrabile con DWR.

Per poter integrare DWR è necessario creare una classe che esponga un metodo la cui firma preveda come attributi degli oggetti di tipo stringa. Una sorta di:

public String validateDWR(String beanId,
String propertyName,
String propertyValue)

L'idea è quindi quella di ricondursi alla validazione di springmodules passando per il metodo validateDWR. A questo scopo, un metodo interessante di BeanValidator è il seguente:

/**
* Applying the given validation rules on the given property of
* the given object.
* The validation stops as soon as one of the validation rules
* produces validation errors.
* This errors are then registered with the given {@link Errors)
* instance.
*/
protected void validateAndShortCircuitRules(ValidationRule[] rules,
String propertyName, Object obj, Errors errors)

Questo metodo si aspetta sempre un'istanza dell'oggetto in esame, ma si limita a validarne una singola property. Si potrebbe quindi creare un'istanza dell'oggetto in esame e settarne la singola property (propertyName) con il valore passato in ingresso (propertyValue).

Il problema adesso si sposta nella inizializzazione dell'oggetto sotto esame. L'obbiettivo è di non dover creare un metodo per ogni oggetto che dovrà essere validato. A questo scopo ci viene in aiuto il terzo parametro del metodo prototipato inizialmente, ovvero beanId.

Il valore che assume beanId, come ci si può aspettare è il nome dell'oggetto come viene definito nel file di configurazione di Parancoe. Tutti i bean registrati in quel file sono consultabili andando ad interrogare l'application context di Spring.

La classe che esporrà il metodo validateDWR dunque estenderà da BeanValidator per avere il metodo validateAndShortCircuitRules e implementerà l'interfaccia ApplicationContextAware che le permette di avere il contesto di Spring da analizzare.

I passi per una possibile implementazione della classe di validazione con dwr saranno dunque:

Recupero del tipo del bean dal contesto di Spring

// recupero la classe del bean da validare
Class clazz = applicationContext.getBean(beanId).getClass();

// carico le regole di validazione per la classe in esame
BeanValidationConfiguration configuration =
configurationLoader.loadConfiguration(clazz);

// recupero le regole di validazione per la property in input
ValidationRule[] rules = configuration.getPropertyRules(propertyName);

Asseganzione del valore in input alla property

// mi creo un'instanza dell'oggetto in esame a cui assegno
// propertyValue
Object obj = clazz.newInstance();
BeanWrapper wrapper = new BeanWrapperImpl(obj);
PropertyValue val = new PropertyValue(propertyName, propertyValue);
wrapper.setPropertyValue(val);

//Mi creo un oggetto dove mettere gli eventuali errori
Errors errors = new BeanPropertyBindingResult(obj, beanId);

Validazione

//compio la validazione
validateAndShortCircuitRules(rules, propertyName, obj, errors);

return getValidationMessage(errors, propertyName);

La classe va un po' sgrezzata, però è già funzionante (almeno per i tipi String, per altri tipi di oggetti, come le date non è ancora pronta).

Allegato al post trovate uno zip contenente un progetto maven con il sorgente della classe e un piccolo testcase.

AllegatoDimensione
dwrvalidator-src.zip6.82 KB
mi viEne da dire:MA DDE CHE

mi viEne da dire:

MA DDE CHE AO ?!?

Posted by gUIDO on Mer, 04/04/2007 - 12:18
Scusami gUIDO. Prometto un

Scusami gUIDO.

Prometto un post sull'mbuto al più presto.

Posted by gtrev on Mer, 04/04/2007 - 16:27
BRAVO!Ehm....Cos'è l'mbuu?

BRAVO!

Ehm....

Cos'è l'mbuu?

Undecided

Posted by era77 on Mer, 04/04/2007 - 16:57
Qualcuno mi dice cos'è stò

Qualcuno mi dice cos'è stò 'mbutu?

Pèffavore...

Posted by era77 on Mer, 11/04/2007 - 06:33
Guarda qua, quarta
Guarda qua, quarta citazione. La mittttica vulvia!!!!
Posted by gtrev on Mer, 11/04/2007 - 07:57
Credo di aver capito...
Credo di aver capito... Altrimenti vedrò Rieducational Channellllllll
Posted by era77 on Mer, 11/04/2007 - 11:02
Non ci capisco nulla... Sono
Non ci capisco nulla... Sono un povero programmatore C++ io....
Posted by era77 on Mar, 03/04/2007 - 14:09
Eh ciò, devi scrivere
Eh ciò, devi scrivere qualche articolo sul c++ allora...Wink
Posted by gtrev on Mar, 03/04/2007 - 15:39
Ma non annoierebbe parlare

Ma non annoierebbe parlare di classi template, puntatori vari, multi thread, real time e affini ????

Penso proprio che le "bueae" siano meglio accette...

 

Posted by era77 on Mer, 04/04/2007 - 06:39
...dimenticavo...per
...dimenticavo...per era77...anche a me non dispiacerebbe un post su C++...ogni tanto, a piccole dosi Wink ...giusto per rispolverare il mio vecchio Stroustrup (...fermi lì, non è una parolaccia, nè ci sono doppi sensi... Tongue out)
Posted by Lucio Benfante on Mer, 04/04/2007 - 13:00
Se non sbaglio il sig.

Se non sbaglio il sig. Stourstrup è uno dei padri della filosofia del C++ ed autore della guida del C++ più famosa, mi pare si chiami il linguaggio C++ o programmare in C++... Insomma un nome originale....

Allora farò un piccolo post prossimamente... Gestione thread mediante stati e non via semafori vi piace ? Bah.. Oppure righe di assembler in codice c++ pevelocizzare alcune routine tipo... Bah..

Posted by era77 on Mer, 04/04/2007 - 16:56
ehm..."se non
ehm..."se non sbaglio"?!?!?!...un programmatore C++ che può sbagliarsi sul creatore del suo linguaggio? Wink ...con i soldi che avanzeranno dalla colletta per comprare Kitt, chiedi a gtrev di regalarti una copia di "The C++ Programming Language"...è un po' come se a un prete mancasse il Vangelo...Smile
Posted by Lucio Benfante on Mer, 04/04/2007 - 22:41
Il fatto è che il C++ è

Il fatto è che il C++ è figlio stretto del C che è stato creato da Ritchie alla mitica AT&T nel 1970. Il C++ è senza dubbio stato pensato e inizialmente sviluppato da Stoustrup che se non sbaglio l'aveva chiamato "C ad oggetti"... Insomma, secondo voi è il papà o il tutore ? Mah... Il C++ se non sbaglio è dei primi anni 80...Quindi era un C giovincello... O per le ere informatiche un C maturo !

Ecco....

Posted by era77 on Ven, 06/04/2007 - 07:21
...pochi dubbi su

...pochi dubbi su questo...ne è decisamente il (principale) papà...

Stroustrup (nel senso del libro) alla mano:

"I invented C++, wrote its early definitions, and produced its first implementation. I chose and formulated the design criteria for C++, designed all its major facilities, and was responsible for the processing of extension proposals in the C++ standars committee. Clearly, C++ owes much to C..."

...sulla prima copertina del libro c'è scritto "Bjarne Stroustrup - The Creator of C++"

Posted by Lucio Benfante on Ven, 06/04/2007 - 08:40
Io il libro non ce l'ho!Non

Io il libro non ce l'ho!

Non è che puoi spedirmelo ?

Wink

Posted by era77 on Ven, 06/04/2007 - 12:39
...spedirtelo no...però se

...spedirtelo no...però se te ne basta la foto...Smile

 

Libri di base

Posted by Lucio Benfante on Mar, 10/04/2007 - 14:56
Cavoli quanti libri

Cavoli quanti libri interessanti! Non è proprio che puoi farne un pacco e mandarmeli tutti assieme ???

Laughing

Posted by era77 on Mer, 11/04/2007 - 06:32
Che bello! Anche io voglio i
Che bello! Anche io voglio i libri di Knuth!!!
Posted by gtrev on Mar, 10/04/2007 - 17:22
...e hai notato che lì in

...e hai notato che lì in mezzo c'è pure un libro di Eckel (in italiano)?

...tornando a Knuth...avrete sicuramente notato che mi mancano gli aggiornamenti...se non sapete cosa regalarmi a Natale...Cool

Posted by Lucio Benfante on Mar, 10/04/2007 - 18:15
No, dai, un post ogni tanto

No, dai, un post ogni tanto si può anche fare Laughing

Posted by gtrev on Mer, 04/04/2007 - 07:47
Ottimo post, come sempre.
Ottimo post, come sempre. Sul punto 2 (Integrare la configurazione di DWR all'interno di Parancoe in modo che lo sviluppatore trovi DWR già attivo di default) sto già lavorandoci io...spero di riuscire a committare qualcosa entro la fine della settimana
Posted by Lucio Benfante on Mer, 04/04/2007 - 11:18
...aggiornamento...l'integraz

...aggiornamento...l'integrazione è pronta e già nel CVS. Se volete guardate l'applicazione d'esempio, o rigeneratela usando l'archetype...e poi guardate nella pagina della lista delle persone. Notate che praticamente non si deve scrivere codice JavaScript, ma solo codice Java (e non in pagina).

L'applicazione d'esempio e la demo vengono generate con DWR in modalità debug, quindi potete vedere i bean esportati digitando l'indirizzo:

http://localhost:8080/<il vosto context>/dwr/index.html

Così già mi piace molto, anche se rimane da scrivere un po' di xml nella configurazione in parancoe-servlet.xml...ma è quasi il posto giusto...prossimamente vedrò se riesco a eliminare anche quella, trasferendola in annotations nelle classi(con rilevamento automatico delle classi da parte di DWR).

Posted by Lucio Benfante on Ven, 06/04/2007 - 08:24
Grazie Lucio, troppo buono

Grazie Lucio, troppo buono Laughing

Sul punto 3 (custom tag) non si era discusso, ma mi pare possa essere una comodità in più per lo sviluppatore, cosa ne pensi?

Posted by gtrev on Mer, 04/04/2007 - 16:25
Sicuramente. Dei custom tag
Sicuramente. Dei custom tag ad un certo punto dovranno esserci, per velocizzare il lavoro di scrittura delle pagine...sempre nella filosofia di sviluppo di Parancoe...
Posted by Lucio Benfante on Mer, 04/04/2007 - 16:46
Invia nuovo commento
  • Linee e paragrafi vanno a capo automaticamente.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.

Maggiori informazioni sulle opzioni di formattazione.