Xml - Java Tomcat Guide - Page Frontière du Site d`Arnaud Valeix
Transcription
Xml - Java Tomcat Guide - Page Frontière du Site d`Arnaud Valeix
Février, mars, avril, mai 2002 – Stage informatique Création d’une librairie de Balises pour l’insertion d’agents JADE dans des pages Jsp Olivier Fourdrinoy Maîtrise d’informatique, Faculté Jean Perrin, Université d’Artois, Lens. 2 Introduction Plus j’apprends de choses en informatique et moins j’ai l’impression d’en savoir. Ce domaine est à mes yeux un dédale gigantesque où chaque porte s’ouvre sur un couloir comportant lui même une quantité astronomique de portes. Le but de ce rapport n’est donc pas de faire l’inventaire de tout ce que j’ai vu ou aperçu derrière la porte de ce stage mais simplement de donner des clés qui en faciliteront l’ouverture. Alors pour reprendre l’idée d’une très célèbre collection du monde de l’informatique, ce rapport a pour but secret d’intéresser à la fois les profanes et les initiés avec une approche d’abord légère puis plus approfondie des domaines étudiés. La première partie de ce rapport - la plus importante - sera consacrée aux différents domaines, outils ou autres langages étudiés. Dans la seconde partie, je traiterai du projet lui-même, en partant de l’idée de départ jusqu’à son état final avec une évocation des évolutions souhaitables ou souhaitées. Enfin, la troisième partie, approche plus subjective du stage, essaiera de dégager l’expérience acquise, de revenir sur les erreurs ou sur les réussites, en somme il s’agira d’une relecture de la méthode de travail. Bonne lecture, en espérant que vous en saurez d’avantage sur les agents ou les Jsp (ou les deux) après avoir lu ce rapport. 3 Sommaire Introduction Les Outils et Langages Les agents Le projet Jade Les Java Server Pages Les taglibs Le projet Le sujet La structure de la bibliothèque de balises Un exemple d’utilisation Expériences acquises lors du stage Un projet basé sur différentes technologies Les exemples plutôt que la théorie Annexes Le code Le glossaire 4 Les Outils et Langages Les agents « Les agents pour les nuls » Je vais ici essayer d'expliquer ce qu'est un agent. Pour cela, permettez moi de vous parler de ma famille : J'ai un petit cousin qui a un tamagoshi (vous savez ces petites "bêtes" électroniques qui nous envahissent depuis un petit moment). Eh bien, le tamagoshi, animal autonome fort sympathique, quand il a faim il sonne : Il envoie un message à mon cousin pour lui dire qu'il a faim. Mon cousin appuie alors sur le bouton Petit Lo (il a gagné son tamagoshi en mangeant des Petits Lo) pour lui donner à manger : Il donne en réponse au message du tamagoshi des Petits Lo. Mais comme tout le monde le sait, les Petits Lo ça donne soif ! C'est pourquoi quelques secondes plus tard, le tamagoshi sonne car il a soif. Là, mon cousin a le choix : Eau ou jus d'orange. Il appuie sur le bouton jus d'orange et là le tamagoshi se met à sonner encore plus fort : Il refuse le jus d'orange. Mon cousin lui donne alors de l'eau et le tamagoshi la boit. L'animal n'a plus sonné pendant au moins une heure car, c'est bien connu, après avoir mangé et bu les tamagoshi font la sieste. Et nos agents dans tout ça ! Et bien, si l'on compare notre tamagoshi à un agent, et que l'on reprend les mots en gras, on retient qu'un agent est : - une entité autonome mais fortement dépendante des autres (c'est le tamagoshi) - un agent communique à l'aide de messages (des bips pour le tamagoshi, des boutons pour mon cousin) - un agent est autonome, il peut refuser de faire ce qu'on lui dit de faire (ici, il refuse de boire du jus d'orange). 5 Comment communiquent les agents ? Mon cousin a gagné son tamagoshi en mangeant des Petits Lo, et comme il en mange beaucoup, il en a gagné beaucoup : une trentaine ! Bine sur il ne peut pas s’en occuper tout seul, alors ma cousine l'aide. Ainsi quand un tamagoshi sonne, il ne sait pas qui va s'occuper de lui : mon cousin ou ma cousine. C'est important : le tamagoshi qui a besoin de quelque chose envoie un message à son entourage et il attend que quelqu'un s'occupe de lui. Il ne sait pas, a priori, qui va répondre à son message : mon cousin ou ma cousine ou peut être personne... Par contre lorsque mon cousin ou ma cousine répondent à un tamagoshi, ils répondent uniquement au tamagoshi qui a sonné, c'est à dire qu'ils envoient un message au bon tamagoshi. Comme les tamagoshis, les agents communiquent en envoyant des messages. Ils peuvent envoyer principalement des messages de deux types: - un message à plusieurs autres agents (mon cousin ou ma cousine), par exemple pour signaler ou demander quelque chose. - un message à un seul agent, par exemple pour répondre à une question. Les agents vivent en communauté ! En réfléchissant un peu, mon cousin eu l'idée de ne plus avoir des tamagoshis électroniques mais informatiques ! Il a en effet trouvé sur Internet un programme qui fait fonctionner des tamagoshi virtuels dans un parc. Ce qui est nouveau, c’est que l'on peut soit s'occuper des tamagoshis soit les mettre à la garderie. Quand ils sont à la garderie, tous les tamagoshis, se débrouillent pour survivre et répondre à leurs besoins ! Voilà ce qu’explique l'aide de ce petit programme : "Dans la garderie, il y a des tamagoshis qui s'occupent des autres ! Ainsi nous avons rajouté : - un tamagoshi qui fait des bisous (il ne fait que ça) aux tamagoshis qui sont tristes, - un tamagoshi qui donne à manger à n'importe quel tamagoshi qui a faim, - un tamagoshi qui donne à boire aux tamagoshi qui ont soif - et pour finir, un tamagoshi somnifère qui donne un somnifère aux tamagoshis fatigués. Ainsi la communauté de tamagoshi arrive à auto satisfaire, et vous pouvez travailler sur votre ordinateur sans être dérangé." 6 Nous venons d'aborder trois notions importantes pour les agents : - la notion de communauté. En effet, jusqu'à maintenant, nous avons parlé d'agent mais sans préciser où ils étaient. Et bien voilà, les agents sont dans une communauté appelée le Système Multi Agents (SMA). Les agents à l'intérieur d'un SMA arrivent à auto satisfaire, c'est à dire qu'ils arrivent à survivre et donc à atteindre leur but (pour les tamagoshis le but est de survivre le plus longtemps possible). - Les agents ont un but et tous les agents présents dans le SMA vont collaborer pour essayer d'atteindre ce but. - Enfin, les agents peuvent être spécialisés : un agent ne sait pas faire beaucoup de chose mais ce qu'il sait faire, il le fait vite et bien et le met en commun avec les autres agents. Et en plus ils peuvent se déplacer... En fait le logiciel était tellement bien que ses tamagoshis ne lui servaient plus à rien. Il les a donc donnés à un copain qui adorait les tamagoshis. Ce copain, avait déjà quelques tamagoshis, il s'est donc retrouvé avec plein de tamagoshis : Les tamagoshi de mon cousin avaient changé de communauté. Les agents peuvent se déplacer ! Pour des tamagoshis cela peut paraître anodin : il suffit de les prendre et de les transporter. Mais pour les agents ceci peut-être plus évolué : - Les agents se déplacent car on leur dit de se déplacer. (Comme pour les tamagoshis) ceci n'est pas très évolué. - Les agents demandent à se déplacer. Là, c'est plus intéressant car c'est l'agent lui-même qui demande à se déplacer et à changer de Système Multi Agent. Une définition des agents et Système Multi Agent (SMA) Pour résumer voici la définition d'un agent: - un agent est une entité autonome située dans un environnement, - un agent communique avec son environnement, - un agent peut communiquer avec son environnement à l'aide de messages, dans ce cas, on peut distinguer deux grands types de messages : o les messages envoyés à plusieurs agents o les messages envoyés à un seul agent, - un agent peut refuser de faire ce qu'on lui dit de faire, - les agents vivent dans des communautés appelées Systèmes Multi Agent (SMA). 7 - Ils collaborent au sein de ce SMA pour atteindre un objectif commun, - enfin, les agents peuvent se déplacer volontairement ou pas et voyager ainsi d'un Système Multi Agent à un autre. Les problèmes liés aux Systèmes Multi Agent Quand mon cousin avait 30 tamagoshi et qu'il s'en occupait avec ma cousine... Cependant, ma cousine n'est pas fan de tamagoshi, elle en a eu vite marre et dès qu'un tamagoshi sonnait, elle appuyait sur le bouton dormir, comme ça elle était tranquille pour un petit moment. Le problème, c'est que les tamagoshis ne vivaient pas longtemps car ils ne pouvaient plus ni manger, ni boire. Là je sens qui en a qui vont me dire : "Oui mais... le tamagoshi a le droit de refuser de dormir, on l'a vu tout à l'heure". Je suis d'accord, mais les tamagoshi sont bien élevés et quand on leur dit de dormir, ils dorment même s'ils n'ont pas sommeil... Un autre problème avec les 30 tamagoshis, c'est qu'il y en a un qui ne marchait pas bien : il n'arrêtait pas de sonner et refusait de dormir ! Résultat, on s'occupait tellement de lui que parfois d'autres tamagoshis mouraient en attendant... Nous avons ici bien cerné le problème lié aux SMA : tout le monde doit jouer le jeu, tout le monde doit coopérer pour atteindre le même objectif. Si certains agents coopèrent (les tamagoshis qui dorment) et d'autres pas (ma cousine qui les fait dormir tout le temps) l'objectif du SMA (faire vivre les tamagoshis le plus longtemps possible) ne peut être atteint. Si certains agents monopolisent des ressources sans raison (le tamagoshi qui ne marche pas bien) l'objectif du SMA ne pas, non plus, être atteint. Les agents doivent donc coopérer et respecter certaines règles de bonne conduite pour que le SMA puisse atteindre son objectif. 8 En espérant que cette explication aura éclairé les lecteurs profanes de ce rapport, voici maintenant une approche plus « informatisée » du monde des agents : Définition des agents AGENT : c'est une entité physique ou virtuelle - qui est capable d'agir dans un environnement, - qui communique avec son environnement, - qui est mue par un ensemble de tendances (sous la forme d'objectifs individuels ou d'une fonction de satisfaction, voire de survie, qu'elle cherche à optimiser), - qui possède des ressources (temps CPU, mémoire...) propres, - qui est capable de percevoir (mais de manière limitée) son environnement, - qui ne dispose que d'une représentation partielle de cet environnement (et éventuellement aucune), - qui possède des compétences et offre des services, - qui peut éventuellement se reproduire, - dont le comportement tend à satisfaire ses objectifs en tenant compte des ressources et des compétences dont elle dispose, et en fonction de sa perception, de ses représentations et des communications qu'elle reçoit. Définition des Systèmes Multi Agents SMA : Système Multi-Agents : c'est un système composé des éléments suivants : - un environnement E, disposant d'une métrique en général, - un ensemble d'objets O, auxquels on peut associer une position dans E à un moment donné. Ces objets (hormis les agents) sont passifs : les agents peuvent les percevoir, les créer, les détruire et les modifier. - un ensemble A d'agents, lesquels représentent les entités actives du système, - un ensemble de relations R qui unissent les objets (et agents) entre eux, - un ensemble d'opérateurs Op permettant aux agents de A de percevoir, produire, consommer, transformer et manipuler des objets de O, des opérateurs chargés de représenter l'application de ces opérations et la réaction du monde à cette tentative de modification, que l'on appellera les lois de l'univers. 9 Diversité des Systèmes Multi Agents Voici quelques exemples pour mieux comprendre ce qu'est un SMA et toute la diversité qui peut être engendrée par de tels systèmes : Une fourmilière L'environnement : la fourmilière et l'espace alentour occupé par les fourmis Les objets : les végétaux, la terre, l'eau,... toute chose inerte Les agents : les fourmis, les araignées... toute chose vivante. Un écosystème Cet écosystème peut-être : une prairie, un bois, un groupe de proies (cervidés), un groupe de prédateurs(loups. Le principe est le même que pour la fourmilière. On peut, avec un tel système étudier l'écosystème, déterminer si des espèces vont disparaître ou de quelles façons vont évoluer les différentes populations. Un groupe de robots partant à la recherche de minerai Chaque robot pouvant soit chercher du minerai sur un terrain encore inconnu et/ou extraire du minerai et/ou le transporter... On constate qu'il y a plusieurs niveaux d'organisation : micro-social On s'intéresse aux différentes formes de liaison et d'interaction entre un petit nombre d'agents (ex des robots chercheurs de minerai), groupe L'organisation est plus complète. On étudie les différenciations des rôles et des activités des agents, l'émergence de structures organisatrices entre agents... (ex de l'écosystème), sociétés globales (population) On étudie la dynamique d'un grand nombre d'agents, la structure générale du système et son évolution (ex des fourmis). 10 Les agents peuvent être classés en trois catégories relatives à leur réactivité : cognitifs Ils peuvent anticiper, prévoir le futur, mémoriser des choses ... ils réfléchissent. réactifs Ils réagissent directement à l'environnement perçu, par pulsion (ex : les fourmis). hybrides un mélange des deux. Il y a donc une infinité de système multi-agents différents. En plus de cette différence entre les agents, de leur niveau d'organisation, s'ajoutent les moyens de communication (d'agent à agent, d'agent à agent passant par le SMA, par l'environnement (les signaux)...), les problèmes d'interaction et de coopération qui peuvent être réglés de différentes manières, et les actions et comportement qui sont propres à chaque agent. Il est utile de remarquer qu'un SMA est un agent. Ainsi, les fourmilières sont des agents qui peuvent interagir entre eux (prise de territoire, attaques...), les actions additionnées des fourmis donnant une action globale qui sera celle de la fourmilière. Mais on classe également les agents par rapport à leur mobilité Agents fixes C'est le système le plus immédiat (facile) à implémenter. Un SMA avec des agents non mobile présente tous les intérêts d'un SMA classique : - exécution des divers agents en parallèle (en général sous forme de threads) et donc indépendance d'exécution des différents agents, - communication grâce à un protocole et un système de communication (en réseau si c'est le cas), - libre arbitre des agents : ils décident de répondre ou non aux sollicitations (messages) extérieures, - les agents peuvent êtres de n'importe quel type : réactif, cognitif, etc. Ce cadre de travail permet d'implémenter beaucoup d'applications utilisant les agents. On peut alors faire de la programmation "orienté agent" (pour ceux qui pensent que les agents sont l'évolution logique des objets et donc que la programmation orientée agent sera l'équivalent de la programmation orienté objet). On peut aussi travailler en réseau, c'est à dire, que les agents sont répartis à plusieurs endroits du réseau mais ne se déplacent pas. 11 Note : Il peut aussi être possible dans ce cadre d'architecture de tuer un agent et d'en créer un autre à un autre endroit qui continue ce que le premier avait commencé. Cela fournis une forme artificielle de mobilité. Agents mobiles Lors de l'utilisation d'agents mobiles toutes les caractéristiques des agents fixes sont conservées. L'utilisation des agents mobiles présente en outre, plusieurs avantages : - répartition de la charge de calcul : un agent mobile peut en effet se déplacer sur un ordinateur plus puissant pour effectuer un calcul complexe. De même il peut quitter une machine qui est saturé pour aller sur une autre. - réduction du trafic réseau : un agent qui a besoin de traiter une grande quantité de données situées sur un autre ordinateur (base de données par exemple) peut se déplacer sur l'ordinateur possédant les données et revenir avec le résultat. Cela permet d'éviter de faire transiter les données sur le réseau. Les agents mobiles présentent des intérêts évidents, mais sont cependant plus complexes à gérer. Par exemple : - il faut faire suivre les messages lorsque l'agent se déplace. - pour qu'un agent puisse se déplacer, il faut bien entendu que des sites d'accueil existent. - l'utilisation de plusieurs langages de programmation peut poser des problèmes pour la mobilité des agents. Format d'échange des données Dans un système hétérogène où collaborent des agents écrits dans différents langages, la nécessité de définir un protocole de communication est évidente. Ce protocole doit cependant aussi bien définir le fond que la forme des échanges, ainsi lorsqu'un objet reçoit une information, il doit savoir de quoi il s'agit et éventuellement comment la traiter. La définition d'un protocole (ou langage) de communication permet, en outre, de faire coopérer facilement plusieurs versions d'un même logiciel : Une fois le protocole définit, une partie du logiciel peut évoluer sans que les autres parties n'aient à évoluer de leur côté. Ceci suppose que dés le départ, le protocole de communication choisi soit le plus complet possible, mais aussi et surtout extensible. C'est en effet grâce à cela que l'évolution et l'interopérabilité des différentes briques du logiciel peut être garantie. 12 Format XML (description de la forme) XML permet de décrire des structures de données aussi bien que de représenter des données. Ceci permet donc au langage XML d'être un bon candidat pour l'échange de données entre les différents agents du système. Plusieurs solutions se présentent tout de même pour l'échange de données avec XML : Les données que l'on échange n'ont pas une structure fixe (a priori), il faut donc : - soit décrire la structure des données dans le document XML puis construire un objet qui puisse accueillir ces informations, - soit définir une bibliothèque d'objet qui sont susceptibles d'êtres échangés, et se référer à cette bibliothèque lorsque l'on échange des informations. Les deux solutions semblent envisageable et présentent chacune leurs avantages et leurs inconvénients. Il faut noter que l'utilisation langages différents entraîne d'autres problèmes, notamment sur les types de base : un entier n'a pas la même plage de valeur dans tous les langages, etc. Format ACL / KIF / KQML (description du fond) KQML (Knowledge Query Modeling Langage) est un langage qui permet de définir un moyen de communication uniforme entre les divers acteurs du système multi-agents. Ce langage, contrairement à XML décrit la forme dont les données sont échangées (du pseudo-lisp) mais aussi le fond, c'est à dire les informations à mettre dans le message. Même si l'on utilise XML pour la forme, pour le contenu du message il peut être intéressant de regarder ce qui a été fait avec KQML : Le nom de l'expéditeur, du destinataire, le sujet du message, l'intention du message et/ou le type du message, la priorité du message, la date d'émission, la durée de validité (dans le cas d'une application où la notion de temps est importante) le type de contenu de message, le contenu du message, etc. 13 Gestion du temps La gestion du temps est importante. En effet, quelle valeur donner à une information émise il y a 2 jours ? (surtout si cette information est vite périmée : prévision météo par exemple). Ainsi la gestion du temps et le "nettoyage" des messages ayant expirés est nécessaire pour économiser du temps CPU et éviter de fournir des informations erronées. Cette gestion peut sembler un peu "lourde" à mettre en oeuvre, mais dans le cas d'une application répartie, donc sur plusieurs (>2) sites en réseau, la notion de temps est très importante. En effet, si sur une machine, on peut considérer que l'échange de données inter processus est instantané, sur un réseau, même de deux machines, cet échange d'information peut s'avérer lent. Note : Comme nous le verrons plus tard, l'implémentation d'un SMA en réseau peut s'assimiler à la programmation d'une structure réseau logicielle au-dessus de la structure réseau matérielle. Or dans la structure réseau matérielle, les paquets transportés sont dotés d'un TTL (time to live) donc d'une date de péremption. Il semble donc logique d'avoir une notion comparable dans la structure logicielle traitant le réseau. Communication entre les agents Communication asynchrone Réponse non donnée immédiatement. On demande et on n'attend pas la réponse, on fait autre chose en attendant. Communication synchrone La communication synchrone est celle que l'on a le plus l'habitude de manipuler : c'est, par exemple, un appel de méthode. Un objet demande quelque chose à un autre objet et attend la réponse avant de poursuivre son exécution. Communication directe (monocast) On discute directement d'un agent avec un autre agent : les deux agents sont en communication directe. En fonction des implémentations, les deux objets se "connaissent" directement via leurs références, connaissent un proxy de l'objet ou ne connaissent que le nom de l'objet et utilisent les services d'un facteur pour délivrer le message. Les diverses implémentations dépendant du niveau d'indépendance que l'on veut donner aux agents. 14 Communication en groupe de diffusion (multicast) Inscription à une liste de diffusion et réception de tous les messages qui y sont associés (utilisation des sockets multicast). La différence entre la communication directe et les listes de diffusion, est exactement la même que celle qui existe entre le mail et les mailing-list. (On peut noter que les listes de diffusion s'apparentent à la technologie push.) Dans le cas où plusieurs listes existent, il est possible de les structurer sous forme d'une liste ou d'une arborescence. Cette dernière possibilité est beaucoup plus souple. De même un objet partagé peut gérer la liste des sujets et en ajouter à la demande d'un utilisateur. Un cas particulier de la communication multicast est la communication broadcast. La communication broadcast consiste à envoyer un message à tous les agents du SMA. Ceci permet, par exemple, à un agent d'indiquer sa présence aux autres agents. Ce type de communication s'implémente très facilement si l'on dispose d'une couche de communication multicast. Note : Les sockets multicast sont basées sur le protocole UDP. Ce protocole se situe un niveau en dessous les sockets TCP/IP et ne garantie pas la réception des données envoyées. Il se peut donc que certains messages envoyés via les multicast sockets n'arrivent jamais. Transport des messages Le transport des messages est un point important dans les SMA : les agents "dialoguent" uniquement par échange de message, donc les performances du transport de messages influencent directement les performances du SMA. Le transport des messages peut se faire de diverses manières : - à l'aide d'objets CORBA ou des sockets pour la couche de transport des données. - D'autres systèmes propriétaires permettent aussi de transport des messages : PRC en C/C++, RMI en Java, COM/DCOM sous Windows..., - par appel de méthode directe sur l'agent ou appel de méthodes sur un objet proxy de l'agent (celui-ci permettant aux autres objets/agents de ne jamais connaître directement l'agent), - par utilisation d'un MOM (Message Oriented Middleware) qui agit comme un facteur et distribue les messages aux agents intéressés. Nous venons d'évoquer les méthodes de transport susceptibles d'êtres utilisées pour la communication directe entre deux agents, pour la communication multicast, on peut rajouter d'autres points : 15 - la gestion des différents sujets des listes de diffusion, - la diffusion des messages d'un point de vue matériel : on peut utiliser la couche de transport de messages directs ou utiliser des protocoles multicast, comme les multicast socket. Il faut aussi noter que dans le cas d'une implémentation réseau, il faut définir un "réseau virtuel" logiciel au-dessus de la couche réseau matérielle. En effet il faut pouvoir donner une adresse (équivalent à de l'adresse IP pour les machines) à tous les agents présents dans le système. Il faut aussi pouvoir router les messages afin que n'importe quel agent puisse dialoguer avec n'importe quel(s) autre(s) agent(s). Plusieurs solutions sont envisageables pour résoudre ce problème : - un objet distribué unique qui attribue les adresses (objet CORBA par exemple) et qui gère le routage des messages, - une architecture du type réseau Ethernet (il me semble), c'est à dire avec des routeurs (gateway) à différents niveaux. Par exemple un routeur par SMA puis un routeur pour un groupe de SMA. Cette architecture peut être auto-configurable (en se basant en partie sur les adresses IP des machines par exemple) ou être configurée par des fichiers d'initialisations par exemple. Architecture du SMA L'architecture du SMA sera liée à la façon dont seront implémentées les communications. On parle ici de SMA en tant que système multi-agents global, c'est à dire, l'infrastructure qui permet aux agents de fonctionner. Il faudrait peut-être parler de SEMA pour Système d'Exploitation Multi-Agents. En effet, le système doit gérer aussi bien l'ensemble des transactions sur le réseau que la gestion des messages ou l'accès aux données. Nous utilisons donc abusivement le terme SMA pour désigner les lieux (ou sites) ou s'exécutent les agents, ainsi que l'ensemble des opérations gérées par ces lieux d'exécution. 16 Organisation centralisée Dans une conception centralisée, un agent connaît tous les autres agents. Ainsi lorsque l'on a besoin d'une compétence particulière ou d'un agent particulier on s'en réfère à cet agent pour connaître le/les agents concernés. On peut noter que ces deux fonctionnalités font partie de CORBA. Ainsi, si tous les agents sont des objets CORBA, il n'y a plus grand chose à faire. L'avantage de la méthode est sa simplicité de mise en oeuvre. Cependant, un seul objet gérant toutes les adresses, il peut devenir un goulet d'étranglement et grever de façon significative les performances du système. De même, si l'objet gérant le système d'adressage plante, le système plante avec. Organisation libre (non centralisée) Aucun agent ne connaît tous les agents. Localement, un agent peut connaître les agents avec il est susceptible de traiter, mais personne n'a, a priori, de vision globale. Personne ne connaît personne a priori et c'est en dialoguant que l'on trouve les autres. On peut par exemple s'inscrire sur un groupe de diffusion qui nous intéresse pour entrer en contact avec d'autres agents. Cette méthode présente l'avantage d'être plus "distribué" que la méthode centralisée. En cas de défaillance d'une partie du système, le reste peut continuer à fonctionner. Cependant la recherche d'un agent donnée ou d'une catégorie d'agent ayant des compétences particulières est moins directe. De même l'attribution d'adresses unique à chaque agent est moins directe que dans la méthode centralisée. Gestion du temps Le problème de la gestion du temps a déjà été abordé dans le cadre des messages, il s'agit maintenant de la gestion du temps pour les agents proprement dits : Un agent est généralement implémenté sous forme d'un thread, celui-ci étant géré par le langage de programmation ou le plus souvent par le système d'exploitation. On est donc dépendant de la gestion des threads du système d'exploitation. Le système d'exploitation ayant généralement un système mutli-thread préemptif, la gestion des priorités de threads se fait dans une file d'attente et non pas sur le temps d'exécution des différents threads. Il peut donc être intéressant dans certains cas d'implémenter une gestion des threads qui lie la priorité directement avec le temps d'exécution, ceci dans l'optique de pouvoir 17 gérer des priorités de façon beaucoup plus fine que ce qui est normalement permis avec la gestion préemptive du système d'exploitation. Utilisation des agents Maintenant que nous savons ce qu'est un agent, un SMA et quels sont les pièges à éviter, voyons quelques exemples d’utilisation des agents et systèmes multi-agents dans les deux cadres de leur déploiement : la machine simple et le réseau. Les utilisations sans réseau Ce sont les utilisations les plus courantes actuellement. Les différentes utilisations sont : - Les assistants ( le tristement célèbre Trombine d’office ) - Les jeux (les agents permettent de faire fonctionner les avatars ) - la robotique ( la tondeuse ou la balayeuse automatique ). Les utilisations avec réseau Ce sont les plus prometteuses pour l'avenir. En effet le développement rapide d'Internet a entraîné le développement des agents mobiles, c'est à dire, des agents qui peuvent se déplacer sur le réseau. Les différentes utilisations possibles sont : - la recherche d'information - la surveillance - la distribution d'information - le commerce électronique - le calcul parallèle : une application beaucoup plus informatique des agents est le calcul. Un calcul complexe peut s'exécuter facilement sur plusieurs machines en utilisant des agents. - les jeux 18 Les Outils et Langages (2) « en quelques mots » Jade est un logiciel libre distribué par TILab en Open Source avec une licence LGPL. Jade a pour but de simplifier le développement des systèmes multi-agents tout en fournissant un ensemble complet de services et d'agents conformes aux spécifications FIPA. La plate-forme d'agent de Jade inclut tous les composants obligatoires qui contrôlent un SMA. Ces composants sont l’ACC, l’AMS et le DF. Toute la communication entre agents est exécutée par messages FIPA ACL. La plate-forme d'agent peut être répartie sur plusieurs serveurs. Une seule application Java, et donc une seule machine virtuelle de Java (JVM), est exécutée sur chaque serveur. Chaque JVM est un conteneur d'agents qui fournit un environnement complet pour l'exécution d'agent et permet à plusieurs agents de s'exécuter en parallèle sur le même serveur. L'architecture de communication offre la transmission de messages flexibles et efficaces. JADE crée et contrôle une file d'attente des messages entrants pour chaque agent. Le modèle global de communication FIPA a été mis en application. Ses composants ont été distingués clairement et ont été entièrement intégrés: protocoles d'interaction, ACL, langues, schémas de codage, protocoles de transport... Le mécanisme de transport fonctionne comme un caméléon. Il s'adapte à chaque situation, en choisissant de manière transparente le meilleur protocole disponible. Java RMI*, http, et IIOP sont actuellement employés, mais la plupart des protocoles d'interaction définis par FIPA sont déjà disponibles et peuvent être instanciés. Concrètement, un thread est lancé pour chaque agent, mais ces derniers doivent souvent exécuter des tâches parallèles. Avec la solution du multithreading offerte directement par Java, Jade supporte également la gestion des comportements coopératifs. Le run-time inclut également quelques fonctions complexes prêtes l’emploi pour les tâches les plus communes dans la programmation agent, comme des protocoles d'interaction de FIPA. Jade offre entre autre un certain JessBehaviour qui permet la pleine 19 intégration dans JESS, où Jade fournit le GUI de l'agent et garantit la conformité de FIPA, alors que JESS ( qui est un outil de raisonnement à base de règles) est le moteur qui exécute tout le raisonnement nécessaire. On a donc la possibilité de créer des agents intelligents en délégant le raisonnement à d’autres outils. La plate-forme d'agent fournit une interface graphique utilisateur (GUI) pour la gestion à distance des agents RMA (Remote Management Agent), surveillant le statut des agents, permettant par exemple d’arrêter et de remettre en marche des agents. Le GUI permet également de créer et de lancer un agent sur un serveur à distance, à condition qu’un conteneur d'agent fonctionne déjà. Le GUI permet de commander d'autres plates-formes d'agent à distance. Un GUI du DF ( directory facilitator )peut être lancé du menu outils du RMA. Le DF est un composant qui fait office d’annuaire. C’est un service de « pages jaunes » qui permet de mettre en relations les agents avec leurs compétences. Un agent peut enregistrer ses compétences dans le DF ou interroger le DF pour connaître les compétences proposées par les autres agents. Le GUI permet d’associer ces DF afin de créer plusieurs niveaux de domaines. Le GUI peut accéder de la même manière à n’importe quel DF même situé sur une plate forme distante d’agents non Jade. 20 Il existe dans Jade un certain nombre d'outils graphiques qui soutiennent la phase de correction, habituellement très complexe dans les systèmes répartis. L'agent Dummy est un outil simple et très utile pour visualiser des échanges de messages entre agents. L'agent Dummy facilite la validation d'un agent avant l'intégration dans le SMA et facilite le debugage au cas où un agent échouerait. L'interface graphique fournit un support pour éditer, composer et envoyer des messages ACL aux agents. Elle permet également de recevoir et de regarder des messages des agents, et, par la suite, de sauver ou charger des messages sur le disque dur. L'agent Sniffer permet de suivre des messages échangés dans une plateforme d'agent Jade. Quand l'utilisateur décide de « renifler » un agent, ou un groupe d’agents, chaque message dirigé vers ou venant de cet agent, ou du groupe, est dépisté et montré dans la fenêtre de Sniffer. L'utilisateur peut alors regarder, sauvegarder, charger chaque message pour une analyse postérieure. 21 L'agent Introspector permet de surveiller et de commander le cycle de vie d'un agent courant ainsi que ses messages échangés (provenant de la file d'attente des messages envoyés et reçus). Jade est une marque déposée enregistrée par CSELT et résulte principalement d'une activité de recherches. Il a avec succès passé les tests d'interopérabilité de FIPA à Séoul en janvier 1999 et à Londres avril 2001 et a été intensivement employé dans le cadre de plusieurs projets. Le développement de Jade continue toujours. D'autres améliorations, perfectionnements, et réalisations ont été déjà projetés, la plupart d'entre eux en collaboration avec les utilisateurs intéressés de la communauté de Jade. Ce stage s’intègre pleinement dans ce projet. 22 Les Outils et Langages (3) En résumé ... ... les Java Server Pages permettent de faire des pages web dynamiques en Java. Voilà une description très générale qui pourrait d’ailleurs convenir à des pages php ou asp ... Les applications sont très nombreuses et très utiles. Cela sert par exemple à personnaliser une page web en fonction de l’utilisateur. On peut lui dire « bonjour Francis, il est 8h12, tu es en retard en cette matinée ensoleillée » lorsqu’il arrive sur la page web. La page peut donc reconnaître l’utilisateur, trouver l’heure, constater que cette heure est au matin et qu’elle est supérieure à l’heure habituelle d’arrivée de Francis et enfin consulter la météo du jour sur un serveur distant. Mais si une autre personne se connecte à un autre moment, il va de soit que le contenu de la page sera différent. Les sources de la page telles que peut les récupérer l’utilisateur ( via son explorateur Internet ) seront en simple html ( le langage le plus répandu des pages web ) alors que le programmeur aura produit un mélange de html et de java en respectant une syntaxe adaptée. C’est le serveur qui interprète le code du programmeur pour le transformer en html. Ici on a utilisé le serveur Tomcat. 23 Voici un tout petit exemple qui vous donnera un aperçu de cette technologie : Bonjour.Jsp <html> <body bgcolor= « white »> <% java.util.Date clock = new java.util.Date() ; %> <% if (clock.getHours() < 12) { %> <h1> Bonjour !</h1> <% else if (clock.getHours() < 18) { %> <h1> Bon après-midi !</h1> <% else { %> <h1> Bonsoir !</h1> <% } %> bienvenue sur mon rapport de stage ! </body> </html> Ce petit bout de code très simple contient deux types de lignes. Concrètement, les lignes en gras = Jsp et lignes normales = html. Lorsque l’on lance cette page sur un serveur adapté, aux alentours de 15h00 par exemple, on obtient ceci : Bon après midi ! bienvenue sur mon rapport de stage ! Et si l’on regarde le code source, on obtient : <html> <body bgcolor= « white »> <h1> Bon après-midi !</h1> bienvenue sur mon rapport de stage ! </body> </html> En interprétant le code Jsp, le serveur a donc, en fonction de l’heure, choisi le terme « bon après-midi » et enlever tout le code Jsp. De plus Jsp permet de développer des « balises » personnalisées ce qui permet une séparation fonctionnelle entre les programmeurs et les créateurs de pages. La balise étant cette ligne de code contenu entre les signes « < » et « > ». Par exemple, le créateur veut insérer un carré au milieu de sa page mais il ne sait pas comment programmer cette insertion. Le développeur crée une balise <carré taille= 8 position= « milieu »/> et le créateur n’a plus qu’à l’utiliser très simplement. Tout le code de cette balise est placé sur le serveur et reste transparent pour le créateur. C’est sur cette application des Jsp que s’est déroulé mon stage. Approfondissons un peu 24 Java Server Pages. Moteur de publication dynamique de documents web, créé par Sun. Les documents contiennent du HTML et du Java, ce dernier étant interprété par le serveur. Voici une définition un peu plus technico-technique des Java Server Pages. Tout d’abord, voyons le serveur utilisé pour ce stage : Le serveur tomcat Tomcat (4.0) est une implémentation de référence des spécifications des servlets et des Jsp de SUN (Servlet API 2.3 et Jsp 1.2). Ce serveur est issu du projet Jakarta de l'Apache Software Fundation. Il peut tourner tout seul, bien que ses performances pour l'envoi de pages HTML brutes ne soient pas à la hauteur des serveurs tels qu'Apache ou en complément d'un serveur web traditionnel (IIS, Apache...). Son installation requiert la présence du JDK 1.3 sur la machine. On trouvera une installation de tomcat sur http://jakarta.apache.org/.../jakarta-tomcat-4.0.3.zip Il faudra également l’environnement. effectuer quelques réglages au niveau de pour lancer tomcat: /usr/local/apache/jakarta-tomcat-4.0.3/bin/startup.sh Vous devriez pouvoir vous connecter à: http://localhost:8080/index.html Vous devriez voir s'afficher une page Web. Par défaut, Tomcat s'installe sur le port 8080 au lieu du 80 habituellement. Mais cela ne gêne pas grand monde, pour l'instant ! les fichiers de configuration d'un serveur tomcat : web.xml Configuration des contextes d'applications web server.xml Configuration initiale du serveur 25 Les Jsp plus en détails Les Jsp proposent un langage de script puissant (un langage interprété) exécuté du côté du serveur au même titre que les scripts PHP,ASP,... Les scripts écrits en JavaScript ou les applets Java s'exécutent du coté client via le navigateur. Les Jsp sont intégrables au sein d'une page Web en HTML à l'aide de balises spéciales permettant au serveur Web de savoir que le code compris à l'intérieur de ces balises doit être interprété afin de renvoyer du code HTML au navigateur du client. Le fonctionnement des Java Server Pages Une page utilisant les Java Server Pages est exécutée au moment de la requête par un moteur de Jsp, fonctionnant généralement avec un serveur Web ou un serveur applicatif. Le modèle des Jsp étant dérivé de celui des servlets (en effet les Jsp sont un moyen d'écrire des servlets), celle-ci est donc une classe Java dérivant de la classe HttpServlet, et utilisant les méthodes doGet() et doPost() permettant de renvoyer une réponse par le protocole HTTP. Lorsqu'un utilisateur appelle une page Jsp, le serveur Web appelle le moteur de Jsp qui crée un code source Java à partir du script Jsp, compile la classe afin de fournir un fichier compilé (d'extension .class), c'est-à-dire qu'il constitue en fait une servlet à partir du script Jsp... En réalité ce processus est un peu plus perfectionné: le moteur de Jsp vérifie si la date du fichier.Jsp correspond à celle du fichier.class. Le moteur de Jsp ne transforme et compile uniquement la classe qu’au cas où le script Jsp a été mis à jour. Ainsi, le fait que la compilation ne se fasse que lors de la mise à jour du script Jsp, fait de cette technologies une des plus rapides pour créer des pages dynamiques. En effet, la plupart des technologies de pages actives (ASP, PHP, ...) reposent sur un code interprété, ce qui requiert beaucoup de ressources pour fournir la réponse HTTP. Les Jsp étant compilées (en fait il s'agit d'un bytecode) elles sont beaucoup plus rapides à l'exécution. Actuellement seuls les scripts FastCGI (utilisant du code compilé écrit en langage C) sont plus rapides car ils ne nécessitent pas l'intervention d'une machine virtuelle pour exécuter l'application. 26 Caractéristiques des Java Server Pages Les Jsp permettent donc d'écrire facilement des servlets, en incluant dans des balises spécifiques le code Jsp au sein du fichier HTML. De plus, les Jsp étant basées sur Java côté serveur possèdent toutes les caractéristiques faisant la force de Java: - les Jsp sont multithreadées - les Jsp sont portables - les Jsp sont orientées objet - les Jsp sont sûres A noter que les Jsp intègrent la notion de « session », ce qui permet de simuler un mode connecté. Implantation du code Jsp au sein de la page HTML Un fichier Jsp est un fichier portant l'extension.Jsp, contenant du code HTML ainsi que des balises spécifiques. Les balises <Servlet> permettent d'intégrer une servlet. Les balises de syntaxe Jsp seront décrites par la suite. Séparation entre données et logique applicative Grâce à l'utilisation de balises, Jsp permet d'intégrer facilement du code Java au sein du code HTML. L'intérêt principal de ce mécanisme par rapport aux servlet provient de la séparation entre données (codage HTML de la logique applicative fournie par Java. Jsp doit ainsi être utilisé pour accéder à des composants réutilisables (servlets, JavaBeans, EJB (Enterprise JavaBeans)). Les éléments d'une page Jsp Une page Jsp peut contenir en plus du code HTML cinq types d'éléments : les commentaires Avec Jsp il est possible d’insérer deux types de commentaires : visible dans le code source HTML du client avec la syntaxe suivante : <!-- commentaire [<%= expression %>] --> visible uniquement dans le code Jsp grâce à la syntaxe suivante : <%-- commentaire --> 27 les directives Les directives Jsp fournissent les informations globales relatives à la page. Ce sont des instructions insérées dans des tags HTML spéciaux. La syntaxe des directives Jsp est la suivante : <%@ directive { attribut="valeur"} %> page propose des informations relatives à la page Jsp. ex : <%@ page language="java" import="package.*,contentType=" text/html "%> include permet d'inclure des fichiers dans la page HTML <%@ include file="relativeURL" %> taglib définit une librairie de balises pouvant être utilisée dans la page <%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %> Cette directive permet de créer de nouveaux tags de la forme : <tagPrefix:name attribute="value" ... %> ... </tagPrefix:name%> C’est d’ailleurs ce qui a été fait pour le projet. les déclarations Une déclaration est un bloc permettant de définir des méthodes et des variables de classe à utiliser dans toute la page. La syntaxe d'une déclaration est la suivante : <%! declaration %> Voici un exemple de déclaration : <%! String Chaine = "bonjour"; Int Numero = 10; public void jspInit() { // instructions; } %> les scriptlets Une scriptlet Jsp est un bloc de code Java compris entre les balises suivantes <% /* scriptlet */ %> Le code Java présent entre les balises devient le corps de la méthode _JspService() lors de la génération de la servlet. La scriptlet a implicitement accès à de nombreux objets. les expressions Les expressions Jsp permettent d'insérer simplement des chaînes de caractères générées dynamiquement dans la page HTML. La syntaxe d'une expression Jsp est la suivante : <%= Expression > L'expression suivante permet par exemple de retourner une chaîne contenant l'adresse IP du client : <%= request.getRemoteAddr(); > Il s'agit ainsi d'un raccourci pour la scriptlet suivante : <% out.println(request.getRemoteAddr()); > 28 Les Outils et Langages (4) Les balises ou <taglib> : Très simplement … Rappelons simplement l’exemple du carré vu précédemment. Toto, un créateur de pages web souhaite insérer des carrés de couleurs et de tailles variables dans sa page. Cependant, il ignore tout de la programmation avancée et ne connaît aucune commande html ( un langage très simple pour écrire des pages web ) susceptible de lui fournir un tel dessin. Il demande donc à son collègue programmeur de créer une balise avec les paramètres de taille de position et de couleur. <toto:carré size= « 8 » color= « blue » pos= « middle »/> Cette balise très simple d’utilisation fait appel en réalité à tout un attirail de fonctions et de fichiers et ce de manière totalement transparente pour le créateur. Les balises permettent une séparation entre la représentation des données et leur format réel. Créer une bibliothèque de balises L’objectif du stage proposé par monsieur Leberre était donc de créer une bibliothèque de balises destinée à l’implantation d’agent Jade dans des pages JSP. C’est dans la seconde partie de ce rapport que je développerai donc ce travail, avec les méthodes employées, les difficultés rencontrées et bien entendu le résultat. 29 Le projet Le sujet Développement d'une bibliothèque de balises JSP pour JADE. Responsable : Daniel Le Berre Résumé JADE est une plate forme de développement multi-agents entièrement écrite en Java. Elle permet de faire communiquer des agents situés sur des machines du simple Palm Pilot au gros serveur. Pour plus d'infos sur JADE, voir http://sharon.cselt.it/projects/jade/ Java Server Pages est un environnement de développement de contenu dynamique pour le web (comme php) basé sur Java. Afin de limiter l'utilisation de code Java dans les pages web, il est possible de définir des bibliothèques de balises (taglibs). http://java.sun.com/products/jsp/ http://jakarta.apache.org/taglibs/ De plus en plus d'utilisateurs de JADE incorporent des agents dans leurs sites web écrits en JSP. D'où l'idée de créer une bibliothèque de balises pour manipuler des agents JADE. http://cafe.newcastle.edu.au/daniel/JADEJSP.html Ce stage s'adresse à un étudiant de maîtrise. Il demandera un investissement de l'étudiant dans l'apprentissage de Java Server Pages, de la création de bibliothèques de balises JSP, et de quelques notions de programmation orientée agent à l'aide de JADE. Attention : toute la documentation disponible est en anglais, tout comme le groupe de discussion du projet JADE dans lequel sont discutés les problèmes techniques et les contributions. Le travail de ce stage devrait être intégré dans la plate-forme JADE. 30 Le projet (2) la bibliothèque de balises La construction d’une bibliothèque de balises se déroule en plusieurs étapes et nécessite l’implantation sur notre serveur (ici Tomcat) de plusieurs fichiers. Nous prendrons tout au long de ce chapitre un exemple tiré du stage. Il s’agit en l’occurrence de la balise <jade :container ……> qui permet de créer un container nécessaire à la création d’agent jade. Les fichiers utilisés pour la création des balises sont de deux types. Les classes de gestion de balises et le fichier de description des balises. Les balises peuvent ensuite être utilisés dans des Jsp. Le fichier de description de tags Le fichier de description des balises ( ou tld ou tag library descriptor) est un fichier en langage XML. Il est placé sur le serveur au même endroit que les fichiers statiques et porte l’extension .tld. Le format de ce fichier est par exemple le suivant : <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Jsp Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-Jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <Jspversion>1.1</Jspversion> <shortname>jade</shortname> <uri></uri> <tag> <name>container</name> <tagclass>ContainerTag</tagclass> <bodycontent>EMPTY</bodycontent> <attribute> <name>host</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> …. </tag> </taglib> 31 On déclare dans ce fichier toutes les balises de la bibliothèque et leur paramètres. Ici la bibliothèque jade possède une balise container dont la classe associée est ContainerTag.class et donc l’unique paramètre est host. A noté les informations également portées dans ce fichier. La balise ne contient pas de corps ( bodycontent is empty ). On ne peut donc pas apporter des informations entre deux balises <jade:container> et <\jade:container>. L’argument « host » est obligatoire (required = true). On peut très bien avoir des paramètres facultatif (auquel cas required sera égal à false). Les classes de gestion de balises Les classes utilitaires pour la gestion de balises font partie du paquetage javax.servlet.Jsp.tagext. Elles doivent hériter soit de TagSupport (implantant l'interface Tag), soit de BodyTagSupport (implantant BodyTag). La classe de la balise doit au moins redéfinir la méthode doStartTag(). L'attribut pageContext hérité de la classe TagSupport permet de récupérer un flot vers la page vers la méthode getOut(). Il permet également de récupérer la requête getRequest(), la réponse getResponse(), le contexte getServletContext() et la session getSession(). Voici un exemple un peu élagué du code java de la balise container: package …. import ….. Le package contenant notre classe Tous les packages importés public class ContainerTag extends TagSupport { String id; String host="my_host"; int port=”my_port”; Object beanObject; boolean init = false; String params; public void set…. Tous les paramètres ont leur modificateur public int doStartTag() throws JspException { beanObject = pageContext.getAttribute(id, pageContext.APPLICATION_SCOPE); if (beanObject != null) { if (!Class.forName("jade.wrapper.AgentContainer").isInstance(beanObject)) throw new JspException("ClassCastException: " + id ); } return SKIP_BODY; } synchronized((ServletContext)pageContext.findAttribute(pageContext.APPLICATION)) { beanObject = createBean(); System.out.println(" saving container for id "+id+" "+beanObject); pageContext.setAttribute(id, beanObject,PageContext.APPLICATION_SCOPE); setInit(true); } return SKIP_BODY; } private Object createBean() throws JspException { System.out.println("container jade created"); jade.core.Runtime rt = jade.core.Runtime.instance(); Profile p = new ProfileImpl(host,port,null); return rt.createAgentContainer(p); } } 32 Si la balise n'a pas de contenu, elle doit retourner la valeur SKIP_BODY. Pour utiliser cette « bibliothèque de balises » dans un document Jsp il suffit préciser l'URL où charger le fichier tld et préciser le préfixe à utiliser pour les balises. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <%@ taglib uri="jade.tld" prefix="jade" %> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title> Exemple de Tag</title> </head> <jade:container id=”monconteneur” host="localhost" > <body> <h1>Exemple</h1> it works </body> </html> Ajouter un corps à la balise Pour traiter le corps de la balise il faut tout d'abord que la méthode doStartTag() retourne EVAL_BODY_INCLUDE. Il est ensuite possible de redéfinir la méthode doEndTag() qui pourra effectuer des manipulations après la fin du contenu. Si cette méthode retourne EVAL_PAGE, le reste de la page est évalué, si elle retourne SKIP_PAGE, elle ne traite pas le reste de la page. C’est ce que fait notre balise <jade:sendObject ….. > </jade:sendObject> puisque celle-ci envoie à l’agent passé en paramètre le texte placé entre les deux balises. Le fichier tld doit préciser le contenu de la balise : <bodycontent>Jsp</bodycontent> Manipuler le corps de la balise Afin de manipuler le corps de la balise il faut hériter de la classe BodyTagSupport. Cette classe ajoute les méthodes doAfterBody() et getBodyContent(). La méthode doAfterBody() doit être redéfinie afin de manipuler le corps de la balise. Si cette méthode retourne SKIP_BODY, le corps ne peut plus être manipulé ou si elle retourne EVAL_BODY_TAG le corps est à nouveau évalué. La méthode getBodyContent() retourne un objet de la classe BodyContent qui représente le corps de la balise. Sur cet objet, les méthodes getEnclosingWriter(), getReader(), getString() et clearBody() sont définies. La méthode getEnclosingWriter() retourne l'objet JspWriter associé à la page. La méthode getReader() retourne un objet Reader sur le corps de la balise. La méthode getString() retourne le corps de la balise sous la forme d'une chaîne de caractères. La méthode clearBody() vide le contenu 33 de l'objet de en vue d'une nouvelle évaluation. Le fichier tld ne diffère pas du précédent. 34 Les balises crées Les balises crées dans le cadre de ce stage sont au nombre de trois : - - Tout d’abord et c’est primordial pour la création d’agent Jade, la balise <jade :container …>. Cette balise permet la création d’un conteneur et présente les paramètres suivants : § Id = identifiant du conteneur § Host = hôte du conteneur ( ex « localhost ») § Port = le port utilisé par le conteneur ( ex « 1099 ») Vient ensuite la seconde balise indispensable à la création d’un agent, la balise <jade :useAgent … > qui permet de créer un agent et qui présente les paramètres suivants : § Id = identifiant de l’agent § Classname = nom de la classe java décrivant l’agent § Container = conteneur où évoluera l’agent § Scope = portée de cet agent ( session, application … ) Cet agent étant réutilisable dans le code Jsp de la page, la classe de gestion de cette balise est accompagnée d’une autre classe appelée classeTEI ( pour Tag Extra Info ) qui permet « d’exporter » l’objet ainsi créé à l’intérieur de la page et de pouvoir le manipuler dans le code Jsp. - Enfin, certainement moins vitale que ses deux consœurs mais très utile, la balise <jade :sendObject> qui permet d’envoyer un objet à un agent. Elle possède deux paramètres et utilise le code contenu entre ses deux balises : § Id = identifiant du destinataire § Blocking = le message est-il bloquant ou non ? Tous ces balises sont donc décrites dans des classes java qui ont été compilées et placées dans un fichier.jar. Celui-ci est alors placé dans le répertoire /lib de tomcat. Le répertoire /webapps/ROOT/WEB-INF/ contenant le fichier jade.tld contient la description de ces balises. Enfin les pages Jsp utilisant ces balises sont placées dans le répertoire /webapps/ROOT/ de tomcat. Pour se donner une idée de l’apport fournit par ces balises, voyez plutôt l’exemple suivant. 35 Le projet (3) Un exemple d’utilisation une page Jsp classique <%@ page import="jade.core.*" %> <jsp:useBean id="oldsnooper" class="examples.jsp.Snooper" scope="application"> <% try { // Does not work for the moment // JADE 1.4 String [] args = {"-platform", "buffer:examples.jsp.Buffer"}; String [] args = {"-container"}; jade.Boot.main(args); System.out.println("Jade Inited()"); System.out.println("Start"); oldsnooper.doStart("oldsnooper"); } catch (Exception ex) { out.println(ex); } %> </jsp:useBean> <% oldsnooper.snoop(request.getRemoteHost()+" "+(new java.util.Date())+" "+request.getRequestURI()); %> <HTML> <BODY> It works !!!! </BODY> </HTML> Cette page Jsp contient du code java inséré dans des scriplets ce qui pour un non initié au langage de Sun peut paraître assez barbare. De plus la syntaxe y est quelque peu complexe et doit être réécrite à chaque utilisation d’un agent. Cette page crée donc un container, y insère un agent, et lui envoie le nom de l’hôte ainsi que la date et l’heure de l’envoi. De plus tout fonctionne correctement lorsque l’on considère uniquement un agent de portée « application ». On rencontre divers problèmes lorsque l’on veut en créer un de portée « session », « page » ou « requête ». 36 son équivalent avec nos balises <%@ taglib uri="/WEB-INF/jade.tld" prefix="jade" %> <jade:container id="moncontainer" host="heron" port="1099"/> <jade:useAgent id="snooper" classname="examples.jsp.Snooper" container="moncontainer" scope="application"/> <jade:sendObject id="snooper" blocking="false"> <%= request.getRemoteHost()+" "+(new java.util.Date())+" "+request.getRequestURI()+" METHOD2" %> </jade:sendObject> <HTML> <BODY> It works !!!!<br> Messages sent. <br> <%=snooper%> </BODY> </HTML> La différence est à mon sens flagrante. D’une part, le code est beaucoup plus léger et plus compréhensible. Nul besoin d’être un programmeur averti pour insérer le conteneur. Il suffit juste de lui donner un nom, un hôte et un port, éléments qui tiennent plus de la technique que de la programmation. Il faut simplement connaître la classe de l’agent pour le créer. Enfin, l’envoi de messages est trivialisé d’autant que le paramètre blocking est facultatif. Il suffit juste de donner le nom de l’agent ( à condition bien entendu qu’il soit dans le conteneur ) et de passer le message entre les deux balises de sendObject. Malheureusement, nous ne sommes pas parvenu à faire passer des objets dans sendObject mais uniquement des chaînes de caractères. Mail nul doute que par la suite, cette balise sera améliorée afin de répondre à la demande initiale. 37 Expériences acquises lors du stage Un projet basé sur différentes technologies Ce projet a présenté quelques difficultés notamment au niveau de la grande variété de technologies employées. Par technologie, j’entends les différents langages utilisés ( java, html, XML, Jsp ), mais également les différents supports logiciels ( netbeans dans un premier temps, tomcat , jade). La multiplicité des langages et des supports Ce projet a nécessité l’utilisation de plusieurs langages ce qui présente la grande difficulté de brouiller les piste lors d’éventuel débugage. La quantité de paramètres susceptibles d’être modifiés est du coup très importante. Or s’il existe une multitude de spécialistes en java, en XML, en html ( mais ça ce n’est pas trop grave ) en jsp, mais il y a pas ou très peu en ce qui concerne le mélange de tout ça, à savoir, les taglibs (à part peut être aujourd’hui un certain monsieur Le Berre et son stagiaire). Il est donc ardu de trouver une solution à certains problèmes alors qu’on ne sait même pas où se trouve l’erreur : configuration de tomcat, erreur dans le code java, erreur dans le fichier tld … Je fus d’ailleurs parfois amené à prendre des décisions hasardeuses qui finalement aggravaient la situation. D’autant que la documentation est parfois difficile à interpréter pour un non spécialiste, voir pour ce qui est des documents en anglais, intraduisible. Après ces erreurs, et surtout après ce stage, je pense qu’il est de toute façon impossible de maîtriser totalement tous les paramètres avant de se lancer dans un tel projet. Par contre, je pense qu’il ne faut pas avoir peur de poser des questions à son entourage (informatique) et que même les questions les plus simples peuvent parfois apporter des solutions insoupçonnées. J’ai préféré au début du stage m’isoler pour mieux chercher et je ne doute plus maintenant qu’il faut s’entourer pour mieux isoler le problème. 38 Expériences acquises lors du stage (2) Les exemples plutôt que la théorie Utilisation de l’existant En se lançant dans ce projet, j’ai découvert l’existence de bibliothèques de balises en open source dans le projet jakarta. Ces jakarta taglibs m’ont notamment de support pour la compréhension du fonctionnement des taglibs en général. Le langage Jsp comprend déjà des balises toutes faites et c’est en observant le fonctionnement de la balise <jsp :useBean …> que nous avons chercher à développer la balise <jade :useAgent …> . Cependant le code de cette balise n’étant pas disponible ( open source ) nous nous sommes reporté sur lle projet Jakarta qui implémentait sa propre balise <Jlib :useBean …>. Et c’est principalement à partir de celle-ci que fut donc développée la balise <jade :useAgent …> première brique de notre bibliothèque. Malheureusement, le code source de cette balise était « buggué » et nous a beaucoup gêné dans notre travail. Ensuite les deux autres balises <jade :container …> <jade :sendObject …> s’inspirèrent de la structure de la première bien que des différences notables furent rencontrées dans ces deux travaux. Je pense qu’il est intéressant de noter que la première balise a pris beaucoup plus de temps à être implémentée que la dernière. En effet, toute la problématique de ce projet ne résidait pas dans la quantité de code à fournir mais plutôt dans sa qualité. Danger du préfabriqué L’utilisation de l’existant est une démarche qui présente de grands avantages ne serait que par l’expérience apportée par un projet réalisé. Le fait d’avoir un exemple qui fonctionne permet de modifier petit à petit celui ci et d’analyser ainsi le comportement de divers paramètres. Cependant, cette méthode présente également des désagréments et demande une certaine retenue pour ne pas tomber dans des pièges « indébuggables ». Le problème de la version peut parfois être fatal à qui s’aventure aveuglément. En effet il existe plusieurs qualificatifs pour les versions de code disponibles en open source : de release à nightly, on 39 passe de la version « garantie sans failles » ou presque à la version « garantie pleine de failles » ou presque. Ignorer ce paramètre lorsque l’on utilise du code open source revient à prendre un maximum de risque inutiles. Nous avons été amenés notamment pour ce qui concerne les Jakarta taglibs à utiliser une version nightly qui s’est avérée presque fiable (mais pas totalement malheureusement ce qui a occasionné quelques problèmes de débuggage). De plus lorsque l’on utilise l’existant, sauf cas exceptionnel, on se base sur des cas légèrement différents. Certains paramètres sont volontairement ignorés car inutiles pour le cas traité alors que nous en avons besoin pour notre cas précis. Ou certaines mesures implicites pour le programmeur du modèle utilisée n’apparaissent pas clairement dans la démarche et passe ainsi à la trappe dans notre analyse. Ce fut par exemple le cas des TEIclasses, permettant de réutiliser l’objet créé dans les balises, dans le code Jsp de la page. Ce ne fut que tardivement que je compris l’utilité de celles-ci alors que je les avaient aperçues depuis le début sans en saisir le fonctionnement. Le but de ce stage étant de créer des briques réutilisables pour l’univers de Jade, j’espère que les utilisateurs sauront tirer profit de ces quelques balises. Et surtout j’espère que d’autres balises seront créées afin de développer cette bibliothèque open source. 40 Expériences acquises lors du stage(3) Un Projet Open Source Qui à la fac n’a jamais entendu parler de projet Open Source ? En tout cas, qui a eu l’occasion d’aller dans les cours de Mr Le Berre ou de certain de ses collègues ne pourra nier l’existence du concept. L’open Source est un système de gestion de droit qui permet de partager les sources de ses programmes avec toute sorte d’utilisateurs. L’intérêt majeur, et c’est sans doute celui que recherche Jade, est d’avoir accès à une communauté de programmeurs gigantesque. Ainsi, chacun peut apporter sa pierre à l’édifice d’un projet open source sans pour autant être proche des initiateurs du projet. Un problème de licence La gestion des droits d’un programme se fait par le biais du système des licences. Dans le cadre de l’open source, la licence la plus connue est la licence GNU/GPL, mais il existe une autre licence : la licence GNU/LGPL. Cette licence a été introduite pour adoucir certaines conditions de la licence GNU/GPL qui s'avéraient trop restrictives dans certains cas. La licence GNU/LGPL permet en effet de rendre libre une bibliothèque de logiciels sans obliger l'auteur de programmes utilisant cette bibliothèque à rendre également libre son programme. La licence GNU/LGPL supprime l'effet de « contamination » de la licence GNU/GPL. Licence Publique Générale GNU Limitée Les licences d'utilisation de la plupart des programmes sont définies pour limiter ou supprimer toute liberté à l'utilisateur. À l'inverse, les Licences Publiques Générales GNU (GNU General Public Licenses) sont destinées à garantir la liberté de partager et de modifier les logiciels libres, et de s'assurer que ces logiciels sont effectivement accessibles à tout utilisateur. 41 Cette licence, la Licence Publique Générale Limitée, s'applique à certains programmes de la Free Software Foundation, typiquement les bibliothèques, comme à tout autre programme dont l'auteur l'aura décidé. Liberté des logiciels ne signifie pas nécessairement gratuité. Les Licences Publiques Générales sont conçues pour assurer la liberté de distribuer des copies des programmes, gratuitement ou non, de recevoir le code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en utiliser des éléments dans de nouveaux programmes libres, en sachant que vous y êtes autorisé. La bibliothèque de balises créée lors de ce projet est désormais sous licence LGPL. Elle participe au projet Jade et doit être insérée dans la nouvelle version de Jade 2.6 ( juin 2002 )… 42 Conclusion Ce projet fut pour moi très enrichissant tant au point de vue des connaissances informatiques, qu’au point de vue de la méthode de travail et qu’au point de vue humain. La première partie de ce rapport démontre clairement l’étendue des domaines de connaissance parcourus. C’est aussi une révélation flagrante de tout ce qui reste à parcourir. Et c’est à mon sens une motivation supplémentaire pour poursuivre des études supérieures. Quant aux méthodes de travail utilisées, elles furent tantôt chaotiques, tantôt efficaces, tantôt laborieuses et tantôt dynamisantes. Je crois que le fait de m’être parfois égaré m’a permis d’apprécier d’autant plus les instants de trouvailles ou de réussites. En tout cas je ne travaillerai plus de la même manière sur un tel projet. L’aspect humain reste cependant une des principales leçons que je retiendrais de ce stage. Sans l’apport considérable de Mr Daniel Le Berre et par son intermédiaire de Mr Fabio Bellifemine (Jade), je pense que je ne serai jamais parvenu à mener ce projet à termes. Aussi je les en remercie et je suis très heureux d’avoir grâce à eux participé à mon premier projet Open Source. 43 Annexe technique Glossaire ACL Agent Communication Langage : Langage de communication qui combine habilement KQML et KIF. KQML est pris pour la partie administrative et KIF pour la représentation des données et/ou expressions à évaluer. API Application Programming Interface : Bibliothèques d'objets (dans le cas de langages objets) qui permettent au programmeur d'utiliser directement des objets. L'API réseau du Java permet d'ouvrir des sockets, mais aussi de gérer les adresses IP ainsi que les URL. CORBA Common Object Request Brocker Architecture : Une architecture définie par l'OMG qui permet l'implémentation d'objets distribués. Ces objets sont accessibles par l'intermédiaire de nombreux langages grâce à la définition d'IDL. Framework Ensemble d'outils (de conception, d'exécution, de dégage) qui permettent de faire quelque chose, par exemple de mettre en œuvre d'autres programmes. Ces outils peuvent êtres des programmes, des méthodes de travail, des librairie, etc. IDL Interface Definition Language : Un langage qui permet de définir les objets CORBA. Une Interface IDL déclare les opération, exceptions et attributs. IDL ne permet pas d'implémenter les objets, comme son nom l'indique, il ne fait que définir les interfaces des objets. Java / JDK Java, langage créé en 1995 par Sun, ce langage est orienté objet et présente le gros avantage d'être portable. JDK (Java Développement Kit) est le kit de développement Java fournis par Sun pour le développement de programmes Java. KIF 44 Knowledge Interchange Format : Langage qui permet de coder des expressions, algorithmes ou données dans le plus pur style Lisp : 3+5 deviens (+ 3 5) KQML Knowledge Query Modeling Langage, ce langage est le standard de fait pour l'échange d'information entre les agents. (Pour s'en persuader, il suffit de regarder la liste des produits déjà existants). MOM Message Oriented Middleware : Middleware orienté message, c'est un middleware qui contrairement à CORBA ou RMI ne permet pas l'appel de méthodes à distances, mais seulement l'échange de messages. Un MOM peut aussi contenir des services. ORB Object Request Broquer : Les librairies, processus et autres infrastructures qui permettent, dans un environnement distribué CORBA, aux objets de communiquer entre eux. L'ORB permet aux objets qui demandent des services d'entrer en contact avec les objets qui fournissent ces services. OSI Open System Interconnection : Le modèle OSI est composée de 7 niveaux. Ces niveaux sont organisés de manière hiérarchiques. Les niveaux sont définis de telle sorte qu'une modification dans un niveau ne nécessite pas de modification dans les autres niveaux. Proxy Objet et/ou programme qui permet d'accéder à des ressources qui ne sont pas accessibles directement, c'est donc un intermédiaire. L'utilisation d'un proxy est en général de protéger la ressource à laquelle on veut accéder. RMI Remote Method Invocation est une technique qui permet à des objets Java de se servir d'objets Java distants comme s'il s'agissait d'objet local. L'équivalent en C/C++ est RPC (Remote Procedure Call). CORBA fournis les mêmes fonctionnalité, mais présente l'avantage de ne pas être réduit à un seul langage. 45 Socket Objet qui permet de communiquer sur un réseau de type TCP/IP. La création d'une socket nécessite un serveur sur lequel on se connecte et un client qui se connecte à se serveur. Les deux peuvent ensuite communiquer, c'est à dire, envoyer et recevoir des suites d'octets. La définition d'un protocole de communication est donc indispensable. Thread Programme qui s'exécute à l'intérieur d'un autre programme : ceci permet à un programme de faire plusieurs choses en même temps. Un thread est parfois appelé tâche. UDP User Datagram Protocol : Protocole en dessous de TCP/IP sur le modèle OSI. Ce protocole ne garantie pas l'arrivée des données (datagrams), ni leur ordre d'arrivée. FIPA est une organisation à but non lucratif produisant des normes pour l'inter opérabilité des agents hétérogènes de logiciel. www.fipa.org