3ème cycle Internet : Programmation & Applications POLE UNIVERSITAIRE LEONARD DE VINCI 92916 PARIS-LA-DEFENSE IPA 2002 eVinci-XP Group Blaise DELEMAZURE Hervé MARCANTONI Michel FEUILLADE JAVA XML-RPC LITE COMPTE-RENDU Projet: octobre 2001--janvier 2002 SOMMAIRE II – PRESENTATION DES 2 PROGRAMMES........................................................... 3 2.1 – LE SERVEUR ........................................................................................................................................................ 3 2.1.1 – La couche serveur ..................................................................................................................................... 3 2.1.2 – La couche RPC............................................................................................................................................ 4 2.1.4 – La couche application ............................................................................................................................... 5 2.2 - LE CLIENT .......................................................................................................................................................... 6 2.2.1 – La couche RPC............................................................................................................................................ 6 2.2.2 – La couche graphique ................................................................................................................................ 8 III – ECRITURE DU PROGRAMME ...................................................................... 9 3.1 – LES PROBLEMES RESOLUS............................................................................................................................... 9 3.1.1 -........................................................................................................................................................................ 9 3.2 – LIMITATIONS CONNUES ............................................................................................................................... 9 3.2.1 – Passage par l’écriture dur le disque de la hashtable......................................................................... 9 3.2.1 – Passage par l’écriture dur le disque des fichiers XML ..................................................................... 9 CONCLUSION ........................................................................................... 10 Projet JAVA – XML-RPC Lite - page 2 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] II – Présentation des 2 programmes XML-RPC Lite étant basé sur le modèle client-serveur, deux parties bien distinctes ont été développées : le serveur et le client. 2.1 – Le serveur L’application XML-RPC Lite serveur est implantée sur le serveur. Elle est constituée de trois couches superposées : 2.1.1 – La couche serveur Première étape Le serveur démarre et attend la connexion d’un client éventuel (server Socket). Seconde étape Lorsqu’un client se connecte, un thread (serverChild) est créé qui : 1. Lance la couche RPC (RPCLite.start()). 2. Enregistre le document XML du flux d’entrée de la socket dans un fichier (request.xml). 3. Appel la méthode RPCLite.XMLResponse(). Ce dernier appel est une entorse à la philosophie qui sous-tend la conception de RPC, car celle-ci est d’encapsuler complètement la couche RPC, qui ne doit être accessible que par les méthodes start() et stop(). 4. Lit le document XML généré par RPCLite dans un fichier (response.xml) et l’enregistre dans le flux de sortie de la socket. Projet JAVA – XML-RPC Lite - page 3 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] 2.1.2 – La couche RPC Première étape Elle analyse le fichier XML par la méthode de contrôle XMLResponse() qui crée le DOM en mémoire en analysant le fichier request.xml et fait appel selon le premier tag reçu (<request> ou <stock>) : Soit à la méthode getAction() à laquelle elle transmet le DOM en paramètre pour fournir la méthode demandée Soit à la méthode getStock(), façon WSDL, pour fournir le « stock » de classes, méthodes et objets présents sur le serveur et disponibles pour les clients. Ces deux méthodes traitent la demande du client et génèrent un document XML, contenant les résultats, qui est enregistré dans un fichier response.xml. Seconde étape La couche RPC est composée des éléments suivants : 1. Une table de hachage, un champ de RPCLite, qui permet de retrouver les références sur les objets avec leur nom. Elle est désérialisée et sérialisée dans le fichier hashtable.bin à chaque connexion d’un client, c’est à dire à chaque invocation des méthodes RPCLite.start() et RPCLite.stop() Cette solution pose des problèmes de cohérence car un client peut écraser les objets créés par un autre. Il faudra dans une version ultérieure charger la table de hachage une seule fois par session du serveur. 2. Une classe de méthodes utilitaires auxquelles font appel getAction() et getStock() Cette classe, Utilities, est interne à la classe RPCLite car ses méthodes manipulent la table de hachage 3. Une méthode loadConfig(), pour configurer RPC, qui est lancée en exécutant directement la méthode main() de RPC et fait appel à deux fichiers que l’administrateur peut éditer : config.xml et update.xml. Cette méthode permet dans cette version de créer éventuellement une nouvelle table de hachage et surtout de charger de nouvelles classes à disposition des clients. D’autres fonctionnalités pourront être développées pour une version ultérieure. Projet JAVA – XML-RPC Lite - page 4 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] 2.1.4 – La couche application Elle est composée de tous les objets, classes et méthodes que le client peut manipuler sur le serveur. Le développement d’une classe accessible par le client sur le serveur (donc partageable par RPC-Lite) doit respecter les spécifications suivantes : La classe doit implémenter Serializable pour que ses instances puissent être sérialisées avec la table de hachage Elle ne doit pas avoir de constructeur autre que celui par défaut. En fait c’est une restriction non nécessaire puisque la méthode Class.getConstructors() permet de créer des objets avec un constructeur qui accepte des paramètres. Projet JAVA – XML-RPC Lite - page 5 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] 2.2 - Le client L’application XML-RPC Lite client est implantée sur le client. Elle est constituée de deux couches superposées : 2.2.1 – La couche RPC La couche RPC telle que nous l’avons définie au début du projet proposait une amélioration par rapport au projet initial : la possibilité de « découverte » par le client des classes disponibles sur le serveur et, parallèlement, la notion de « service » proposé par le serveur. Ce mécanisme a été implémenté dans la couche RPC par l’intermédiaire du document XML Stock. Cette notion de découverte de service par le client implique donc que ce mécanisme soit pris en compte dès l’initialisation des composants de l’interface. Les classes de la couche ClientSocket : Cette classe gère les connexions avec le serveur. Elle offre deux méthodes : La méthode openConnection() permet de gérer les flux d'entrée et de sortie de la socket. La méthode remoteProcedureCall() utilise ces flux pour transmettre les requettes et recevoir les réponses. ClientXmlParsing : Cette classe gère les différents traitements effectués sur le XML. Elle offre trois méthodes : La méthode parseStock() permet d'analyser le document XML Stock de description de service et d'en extraire les informations permettant de construire les listes déroulantes de l'interface graphique. Cette méthode utilise les classes ClientDescriptionService et ClientDescriptionClass pour générer les informations de service. La méthode parseRequest() permet de générer le document XML de requête. La méthode parseResponse() permet d'analyser le document XML de réponse et d'en extraire le résultat de la requête. ClientDescriptionService : Cette classe offre la possibilité de représenter un service RPC complet, à savoir une liste de classes "utilisables" à distance.(pour cela, elle utilise la classe ClientDescriptionClass). Cette représentation objet du service RPC permet : La mise à jour des listes déroulantes de l'interface graphique. La construction du document XML de requête. Projet JAVA – XML-RPC Lite - page 6 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] ClientDescriptionClass : Cette classe offre la possibilité de représenter une classe d'un service RPC, à savoir : Son nom. Une liste de ses méthodes. Une liste de ses instances (ou objets). Cette représentation objet d'une classe d'un service RPC permet : La mise à jour des listes déroulantes de l'interface graphique. La construction du document XML de requête. Les étapes de traitement Première étape : parseStock() (lors de l’initialisation de l’interface graphique) : 1. Création d’une Socket avec le serveur par la méthode openConnection() de la classe ClientSocket. 2. Envoi du document XML requête de demande de description de service : <stock></stock> par la méthode remoteProcedureCall() de la classe ClientSocket. 3. Réception du document XML réponse de description de service. 4. Analyse du document XML par la méthode DOM et création d’un objet ClientDescriptionService. Seconde étape : parseRequest() (lors de la demande de l’utilisateur) : 1. Par la méthode du DOM, création du document XML de requête à partir des saisies de l’utilisateur. 2. Envoi du document XML requête d’invocation de méthode distante par la méthode remoteProcedureCall() de la classe ClientSocket. 3. Réception du document XML réponse d’invocation de méthode distante. Troisième étape : parseResponse() (lors de la demande de l’utilisateur) : 1. Analyse du document XML par la méthode DOM et affichage du résultat dans une boîte de dialogue. Projet JAVA – XML-RPC Lite - page 7 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] 2.2.2 – La couche graphique Les classes de la couche ClientApplication Cette classe gère l'application, c'est elle qui possède la méthode main(). ClientBoxMain : Cette classe gère la fenêtre principale de l'application cliente. ClientBoxAbout : Cette classe gère la fenêtre "A propos" de l'application cliente. On y retrouve deux types de méthodes : La méthode d’initialisation des composants. Les méthodes de gestion des évènements. ClientComboBuilder : Cette classe gère la mise à jour des liste déroulantes de l'interface graphique présentant les paramètres à saisir pour la requette RPC. Elle offre quatre méthodes : La méthode updateClass() permet la mise à jour de la liste déroulante présentant les classes disponibles dans le service RPC. La méthode updateMethod() permet la mise à jour de la liste déroulante présentant les méthodes disponibles dans la classe sélectionnée. La méthode updateObject() permet la mise à jour de la liste déroulante présentant les instances (objets) disponibles dans la classe sélectionnée. La méthode updateParam() permet la mise à jour du champs de saisie des paramètres de la méthode sélectionnée. Les étapes de traitement Première étape : ClientBoxMain (lors du lancement de l’application) : 1. Initialisation des composants de la fenêtre principale de l’application et utilisation de la classe ClientComboBuilder pour l’initialisation des composants de saisie de la requête (ComboBox et TextField). Seconde étape : ClientBoxMain (lors de la demande de l’utilisateur) : 1. Initialisation des composants de saisie de la requête ClientComboBuilder en fonction des saisies de l’utilisateur. par Troisième étape : ClientBoxAbout (lors de la demande de l’utilisateur) : 1. Initialisation des composants de la fenêtre « A propos ». Projet JAVA – XML-RPC Lite - page 8 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] la classe III – ECRITURE DU PROGRAMME La première étape fut de fixer les bases de la communication client serveur. Pour cela, la couche applicative implantant le protocole XML-RPC Lite fut le premier élément développé. Durant cette phase, mais aussi par la suite, sont apparus quelques problèmes qu’il nous a fallu résoudre par tel ou tel moyen aboutissant soit au fonctionnement normal de l’application, soit à une variante pouvant être encore complétée et améliorée. 3.1 – Les problèmes résolus 3.1.1 - 3.2 – Limitations connues 3.2.1 – Passage par l’écriture dur le disque de la hashtable. Problème : accès concurrents à la hashtable par plusieurs threads, impliquant un risque de perte de données Causes : Solution : passer par un processus principal et unique pour l’écriture de la hashtable sur le disque. Il en résultera un gain de performances et de sécurité. 3.2.1 – Passage par l’écriture dur le disque des fichiers XML Problème : performance si tous les fichiers XML des deux applications transitent par le disque. Causes : types de flux incompatibles entre la méthode readLine() de Socket et la méthode parse() DocumentBuilder. Solution : Projet JAVA – XML-RPC Lite - page 9 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected] CONCLUSION De nombreux commentaires ont été ajoutés dans le code. Ce projet a nécessité beaucoup de rigueur dans la définition de l’algorithme. Les heures de programmation m’ont permis d’atteindre l’objectif, à savoir construire un DOM et restituer le code source à partir de ce DOM. Certains problèmes plus ou moins bloquants que j’ai été amené résoudre m’ont permis de prendre du recul face au programme et de rectifier certaines orientations du projet avant qu’elles ne deviennent, elles aussi, bloquantes. C’est essentiellement en testant le programme dans des situations réelles et diverses que l’on découvre ces points bloquants, d’où l’importance de la classe Test. L’objectif est donc atteint, même s’il subsiste quelques petits problèmes (détectés et dont je connais les solutions). Projet JAVA – XML-RPC Lite - page 10 - 27/05/17 - eVinci Group IPA: [email protected], [email protected], [email protected]