|
Projet RMI/Web
Maitrise Informatique de Nice 2002/2003
Téléchargez l'Archive : Twiking.tgz
Plan :
0. Contenue de l'archive et installation
Contenue de l'archive :
- ./deploiment.sh
- ./serveur/
- ./serveur/jsp/
- ./serveur/jsp/TwikinG (le site a mettre dans tomcat avec jar rmi client)
- ./serveur/mysql
- ./serveur/mysql/twiking.sql (la base de donnée a mettre dans mysql 4.0.2 minimum
- ./serveur/rmi
- ./serveur/rmi/twikingServer (le serveur rmi )
- ./serveur/rmi/twikingSrc/ (les sources du client et serveur rmi)
- ./serveur/deClass (un serveur de class)
Installation :
prérequis :
- Vous devez disposer de machines (minimum 1) faisant tourner tomcat pour héberger le site
- Vous devez disposer de 1 machine qui fait tourner un serveur mysql 4.0.2 minimum
- Vous devez disposer de machines (minimum 1) disposant d'un class loader
- Vous devez disposer de machines (minimum 1) pour faire tourner le serveur rmi
- et pour finir des clients qui se connecteront aux serveurs web.
installation de l'architecture :
- Installation de la base de données dans le serveur sql :
taper dans le répertoire du script : ./deploiement.sh mysql (en root si seul le root a les droits)
- Installation des class Loader
Faire ./deploiement classLoader <numDePort>
exemple : ./deploiement classLoader 3000
- Installation des Serveurs RMI :
éditer le fichier serveur/rmi/twikingServer/connection.properties pour spécifier l'IP du server sql
éditer le fichier serveur/rmi/twikingServer/server.properties pour spécifier la liste des serveurs
Faire ./deploiement serveurRMI <classloader:numDePort>
exemple : ./deploiement serveurRMI localhost:3000
- Installation du système sur les machines tomcat :
taper dans le répertoire du script : ./deploiement.sh twiking <repertoireDeTomcat>
exemple : ./deploiement.sh twiking /tmp/toto/jakarta-tomcat-4.1.24-LE-jdk14
Pour configurer les clients rmi éditer jakarta-tomcat-4.1.24-LE-jdk14/bin/client.properties
Lancement Tomcat faire dans le répertoire bin de tomcat ./lancementTwiking.sh ou ./catalina.sh start -security
Lancement du système :
- Lancer le serveur sql
- Lancer le(s) class loader
- Vérifier le contenu des serveur.properties de(s) serveur(s) rmi
- Lancer le(s) serveur(s) RMI
- Verifier le contenu des client.properties de(s) client rmi dans les répertoires bin des serveurs tomcat
- Lancer les(s) serveur(s) TomCat
- bonne navigation
Fonctionnalités de notre Wiki :
- Gestion des utilisateurs et des sessions
- Edition des pages
- Création et supression des rubriques et sous rubriques (dynamiquement)
- Creation et suppression des pages
- Recherche sur le Wiki
- Gestion des groupes
Impératif demandé : liaison entre l'application web et la base de données avec Java RMI
Gestion des utilisateurs et des sessions :
Les utilisateurs ont la possibilité de s'inscrire sur notre wiki de
la même facon que sur un wiki standard. La page d'inscription demande à l'utilisateur de
rentrer un login et un mot de passe. Une fois inscrit, l'utilisateur est automatiquement
connecté. S'inscrire sur le wiki permet d'avoir accès à la page de gestion des rubriques, de gestion des groupes. De plus ,cela permet de pouvoir éditer et/ou supprimer des pages du wiki.
Edition des pages :
Chaque page de notre Wiki est éditable, hormis la page d'acceuil de notre wiki et les pages
d'acceuil des rubriques (les pages d'acceuil des rubriques sont crées dynamiquement et sont en fait une liste de liens vers leurs sous rubriques.)
lorsqu'un utilisateur est connecté (il s'est inscrit et s'est loggé), il lui suffit de cliquer sur le lien "editer cette page" pour passer en mode édition. Ce mode est assez similaire à celui d'un vrai wiki et propose à l'utilisateur de retoucher le code de la page via une textarea. Le langage utilisé pour l'édition est proche de celui du wiki (balises ---+ pour les titres, _ pour l'italique, * pour le gras etc ...) et le passage du code wiki au XML (et inversement) et géré par un parseur.
Tout utilisateur qui édite une page a la possibilité de la supprimer ou d'annuler ses modifications.
Création et suppression des rubriques et sous rubriques dynamiquement :
Un utilisateur connecté peut de même accéder à la page de gestion des rubriques.
Cette page permet :
- de créer une rubrique (en lui donnant un nom)
- de créer une sous rubrique, en lui donnant un nom et en spécifiant la rubrique à laquelle elle
appartient.
- de supprimer une rubrique (toutes ses sous rubriques sont alors automatiquement supprimées)
- de supprimer une sous rubrique
Toutes les modifications sont imédiatement prisent en compte et les menus de navigation se construisent ou disparaissent dynamiquement.
Création et supression des pages :
La création de page permet aux utilisateurs de créer leur propres pages sur le wiki.
Pour créer une page, il suffit de lui donner un nom et de spécifier la rubrique et la sous rubrique
auxquelles on désire qu'elle appartienne.
La page est alors créée et l'utilisateur est directement placé dessus pour pouvoir l'éditer.
Pour l'instant cette page n'est accessible qu'à condition de connaitre son adresse, elle n'est
pas référencée sur le wiki. Pour la rendre visible, il suffira à l'utilisateur d'éditer la
page de la sous rubrique en y rajoutant un lien vers sa nouvelle
page. Un utilisateur qui édite une page peut à tout moment la
supprimer en cliquant sur le bouton supprimer.
Recherche sur le wiki :
Tout utilisateur (inscrit ou non) peut rechercher des pages sur le wiki via le menu de recherche
en haut a droite. La recherche fonctionne par mot clé et ne tient pas compte de la casse.
Lorsque l'on effectue une recherche, les résultats sont présentés sous la forme d'une liste de liens vers les pages contenant le mot que l'on cherche, même les pages non référencées sont trouvées (cf ci dessus).
Gestion des groupes d'utilisateurs :
Notre wiki permet de gérer les groupes d'utilisateurs. En
cliquant sur le bouton "gestion des groupes", un utilisateur
peut accéder à la page de gestion des groupes.
Cette page permet :
- la création de groupes d'utilisateurs : il suffit de rentrer
un nom, et le groupe apparait directement dans la liste des
groupes.
- la supression de groupes d'utilisateurs : il suffit de
choisir un groupe parmis la liste des groupes puis de cliquer
sur le bouton supprimer qui lui est associé.
- l'ajout d'utilisateurs dans des groupes : il suffit de
selectionner un utilisateur et un groupe dans les listes
déroulantes puis de cliquer sur le bouton "placer".
Malheureusement, par manque de temps nous n'avons pas pu
finir la gestion des utilisateurs, toutes les
opérations décrites ci-dessus sont donc réalisables, mais il
n'est pas encore possible d'attribuer des droits aux pages et de
selectionner les groupes d'utilisateurs autorisés à modifier les
pages. Toutes les fonctions nécéssaires ont été écrites (notre
struture de la base de données gére les groupes et les droits), seule
l'interface n'est pas totalement implémentée.
Voici les differentes "briques" de notre projet :
- Un serveur HTTP Tomcat pour gérer les pages JSP
- Un client RMI et un serveur RMI pour intéragir avec la base de
données et donner suite aux requêtes des utilisateurs.
- Une base de données MySql4 pour stocker les pages et informations du
Wiki.
Schéma de l'architecture de notre Twiking :
La page d'index de notre wiki est la page principale du site, c'est elle qui
gere toutes les actions de l'utilisateur grâce au JSP.
Il existe deux types de pages, celles en dur (page d'inscription, de gestion des rubriques et des groupes par exemple) et celle stockées dans la base de données.
Les premieres sont écrites en HTML, les secondes en XML, mais aucune ne correspond à
des pages completes. La seule page complete (c-à-d commencent par la balise HTML) et la page d'index.
Lorsque l'utilisateur demande une page, celle-ci est recupérée dans la base de données (si nécéssaire)
puis placée au centre de la page d'index.
Le traitement JSP se fait principalement au debut de la page d'index,
on regarde la page que l'utilisateur demande et l'inclut au centre de la page.
Cela facilite le traitement et permet d'écrire que trés peu de page en entier.
La gestion des polices de caractères et le placement des menus et du contenu des pages
sont réalisés à l'aide d'une feuille de style.
Pour chaque nouvel utilisateur naviguant sur le wiki une
session est créée. Il y a donc un client RMI par session.
Le client RMI dialogue avec le serveur RMI qui à accès
à la base de données.
Les pages sont mémorisées dans la base de donnée dans le langage XML.
Nous pouvons générer, à partir du XML, du HTML (pour afficher une
page), ou du texte dans un langage de type wiki (pour éditer une
page).
Par exemple :
nous voyons dans le tableau ci-dessous le passage de XML(1) au
format wiki(2) :
| 1. Format XML |
2. Format de type wiki |
<FormatWiking><Titre1> Bienvenue dans le
TwikinG</Titre1> <Titre2> un petit
exemple</Titre2> <Paragraphe>Le mot est <Gras>
gras <Italique>italiqueGras </Italique> plusque gras
</Gras> <Phrase/> mais <Italique> ca peut aussi
etre <Gras>italique gras la </Gras> puis italique
</Italique> <Phrase/> </Paragraphe> <Liste><Blanc/><Blanc/><Blanc/><Item>
3 espaces avant une etoile
</Item> <Liste> <Liste><Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Item>
puis 9 espaces avant une
etoile</Item></Liste> <Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Blanc/><Item>
puis 3 avant l'etoile</Item></Liste></Liste>
<Tableau> <Ligne> <Colonne>la 1er case du
tableau</Colonne> <Colonne> puis deuxieme
</Colonne> <Colonne> et troisieme
</Colonne> </Ligne> </Tableau> <Tableau> <Ligne> <Colonne>
puis un tableau a 2 cases 2 colonnes
</Colonne> <Colonne> 1er ligne 2eme
colonne</Colonne> </Ligne> <Ligne> <Colonne>2emeligne
</Colonne> <Colonne> et dernierecase
</Colonne> </Ligne> </Tableau> </FormatWiking> |
---+
Bienvenue dans le TwikinG ---++ un petit exemple Le mot est * gras _italiqueGras _ plusque gras * mais _ ca peut aussi etre *italique gras la * puis italique _ * 3 espaces avant une etoile * puis 9 espaces avant une etoile * puis 3 avant l'etoile |la 1er case du tableau| puis deuxieme | et troisieme | | puis un tableau a 2 cases 2 colonnes | 1er ligne 2eme colonne| |2emeligne | et dernierecase |
| Par contre le passage du format wiki
au langage XML est généré par un parseur fait maison (à la main). Quand
une page est mal formée, un format erreur est généré :
--+ titre faux Une phrase * fausse | toto | titi | * toto
|
<LesErreurs> <Erreur> <Ligne>1</Ligne> <Message>Le
nombre de - pour le titre est
incorect</Message> <Proposition>Vous avez mis 2 - il
en faut que
3</Proposition> </Erreur> <Erreur> <Ligne>2</Ligne> <Message>La
ligne c'est fini sans dire que l'on arrete d'ecrire en
gras</Message> </Erreur> <Erreur> <Ligne>4</Ligne> <Colonne>3</Colonne> <Phrase><blanc/><blanc/><CaractereErreur>*</CaractereErreur><blanc/>toto</Phrase><Message>On
a detecte un List Item ou le nombre de blancs est
incorrect</Message> <Proposition>Il y a 2 blancs
avant l'etoile. Vous avez surement voulut en mettre 0 ou
3</Proposition> </Erreur> </LesErreurs> |
- Erreur a la ligne 1 :
Le nombre de - pour le titre est incorect
Vous avez mis 2 - il en faut que 3
- Erreur a la ligne 2 :
La ligne c'est fini sans dire que l'on arrete
d'ecrire en gras
- Erreur a la ligne 4 caractere 3
:
On a detecte un List Item ou le nombre de
blancs est incorrect Il y a 2 blancs
avant l'etoile. Vous avez surement voulut en mettre 0 ou 3
* toto
|
La base de données contient initialement 5 tables :
- utilisateurs :
contient le login et le mot de passe
afin d'identifier les utilisateurs
- XSL :
contient les fichiers xsl utilisé par le parseur
pour produire du code wiki xml ou html ou encore le code
d'erreur du parseur langage wiki vers xml. Si un utilisateur
désir utiliser ou modifier les fichiers XSL il lui suffit de le mettre
à jour dans la base de données, la modification devient
alors très rapide.
- rubriques :
contient le nom des rubriques crées dynamiquement dans notre wiki par l'utilisateur
- groupe_nom :
contient le nom des groupes utilisateurs
- groupe_appartient :
table qui permet de savoir à
quels groupes appartiennent les utilisateurs, ceux-ci peuvent
appartenir à plusieurs groupes
De plus des tables sont générées dynamiquement pour chaque
rubrique créée :
Voici les tables créées pour chaque rubrique "nom" ajoutée.
- "nom"Rubriques : contient la liste des sous rubriques de
la rubrique "nom"
- "nom"Pages : contient les pages des sous rubriques de la
rubrique "nom", une page webHome est automatiquement créée pour chaque sous rubrique
- "nom"Autorisation : contient les autorisations de
modification des pages de la rubrique "nom"
- "nom"Fichiers : contient les fichiers que l'on peut
attacher aux pages de la rubrique "nom", cette fonction n'a pas
pu être terminée pour cause de temps
Fonctionnement :
Une session correspond à une session internet, c'est-à-dire à la
période pendant laquelle le navigateur d'un client est connecté au
serveur web. Un client RMI est créé pour chaque session. Si la
personne qui navigue sur le site s'identifie, elle gardera le même
client RMI.
Le client RMI implémente l'interface
twinkingjdbc.InterfaceJDBC qui contient toutes les méthodes qui accèdent
à la base de données. Ceci afin de simplifier l'utilisation du client
RMI dans les pages JSP, on évite ainsi les try/catch de l'exception
java.rmi.RemoteException dans le code JSP.
Un client RMI a la
possibilité de se connecter à plusieurs serveurs RMI. C'est dans le
fichier client.properties qu'on le spécifie. Ainsi, à la création du
client RMI, une connection est établie avec tous les serveurs spécifiés
dans le fichier client.properties. Même si les serveurs RMI ne sont pas
tous lancés, le client RMI se connectera à ceux qui le sont. Toutes
les méthodes du client RMI utilisent un serveur courant. Ce serveur
courant est initialisé par une thread qui, toutes les 3 secondes, élit
un meilleur serveur et met à jour le serveur courant avec le serveur
qu'il vient de déterminer.
Lorsque le client RMI établie une
connection avec un serveur RMI (avec un lookup), il récupère une
instance clonée du serveur RMI. C'est avec cette nouvelle instance que
le client RMI va dialoguer pendant toutes la durée de la session. Ce
travail sera réalisé pour tous les serveurs RMI avec lequels le client
RMI aura pu établir un lookup.
Il est possible de spécifier au
serveur RMI le chemin vers un programme qui calcule le CPU utilisé. Ceci
permet au client RMI de choisir le serveur qui a le moins de travail.
Pour cela, il suffit d'éditer le fichier server.properties, et de donner
une valeur au champs CPUprog. Si ce champs n'est pas renseigné, un
nombre aléatoire remplacera le nombre qu'aurait du renvoyer le
programme.
Choix :
Nous avons choisit de créé une architecture NxN au niveau RMI pour des
raisons de performance et de sécurité. En effet, cela permet de
répartir la charge entre les différents serveurs RMI. De plus si un
serveur RMI crash, un autre serveur RMI pourra prendre le relais.
Nous avons choisit de ne pas faire de client RMI asynchrone. Car le
client RMI appelle des méthodes qui retournent un résultat dont il ne
peut se passer pour pouvoir continuer. Donc les Call back ne sont pas
non plus nécéssaires.
Gestion des groupes
Nous en avons parler plus haut.
Stocker et importer des fichiers
Il est possible de stocker des fichiers dans la base de données pour les attacher aux pages du TwikinG.
Pour cela il suffit de les stocker sous forme de Blob (suite de byte) dans la base de données, puis de faire un script JSP qui envoie le header correspondant au type du fichier, suivi par son flux de données. Il est alors possible d'attacher n'importe quel type de fichier : image, audio, video, programmes, zip, ... Nous avons fait les tests avec des images : une fonction existe pour insèrer une image dans la base de données.
|