I. Introduction

Je vous présente, dans cette série de quatre tutoriels, un petit cours sur le Framework Avalon, un framework de développement de composants serveurs pour développement en Java. Avant de présenter le framework lui-même, je présente quelques-uns des concepts de l'architecture logicielle sous la forme d'une rapide FAQ Architecture Objet. Attention, cette série de tutoriels forme un cours théorique sur les concepts objets utilisés dans Avalon et non une description complète sur l'utilisation du framework. Pour me motiver à me lancer dans un descriptif plus complet, n'hésitez pas à me contacter, si de nombreux membres de la communauté developpez.com font preuve d'un véritable intérêt pour Avalon, je partirai dans un cours plus technique sur l'utilisation d'Avalon.

II. Généralités

II-A. Qu'est-ce qu'un framework ?

Puisqu'on va se concentrer sur la présentation d'un framework, que le terme est un anglicisme et que ce n'est pas nécessairement une notion comprise de tous, je vous fournis une définition de ce terme tel qu'il est en général compris par nos collègues , qu'ils soient développeurs, décideurs, architectes… Je reprends la définition rapide que je vous avais donnée à l'occasion de l'article sur les frameworks de tests et particulièrement sur la série JUnit, DUnit, NUnit, etc. :

Un framework est une infrastructure logicielle qui facilite la conception des applications par l'utilisation de bibliothèques de classes ou de générateurs de programmes, soit dit en quelques mots : un cadre de développement.

Voyons un peu plus en détail de quoi il s'agit, et commençons par citer quelques frameworks, rien de tel que quelques exemples pour comprendre une notion :

  • Struts est un framework Java d'interfaçage homme/machine pour applications web ;
  • SWING est un framework Java d'interfaçage homme/machine pour une application fenêtrée ;
  • les MFC sont un framework C++ d'interfaçage d'une application avec le système d'exploitation Windows ;
  • la GTK est un framework C d'interfaçage homme/machine avec une application fenêtrée, conçu à l'origine pour les systèmes UNIX et porté sur Windows ;
  • OJB est un framework Java de mapping objet/relationnel gérant la persistance d'objets dans un SGBD ;

Il apparaît qu'il existe des frameworks de divers types, et que ceux-ci peuvent être complémentaires. Les frameworks présentés ci-dessus ne sont pour autant pas suffisants pour permettre de développer une application complète. Pour ce faire, il faut alors fabriquer un framework plus complet. Ce sera en général un assemblage de divers frameworks complémentaires qui fourniront ensemble, le cadre de développement de vos applications.

Maintenant que nous avons réussi à nous faire une idée sur la notion, il devient possible de la formaliser un peu : un framework réunit l'ensemble des implémentations récurrentes de nos développements. Les avantages en sont :

  • éviter de recoder encore et toujours les mêmes bouts de code, qui sont d'ailleurs généralement rébarbatifs ;
  • agir en un point unique pour modifier l'ensemble du comportement applicatif (par exemple le "look and feel") faisant profiter toutes les applications des avancées du framework ;
  • assurer la robustesse de ces parties du code qui, puisqu'elles sont répétitives, sont essentielles.

II-B. Qu'est-ce qu'une API ?

Une API est un point de jonction entre un logiciel et l'extérieur de celui-ci. C'est un peu la partie public d'un programme complet. Ainsi l'API JDBC est le point de jonction entre Java et les SGBD, Sun y a défini la manière d'accéder à une base de données depuis Java et les divers éditeurs de SGBD ont étendu le langage Java grâce à cette API pour permettre aux développeurs d'accéder à leurs bases de données. De la même manière, les éditeurs d'EDI proposent toujours une API qui permet à des développeurs indépendants de fournir des modules d'extension. On retiendra donc que l'API est un module d'accès à un logiciel qui définit l'interface (au sens purement objet du terme) d'extension de celui-ci.

Mais alors SAX et DOM ne rentrent pas dans cette définition, pourtant on parle bien d'API ? Si, SAX et DOM sont des API de très haut niveau qui régissent l'accès à une information formatée en XML. Il existe diverses implémentations de ces API dans tous les langages, qu'ils soient Objet ou qu'ils ne le soient pas. Java connait plusieurs implémentations, C et C++ aussi, etc.

II-C. Qu'est-ce qu'un composant ?

