Sep 12, 2007

Έλεγχοι (validations) κατά την εκτέλεση ενός wizard στο JHeadstart

Μια από τις πιο ισχυρές ευκολίες που παρέχει το JHeadstart για την ανάπτυξη εφαρμογών ADF, είναι η εύκολη δημιουργία σελίδων για την ολοκλήρωση μιας σύνθετης συναλλαγής που αποτελείται από διάφορα βήματα, που διαμοιράζονται σε πολλαπλές σελίδες. Ο χρήστης ειδοποιείται στο πάνω μέρος της σελίδας για το στάδιο στο οποίο βρίσκεται σχετικά με την περάτωση της συνολικής διαδικασίας. Το ADF Faces component που χρησιμοποιείται ονομάζεται processTrain.

Ένα από τα ιδιαίτερα χαρακτηριστικά του wizard που δημιουργείται είναι πως οι validations κανόνες που έχουν οριστεί σε επίπεδο Entities, δεν ενεργοποιούνται παρά μόνο στο τελευταίο βήμα της όλης διαδικασίας. Παρόλα αυτά, είναι συχνά επιθυμητό, να πραγματοποιούνται οι έλεγχοι κατά την μετάβαση από το ένα βήμα στο επόμενο του wizard, να παρουσιάζονται εκείνη τη στιγμή τα μηνύματα λάθους και να παραμένει ο χρήστης στην ίδια οθόνη για να διορθώσει τις παρατηρήσεις.

Για να επιτευχθεί αυτό, είναι απαραίτητη η επέμβαση στον τρόπο που διαχειρίζεται το JHeadstart το wizard. Αρχικά, ανατρέχουμε στο faces-config αρχείο που κρατά τις ρυθμίσεις των beans για το wizard μας. Από αυτό το αρχείο δανειζόμαστε την κλάση του JHeadstart που διαχειρίζεται τα βήματα του wizard.

Έπειτα, δημιουργούμε μια νέα, δικιά μας κλάση, που κληρονομεί από αυτή του wizard του JHeadstart που βρήκαμε μόλις παραπάνω. Η μοναδική μέθοδος που χρειάζεται να κάνουμε override είναι η getNextAction() που μπορεί να έχει την ακόλουθη δομή:

public String getNextAction() {
// Check of an attribute, of those an end-user has to submit in the first
// page of the wizard.
String value =
(String)JsfUtils.getExpressionValue("#{bindings.MasterDetailWizardGroupOrderId.inputValue}");
// If the user has submitted value.
if (value != null && value.equals("111")) {
// Validate the user input, by invoking the appropriate method
// probably of the Application Module.

// In case of error, stay in the current page.
JsfUtils.getInstance().addError("Value 111 is not allowed !");
return null;
}
checkFocusRowIndex();
return super.getNextAction();
}


Όπως διαφαίνεται, αρκεί να επιλέξουμε ένα attribute το οποίο ξέρουμε πως θα έχει τιμή (π.χ. ύστερα από την αναγκαστική συμπλήρωση του στο κάποιο βήμα του wizard) και με βάση αυτό να εκτελέσουμε το validation κώδικα μας (π.χ. καλώντας μια μέθοδο στο Application Module) Εάν το αποτέλεσμα δεν είναι θετικό, παραμένουμε στην ίδια σελίδα (return null) διαφορετικά καλούμε τη συμπεριφορά που θα έπρεπε να έχει το framework (checkFocusRowIndex(); return super.getNextAction();)

Το τελευταίο κομμάτι που μας απομένει, είναι να ξαναγυρίσουμε στο faces-config των beans μας και να ορίσουμε σαν κλάση του wizard, τη δικιά μας.

Χωρίς καμία άλλη αλλαγή, και χωρίς JHeadstart generation μπορούμε να ελέγξουμε τη συμπεριφορά του συστήματος. Για παράδειγμα έχω ορίσει σαν validation κανόνα πως όταν η συμπλήρωση σε ένα πεδίο είναι η τιμή "111" να εμφανίζεται μήνυμα λάθους, διαφορετικά συνεχίζουμε στο επόμενο βήμα.

Για να οριστικοποιήσουμε τις αλλαγές μας, θα πρέπει να τροποποιήσουμε το κατάλληλο vm αρχείο του Group μας για να περίεχει από εδώ και στο εξής της δηλώσεις στο faces-config bean αρχείο μας.

No comments: