Exercice 1
But: tester l'installation.
- Lancer Comanche avec ant.
- Le message "Comanche HTTP Server ready on port 8080."
doit s'afficher.
- Ouvrir un navigateur et tapez l'URL "http://localhost:8080/index.html".
- Une page "Welcome in Comanche!" doit s'afficher.
Exercice 2
But: se familiariser avec l'API Fractal pour la configuration.
- Compléter le code de Comanche.java pour créer cette
configuration.
- Tester en cherchant n'importe quelle URL "http://localhost:8080/..."
dans un navigateur: la page "Comanche: document not found" doit
s'afficher, ainsi
qu'une trace "GET..."
- Compléter LoggerAttributes et ConfigurableLogger pour
implanter
un composant Logger avec un attribut "header" permettant d'afficher
un préfixe en tête de chaque ligne.
- Modifier le code de Comanche.java pour créer un
ConfigurableLogger
au lieu d'un BasicLogger, et pour initialiser l'attribut "header" via
l'interface AttributeController du composant.
- Tester cette modification de la même façon que
précédemment:
les traces affichées doivent commencer par le préfixe
choisi.
Exercice 3
But: se familiariser avec l'ADL Fractal.
- Compléter LoggerAttributes et ConfigurableLogger pour
implanter
un composant Logger avec un attribut "header" permettant d'afficher
un préfixe en tête de chaque ligne (reprendre le code de
l'exercice précédent).
- Compléter les définitions dans src/comanche.fractal
pour créer cette configuration,
avec un composant ConfigurableLogger dont l'attribut "header" sera
initialisé
via l'ADL.
- Tester en cherchant n'importe quelle URL "http://localhost:8080/..."
dans un navigateur: la page "Comanche: document not found" doit
s'afficher, ainsi
qu'une trace "... GET..." commencant par le préfixe choisi dans
l'ADL.
Exercice 4
But: utiliser l'héritage de définitions ADL, se
familiariser avec les fichiers
de configuration de Julia.
- Compléter le fichier comanche.fractal afin de changer
l'implantation du
composant "logger" du sous composant "back-end" en "StackTraceLogger".
- ajouter ",src/julia.cfg" après "../externals/julia.cfg"
dans le fichier build.xml,
afin d'ajouter le fichier de configuration "src/julia.cfg" dans la
liste des fichiers
de configuration de Julia. Ce fichier additionel permet de
redéfinir les définitions
données dans le premier fichier (les fichiers de configuration
sont lus dans l'ordre
indiqué; et si une définition est définie
plusieurs fois, la dernière valeur lue
surcharge les valeurs précédentes).
- dans src/julia.cfg, ajouter
"org.objectweb.fractal.julia.asm.TraceCodeGenerator" juste
après "...LifeCycleCodeGenerator": ceci a pour effet de tracer
tous les appels entrants
sur les composants primitifs. Lancer Comanche avec ou sans cette ligne
pour le
constater.
- recopier la section "interceptors" de "primitive" dans
"composite", sans la ligne
"...LifeCycleCodeGenerator": ceci a pour effet de tracer tous les
appels entrants
sur les composants composites. Lancer Comanche avec ou sans cette ligne
pour le
constater.
- Indiquer, dans les quatre cas précédents, et pour
chaque ligne "Entering...",
ou "Leaving...", le composant qui affiche cette ligne. [Bonus: Pourquoi
la pile d'appels
de méthode affichée par le composant Logger
contient-elle, selon les cas, 1 ou 2
lignes "...Interceptor[RequestHandler])"?]
Exercice 5
But: développer un contrôleur Fractal, configurer Julia,
déclarer un contrôleur
de composant spécifique via l'ADL.
- Implanter la classe de contrôleur
ConcurrencyControllerImpl, dont le but est
de limiter le nombre de threads pouvant accéder
simultanément à un composant.
- Compléter le fichier src/julia.cfg pour ajouter
l'interface de contrôle, ainsi que la
classe et le générateur de code d'interception
correspondants.
- Compléter la définition de Comanche5 dans le
fichier comanche.fractal
afin de changer le contrôleur du composant "back-end" de
"composite" à
"concurrencyComposite".
Exercice 6
But: déclarer un composant partagé via l'ADL, implanter
un composant avec
dépendences, préparer l'exercice 8.
- Compléter le fichier comanche.fractal, en utilisant au
maximum l'héritage,
afin de créer cette configuration,
où le composant fractal-handler appartient à la fois au
composite principal
et au composant handler. L'interface cliente "model" de ce composant
doit être
de type org.objectweb.fractal.api.Component, et liée à
l'interface "component"
du sous composant "comanche".
- Compléter la classe FractalHandler qui est la classe
d'implantation du
composant fractal-handler. Ce composant doit, pour toute requête
dont l'URL
commence par "fractal/", retourner une page HTML contenant le nom du
composant
Fractal auquel son interface cliente "model" est liée.
Exercice 7
But: utiliser l'API Fractal pour faire de l'introspection et de la
reconfiguration dynamique, préparer l'exercice 8 et
découvrir Fractal RMI.
- compléter la méthode getComponent de
Configurator.java. Cette méthode
doit retourner un sous composant en fonction de son chemin
d'accès "name"
depuis le composant "c".
- compléter la méthode replaceComponent de
Configurator.java.
- tester la reconfiguration dynamique en lancant Comanche avec
"ant" puis,
dans un nouveau shell, en lancant "ant reconfigure". Les traces et la
page
affichée en cas d'erreur doivent changer après cette
reconfiguration
dynamique.
Exercice 8
But: concevoir et implanter une application à base de
composants.
L'exercice consiste à implanter un composant composite
fractal-handler,
qui devra s'insérer dans Comanche au même endroit
qu'à l'exercice 6. Ce
composant devra reconnaitre les URLs de la forme suivante:
- fractal/overview.html: pour cette URL, le composant
devra
retourner une page similaire à celle-ci,
qui sera construite à partir de l'introspection récursive
du composant lié à
l'interface cliente "model" (cf exercice 6).
- fractal/xxx/.../zzz/index.html: pour les URLs de cette
forme,
le composant devra retourner un page d'information sur le composant
xxx/.../zzz, de la forme suivante
pour un composant composite, ou de la forme
suivante
pour un composant primitif.
- fractal/index.html: pour cette URL, le composant devra
retourner une page
composées de deux
frames, pointant sur les pages précedentes.
- fractal/xxx/.../zzz/replace?class=...: pour cette URL,
qui résulte
d'un clic sur le bouton Change des pages de ce
type,
le composant devra retourner une page de confirmation ou d'erreur, et
devra
remplacer dynamiquement le composant xxx/.../zzz par un composant de la
classe
indiquée (pour cela, reprendre le code de l'exercice 7, sans
Fractal RMI).
L'architecture utilisée devra être telle qu'on puisse
changer l'apparence des
différents types de page indépendamment les uns des
autres, simplement en
remplaçant un ou plusieurs composants. Il devra également
être possible, en
supprimant certains composants, de désactiver les fonctions 1, 3
et 4.