Why make donate

UI

author : Nolwenn Rannou <rannou@codelutin.com>
revision : 2613
date : 2009-06-30 15:32:57 +0200 (mar 30 jun 2009)

L'interface web de l'application a été créée grâce au framework Tapestry de la fondation Apache. Tapestry est un framework de développement pour applications Web J2EE dont l'architecture est à base de composants.

Il présente de nombreux avantages :

  • peu de configuration grâce aux annotations
  • fortement orienté objet : abstraction des notions de sessions, requêtes, cookies...
  • séparation complète du code métier Java et de la présentation en XHTML
  • feedback avancé : messages d'erreurs pertinents et complets
  • rechargement à chaud : pas besoin de recompiler le code
  • développement de composants facilité

Data

Le package data contient les éléments du modèle de l'architecture de l'UI.

UIO

Les UIO (User Interface Objects) sont l'équivalent des DTO du business côté UI. Les attributs des UIO sont privés et possèdent des accesseurs et des modifieurs, car le framework Tapestry manipule les objets via ces derniers. L'interface graphique manipule directement les DTO mais il y a deux UIO qui héritent du DTO ChoiceDTO : DateChoiceUIO et ImageChoiceUIO. Ils sont utiles lors de la création des choix des sondages de type date ou image.

Diagramme de classe des UIOs

Lien

La classe Lien représente un lien hypertext : elle possède un attribut name, qui est la chaîne de caractère sous laquelle sera affiché le lien, et un attribut address, qui est l'adresse sur laquelle pointe le lien.

EvenOdd

La classe EvenOdd permet d'attribuer une classe aux lignes d'un tableau ou aux éléments d'une liste, pour les afficher en changeant les couleurs une ligne sur deux.

PollStep

L'énumération PollStep représente les étapes du formulaire de création/modification de sondage.

Composants

Border

Le composant Border est un composant présent sur toutes les pages de l'application : il s'agit du menu, de la barre d'adresse et du pied de page. Il prend en paramètres un Array de Liens, qui servira à créer la barre d'adresse, et un type de page (Creation, Index, Vote ou VoteCounting) qui détermine le logo et les couleurs de la page.

Border IndexBorder CréationBorder VoteCountingBorder Vote

LoginComponent

Ce composant est un formulaire de connexion qui est affiché quand l'utilisateur essaye d'accéder à une page pour laquelle il doit être identifié.

DateTimeField

Ce composant est un type de champ de formulaire permettant de sélectionner une date et une heure.

Composant DateTimeField

FeedBack

Le composant FeedBack gère l'affichage des messages à destination de l'utilisateur. Ces messages ont une apparence différente selon leur signification. Par exemple un message d'erreur ressortira plus qu'un message d'information. Le composant permet donc d'afficher ces types de messages lors du rendu de la page. Il est possible d'afficher plusieurs messages de types différents en même temps. Ceux-ci ne seront affichés qu'une seule fois et aussitôt supprimés. Ce composant se comporte un peu comme le composant Tapestry Error qui affiche les erreurs de validation des formulaires.

Composant FeedBack

Pour personnaliser l'apparence des messages, il faut définir les classes fb-error et fb-info dans le CSS. Dans le template il suffit de placer la balise du composant :

<t:feedback t:id="feedback"/>

Dans la classe, après avoir déclaré le composant, il est possible d'ajouter des messages :

@Component(id = "feedback") private FeedBack feedback;

feedback.addInfo("message d'info");
feedback.addError("message d'erreur");

Image

Le composant Image sert à afficher une image dynamique, telle qu'une image téléchargée sur le serveur grâce à un formulaire. À priori, on ne connaît pas le nom du fichier correspondant à l'image, on ne peut donc pas utiliser d'asset pour l'afficher de la manière suivante :

<img src="${asset:context:img}/image.png" />

Le composant crée une élément HTML de type image en l'associant à un flux de type ImageStreamResponse :

<t:image src="/img/image.png" />

Chart

Le composant Chart affiche un diagramme de type camembert (PieChart). Pour cela il utilise la librairie JFreeChart et convertit le résultat en une image facilement intégrable dans une page Web :

<t:chart width="210" height="190" values="choice" title="title" type="1"/>

Le paramètre values correspond à une liste de chaînes représentant les labels et leur valeurs respectives (exemple : {"val1", "20", "val2", "10"}). Le paramètre type est le type de représentation du diagramme (1:PIE, 2:PIE3D, 3:RING).

Composant Chart

Pages

