Projet RMI/Web
Maitrise Informatique de Nice 2002/2003

Téléchargez l'Archive : Twiking.tgz

Plan :

  0. Contenue de l'archive et installation
1. Cahier des charges
2. Explications des fonctionalités
3. Structure du Twiking
4. Utilisation de JSP
5. Edition et affichage des pages
6. Structure de la base de données
7. Partie RMI
8. Extensions possibles
9. Les auteurs


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 :

  1. 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)
  2. Installation des class Loader
    Faire ./deploiement classLoader <numDePort>
    exemple : ./deploiement classLoader 3000
  3. 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
  4. 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 :

  1. Lancer le serveur sql
  2. Lancer le(s) class loader
  3. Vérifier le contenu des serveur.properties de(s) serveur(s) rmi
  4. Lancer le(s) serveur(s) RMI
  5. Verifier le contenu des client.properties de(s) client rmi dans les répertoires bin des serveurs tomcat
  6. Lancer les(s) serveur(s) TomCat
  7. bonne navigation

1. Cahier des charges

Fonctionnalités de notre Wiki :

  1. Gestion des utilisateurs et des sessions
  2. Edition des pages
  3. Création et supression des rubriques et sous rubriques (dynamiquement)
  4. Creation et suppression des pages
  5. Recherche sur le Wiki
  6. Gestion des groupes
Impératif demandé : liaison entre l'application web et la base de données avec Java RMI



2. Explications des fonctionalités :

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.



3. Structure du TwikinG :

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 :



4. Utilisation des JSP :

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.



5. Edition et affichage des pages :

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



6. Structure de la Base de données :

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



7. La partie RMI :

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.


8. Extensions possibles :

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.

9. Les auteurs :

AIRAULT Fabrice   BONIS Alexis   CHARBIT Lucas   GRILLO Laure  

Retour