Un composant est le couple formé d'une interface définissant la structure objet nécessaire à la réalisation d'un travail et de son implémentation. Ceci est certes un peu abstrait, reprenons donc une description qui part de l'élément le plus atomique de vos langages, et remontons rapidement jusqu'au composant. De manière atomique, en UML nous disposons sur le diagramme de classes, d'attributs, de méthodes, de relations. L'attribut représente un état, la méthode définit une dynamique et les relations indiquent la syntaxe (l'articulation). Pour réunir ces divers éléments atomiques, nous disposons de classes d'interfaces, de packages. Pour lier ensemble des classes ayant des comportements agissant dans le même sens, nous réunissons donc diverses classes, interfaces, etc. au sein de composants. Les divers composants communiqueront d'ailleurs par le biais d'une façade.

II-D. Qu'est-ce que le cycle de vie ?

Le cycle de vie d'un objet est évidemment la gestion de sa naissance, de sa vie et de sa mort. Mais c'est aussi beaucoup plus que ça, la naissance par exemple d'un objet est toujours subordonnée à l'apparition d'un événement (au sens large). À sa naissance, il peut aussi se produire un ensemble de choses comme son initialisation, la récupération de l'état dans lequel il se trouvait avant de mourir la dernière fois (persistance). Il en est évidemment de même au moment de sa mort, il peut nécessiter de rendre son état persistant, de fermer des connexions réseau ouvertes, etc. Enfin l'objet peut avoir besoin de se reconfigurer à tout moment (prenez l'exemple d'un fichier de configuration web.xml s'il est modifié, le serveur web se reconfigure pour prendre en compte les nouvelles données). Le cycle de vie d'un objet ou d'un composant est donc l'ensemble des métaétats, relatifs à son existence, qu'il peut prendre et des transitions qui lui permettent de passer d'un état à l'autre. Parmi les métaétats de vitalité de l'objet nous pouvons citer rapidement : configuré, initialisé, vivant, mort…

II-E. Qu'est-ce que le développement en couches ?

Tout le monde a au moins entendu parler des couches du protocole TCP IP qui régit tous nos échanges sur internet. Le principe est assez simple, mais très efficace, sept couches ont été définies pour le protocole, des couches les plus basses, c'est-à-dire physiques, aux couches les plus hautes comme le SMTP qui achemine nos e-mails. Ce concept permet d'utiliser un câble coaxial, un réseau WIFI, de la fibre optique (couche la plus basse) en ne modifiant que cette couche. Le même logiciel de transport de mails est utilisable sur tous ces supports sans la moindre modification.

Ce concept peut être appliqué à tous nos développements, et on cherche aujourd'hui à séparer ceux-ci en diverses couches afin d'être indépendants de chaque implémentation de ces couches. Un logiciel développé sur quatre couches : SGBD/Mapping/métier/affichage aura l'avantage de permettre de changer tant le SGBD que le choix d'affichage (WEB ou fenêtré, etc.) sans pour autant redévelopper intégralement celui-ci.

Pour que ce concept soit réellement puissant, il est important de suivre le principe suivant : une couche a accès à la couche immédiatement inférieure et uniquement celle-ci par le biais d'une interface stable. Ceci lève trois points importants : le sens des dépendances est toujours du haut vers le bas (une couche ne connait absolument rien des couches supérieures), la dépendance aux couches inférieures est strictement limitée à celle directement inférieure. L'interface de discussion entre couches doit être stable, elle doit quasiment être définitive et doit donc faire l'objet d'une attention particulière au moment de l'analyse de l'architecture logicielle.

III. Présentation d'Avalon

III-A. Qu'est-ce qu'Avalon ?

Un petit historique s'impose pour vous parler d'Avalon par respect et pour remercier les auteurs de cet outil et de la réflexion qui l'entoure. À l'origine d'Avalon, se trouve Apache JServ, un serveur de servlets duquel un certain nombre de patterns ayant servi à son développement sont apparus suffisamment génériques pour construire un framework d'application serveur. À l'origine de ce projet, se trouve donc Stefano Mozzocchi, Fedirico Barnieri et Pierpaolo Fumagalli. Vous trouverez les informations originales sur ce framework sur le site d'Apache : avalon.apache.org

J'ai déjà un peu dévoilé ce que contient Avalon en vous annonçant que c'est un framework. C'est en fait plus qu'un framework, c'est le père d'un ensemble de cinq sous-projets : le framework lui-même, Excalibur, LogKit, Phoenix et Cornerstone. La partie qui nous intéressera dans cette série d'articles est évidemment le framework et surtout les idées qui ont permis de mettre en place celui-ci. Que vous décidiez d'utiliser le framework ou que vous partiez sur d'autres frameworks ne vous empêchera pas de garder en tête les excellentes réflexions sous-jacentes à son développement.

III-B. Le cœur ou le framework

Quand on entend parler d'Avalon, c'est souvent à ce cœur que l'on pense, il contient un ensemble de patterns à même de transformer fondamentalement notre manière de concevoir une application (au moins pour les applications serveur). C'est cette partie d'Avalon que je vous propose de découvrir dans ce cours qui se présentera sous la forme d'une série de tutoriels.

III-C. Excalibur

Excalibur regroupe un ensemble de composants déployables côté serveur parmi lesquels on trouvera des pools d'objets, la gestion de connexion base de données et la gestion d'implémentations de composants.

III-D. Logkit

Un ensemble d'outils de log compatible JDK 1.2 basé sur les mêmes concepts que Log4J ou le package logging inclus dans le JDK 1,4.

III-E. Phoenix

Phoenix est le noyau de gestion du déploiement et de l'exécution de services.

III-F. Cornerstone

Cornerstone quant à lui implémente une collection de services déployables dans Phoenix. On y trouve en particulier la gestion de sockets, un timeScheduler, un service de publication de services à distance via SOAP, un SAX Factory, un système de persistance d'objets transparents, etc.