Université Claude Bernard Lyon 1-
Master CCI - janvier / février 2006
Projet
XML : conseils
d'implémentation
Généralités
Ce
document propose quelques conseils de programmation à appliquer à
partir de la phase 2 ("raffinements") du projet XML. Bien entendu, il
n'est pas interdit de les lire avant, de façon à ne pas avoir à tout
reconcevoir entre les phases 1 et 2. Pour commencer, voici quelques
conseils généraux :
- Utilisez
les objets à
votre disposition dans les bibliothèques de l'API Java (Vector,
Collection...).
- Découpez
les traitements, et programmez de façon
aussi élémentaire que possible :
- des
classes effectuant le corps des traitements demandés (indexation,
recherche), et acceptant des paramètres aussi spécifiques que possible
(voir plus loin),
- une classe intermédiaire,
destinée à appeler les précédentes en
leur passant les paramètres adéquats pour chaque opération à
réaliser ;
cette classe exposera des méthodes publiques qui se chargent notamment
de toutes les tâches de lecture et d'écriture dans les fichiers et de
parsing XML,
- une
classe de test pour tester votre travail depuis la ligne de commande.
- Créez
un package
Java contenant toutes ces classes.
Classe d'indexation
- le
constructeur de la classe d'indexation prendra en paramètre
un objet
Document
DOM représentant l'index en XML,
- Concernant
l'ajout d'un document dans l'index, l'implémentation dépendra
de l'API que vous avez choisie pour lire le fichier à indexer :
- Si
vous avez choisi le DOM, il faut créer une méthode publique qui prendra
en paramètre un objet Document
DOM et renverra un booléen,
- Si vous avez choisi
SAX, il suffit que votre classe d'indexation implémente l'interface ContentHandler,
et que vous programmiez les méthodes ad-hoc de cette
interface (startElement()...)
afin de réaliser les traitements voulus ; pour lancer l'indexation, il
vous suffira d'associer cette classe aux événements SAX dans la méthode
parse()
de la classe appelante, et ce quel que soit le nombre de documents à
indexer.
- la
méthode de suppression d'un ficher XML dans l'index prendra en
paramètre une String
représentant le nom ou l'URL de ce fichier et reverra soit un booléen,
soit le nombre d'occurrences supprimées,
- il
peut être utile de rajouter une autre méthode pour tester si
un fichier a ou n'a pas déjà été indexé.
Classe
de recherche
- le
prototype du constructeur dépendra de l'API que vous avez choisie pour
la lecture de l'index dans l'implémentation du moteur de recherche :
- Si
vous utilisez le DOM :
- vous pouvez passer
un objet Document
DOM représentant l'index,
- il faudra appeler une
méthode spécifique pour
lancer la recherche dans l'index, qui prendra en paramètre une chaîne
de caractères et renverra un autre objet de type Document DOM,
représentant les résultats de la recherche.
- Si
vous utilisez SAX :
- il faut que cette
classe implémente contentHandler,
et qu'elle soit associée à la méthode parse() dans la classe appelante,
- il
faut également passer au constructeur une String
comportant le mot recherché et une référence sur un
objet Document
DOM qui sera récupéré par la fonction appelante,
- il n'y a pas besoin d'appeler une méthode spécifique
pour lancer la recherche, puisque c'est la création d'une
instance de la classe qui déclenche la recherche.
Remarque (importante) : dans
cette version, vous pouvez laisser la classe de recherche ouvrir et
parser elle-même les fichiers sources pour générer l'arbre de
résultats, mais l'idéal serait qu'elle ne renvoie que le contenu de
l'élément du fichier d'index correspondant aux occurrences du mot
recherché, et que ce soit la classe intermédiaire qui ouvre et qui
parse ces fichiers, et fasse appel à une classe supplémentaire pour
générer l'arbre DOM résultant (avec les mêmes différences que
précédemment, en fonction du fait qu'elle utilise DOM ou SAX).
Classe intermédiaire
Cette classe se chargera :
- d'ouvrir et de parser les fichiers XML source,
- d'instancier et d'appeler les classes applicatives,
- de traiter les objets renvoyés sous forme de Document DOM (index, réponse du moteur de recherche) :
- en les sérialisant, c'est-à-dire en les
transformant en un flux (de type fichier FileOutputStream,
ou flux simple OutpuStream),
en fonction de ce que vous voudrez en faire ; pour cela, utilisez les
informations et le code donnés ici,
- en les transformant à l'aide d'une feuille de style XSLT ; pour cela, utilisez le package javax.xml.transform.
- Pour
l'application Web, vous devrez pouvoir récupérer
directement des fichiers envoyés par un formulaire HTML à
l'aide d'un élément <input type="file"> (sans oublier de spécifier le type d'encodage dans la balise form, avec l'attribut enctype="multipart/form-data"). Pour cela, vous aurez besoin d'utiliser le package org.apache.commons.fileupload,
qui vous permettra de récupérer ces fichiers sous forme
de flux d'entrée. La hompepage du projet se trouve ici, la doc de l'API là et les fichiers source et bytecode (binaires) ici (répertoire local).
Interface
de l'application Web
- Pour les formulaires d'appel des fonctions d'indexation et de recherche, il vaut mieux utiliser des pages XHTML statiques,
- Pour construire la page de réponse à la requête d'indexation, il faut soit des servlets soit des JSP,
- Pour
l'affichage des résultats de la recherche, le plus simple est de
réaliser une feuille de style XSLT et de l'utiliser pour
transformer le document XML résultat enun document XHTML.