Les pages sont à la fois la vue et le contrôleur de l'architecture. Cependant chaque page est représentée par trois fichiers :

  • un template .tml (la vue) qui contient le code HTML et les composants Tapestry
  • une classe Java (le contrôleur) qui initialise les composants et les données traîtées, qui définit les actions associées aux composants et qui utilise la classe BusinessServices du package services pour appeler les services du business.
  • un fichier .properties (ou plusieurs pour l'internationalisation) qui contient les messages affichés sur la page.

Création d'un sondage

La page de création de sondage permet de créer un sondage en renseignant :

  • le titre du sondage (obligatoire)
  • la description du sondage
  • une date de début et une date de fin
  • le nom du créateur (obligatoire)
  • l'anonymat du sondage
  • la possibilité pour les utilisateurs d'ajouter des choix
  • l'envoi d'email au créateur en cas de vote ou de commentaires
  • le type de choix (texte, image ou date)
  • les différents choix et leur description

L'application ne gère pas encore la date de début et la date de fin, ni l'envoi d'email, ni la possibilité d'ajouter des choix. Lorsque les choix sont des images, les fichiers sont envoyés sur le serveur. En revanche, l'endroit où elles sont enregistrées reste à configurer. Si la création du sondage réussit en base, alors une page de confirmation est affichée et fournit à l'utilisateur deux liens : un pour voter, qu'il pourra envoyer aux personnes qu'il souhaite voir voter, et l'autre pour modifier ou clore le sondage.

Modification d'un sondage

Les champs pouvant être modifiés sont les suivants :

  • le titre
  • la description du sondage
  • le nom du créateur
  • les dates (même si à terme, il faudra déterminer des conditions)
  • l'envoi d'email
  • l'ajout de choix
  • la description des choix

Cette page prend en argument l'identifiant Topia haché en MD5 du sondage concaténé à l'identifiant Topia haché du créateur. C'est également sur cette page qu'il pourra clore le sondage pour pouvoir le dépouiller.

Vote

Cette page permet à un utilisateur de voter à un sondage. Il doit renseigner son nom et cocher ou non une pou plusieurs cases. Cette page permet aussi d'ajouter des commentaires au sondage. Cette page prend en argument l'identifiant Topia haché en MD5 du sondage.

Les votes portant sur des images nécessitent de pouvoir télécharger ces images sur le serveur. Le composant Tapestry Upload permet de faire ceci simplement en le plaçant dans un formulaire et en enregistrant le fichier ainsi soumis (UploadedFile) dans un répertoire du serveur. De plus il est possible de limiter la taille des fichiers dans la classe AppModule (méthode contributeApplicationDefaults()) :

configuration.add(UploadSymbols.FILESIZE_MAX, "500000");
configuration.add(UploadSymbols.REQUESTSIZE_MAX, "5000000");

La miniature correspondant à l'image est créée une fois pour toutes lors de sa soumission afin de ne pas surcharger le serveur en redimensionnant les images à chaque fois qu'un client les consulte. Par contre il n'est pas aussi aisé d'afficher ces images par la suite à cause du fonctionnement de Tapestry. Un composant Image à donc été créé pour remplir cette fonction.

Résultats

La page de résultats utilise le composant Chart pour afficher les résultats d'un sondage. Ces derniers sont récupérés grâce au service ServiceResults.

Sondages d'un utilisateur

Si l'utilisateur qui crée un sondage est enregistré et connecté à son compte, le sondage est relié à son compte dans la base de données. Il pourra alors ultérieurement consulter la liste des sondages qu'il a créé. Ceci lui permet de pouvoir récupérer les URL des pages de vote ou de modification s'il les a perdues.

Listes de votants

Les listes de votants peuvent être créées à la main en renseignant les informations de chaque votant mais il est aussi possible d'importer une liste de votants à partir d'un fichier CSV. La lecture d'un fichier CSV est réalisée grâce à la librairie Java OpenCSV qui permet de définir une stratégie de mapping pour convertir directement les champs en objets.

L'utilisateur identifié peut gérer des listes de votants. Lorsqu'il créera un sondage restreint, il pourra utiliser ses listes de votants prédéfinies plutôt que de saisir manuellement la liste de votants pour le sondage.

Services

Tapestry est livré avec de nombreux services qui font partie intégrante du framework, mais il est aussi possible de définir ses propres services. Dans la classe AppModule, qui contient le peu de configuration nécessaire au fonctionnement de Tapestry, on peut lier ses services en complétant la méthode bind(ServiceBinder binder) :

binder.bind(ServicePoll.class, ServicePollImpl.class);

Une fois que Tapestry connaît l'interface et l'implémentation du service, on peut l'injecter dans les pages de l'application et l'utiliser normalement :

@Inject
private ServicePoll servicePoll;

Configuration

En plus des services métiers définis dans le module pollen-business, un service propre à Pollen-UI permet d'accéder à la configuration de l'application (serveur de mails, répertoire des images...). Ce service lit la configuration dans un fichier properties lors de son instanciation.

BackgroundWorker

Un autre service, BackgroundWorker, permet d'effectuer des tâches en arrière-plan. Ce service est utile pour envoyer des emails à intervalle de temps régulier.