Cilia/Workshop/TP4

From Wiki Adele Team
Jump to: navigation, search


Page Is Unavailable Due To Site Maintenance, Please Visit Reserve Copy Page


CLICK HERE


Objectif du TP

L'objectif de ce TP est d'enrichir la bibliothèque Cilia en développant un nouveau dispatcher.

Description de l'application

L'application demande à l'utilisateur de saisir des nombres. Ces nombres sont transmis à un premier médiateur qui réalise un filtrage : seuls les nombres positifs sont conservés. A l'issue de ce filtrage, les nombres pairs sont envoyés à un médiateur qui transforme les nombres en mots anglais, tandis que les nombres impairs sont envoyés à un médiateur qui transforme les nombres en mots français. Nous allons créer une chaîne de médiation constituée de ce médiateur avec les connexions suivantes :

  • En entrée, Un médiateur de filtrage est connecté à une console graphique qui assure la saisie du texte d'entrée.
  • Le médiateur de filtrage est connecté a deux médiateurs, un qui transforme le nombre en anglais et l'autre qui les transforme en français.
  • En sortie, les deux médiateurs qui transforment les données sont connectées à une console textuelle qui affiche le résultat du traitement..

ConverterMediator.png

Créer un projet Maven

Download.png Télécharger le projet de ce TP (y comprend la passerelle) : TP4-project


Développer le code d'un médiateur

On demande de développer un médiateur dont le processor réalise le filtrage des nombres et dont le dispatcher route les nombres en fonction de leur parité : un nombre pair est envoyé sur le port "even", un nombre impair est envoyé sur le port "odd".

Processor

Le code de notre processor est dans le fichier: "/src/main/java/cilia/examples/mediator/filter/NumberFilter.java" <source lang="java"> package cilia.examples.mediator.filter; import fr.liglab.adele.cilia.Data; public class NumberFilter {

   public Data process (Data data) {
       String content = (String)data.getContent();
       Long number = null;
       try {
           number = Long.decode(content);
       } catch (Exception ex) {
           number = Long.valueOf(-1);
       }
       if (number.longValue() < 0) {
           System.out.println("Filtering number: " + content + " not valid");
           return null;
       }
       return data;
   }

} </source>

Dispatcher

Le dispatcher à développer fait partie du premier médiateur de filtrage. Toutes les données reçues par le dispatcher sont déjà filtrées.

Pour réaliser un dispatcher, il faut créer une classe en étendant la classe abstraite AbstractDispatcher avec ces trois méthodes : configureProperties(), dispatch() et getName().

NAME INPUT PARAMS OUTPUT PARAMS DESCRIPTION
configureProperties Dictionary props void Configure dispatcher component properties.
dispatch List void Called when the Processor part is done. In this method, dispatcher decisions are made.
getName () String The dispatcher name.

! getName doit correspondre à handler name!


On crée un nouvelle classe Java NumberDispatcher qui étend AbstractDispatcher. Ensuite, on place cette classe dans le package cilia.examples.handler.dispatcher <source lang="java"> package cilia.examples.handler.dispatcher; ... public class NumberDispatcher extends AbstractDispatcher {

   public void configureProperties(Dictionary properties)
           throws CiliaException {
   }
   public void dispatch(List dataset) throws CiliaException {
   }
   public String getName() {
       return null;
   }

} </source>

Les seules méthodes à modifier sont: getName et dispatch: <source lang="java">

   //Method called when the mediator has finished processing the data.
   public void dispatch(List dataset) throws CiliaException {
       for (int i = 0; i < dataset.size(); i++) {
           Data data = (Data)dataset.get(i);
           String content = (String)data.getContent();
           long number = Long.parseLong(content);
           if (number % 2 == 0) {
               send("odd", data);
           } else {
               send("even", data);
           }
       }
   }
   //Dispatcher handler name.
   public String getName() {
     return "odd-even-dispatcher";
   }

</source>

Spécifier un dispatcher et un médiateur

Exemple de spécification en iPOJO étendu pour la médiation

La spécification du médiateur de filtrage est réalisée en utilisant le metadata d'iPOJO. Le fichier /src/main/resources/metadata.xml contient une spécification de dispatcher et de médiateur : <source lang="xml"> <ipojo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance%22

       xsi:schemaLocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/CURRENT/core.xsd%22
       xmlns="org.apache.felix.ipojo" xmlns:cilia="fr.liglab.adele.cilia">
       <!-- Description de dispatcher -->
       <handler classname="cilia.examples.handler.dispatcher.NumberDispatcher"
               name="odd-even-dispatcher" namespace="fr.liglab.adele.cilia">
       </handler>
       <!-- Description du médiateur qui utilise notre nouveau dispatcher.-->
       <component classname="cilia.examples.mediator.filter.NumberFilter"
               name="NumberFilterMediator">
               <cilia:immediate-scheduler data.type="fr.liglab.adele.cilia.Data" />
               <cilia:odd-even-dispatcher data.type="fr.liglab.adele.cilia.Data" />
       </component>

</ipojo>

</source> Les handlers d'iPOJO sont un type spécial de composant avec un namespace. Dans cet exemple, on utilise le namespace de cilia: fr.liglab.adele.cilia.

Spécification en DSL XML de la chaîne de médiation

Ensuite, on créé un fichier tp4.dscilia qui contient la description de la chaîne de médiation. <source lang="xml"> <cilia>

   <chain id="converterChain_tp4">
       <mediators>
           <mediator-instance id="mediator-filter" type="NumberFilterMediator"/>

<mediator-instance id="mediator-converter-french" type="NumberConverterFrench"/> <mediator-instance id="mediator-converter-english" type="NumberConverterEnglish"/> </mediators> <bindings> <binding to="mediator-filter" protocol="gui-console"/> <binding from="mediator-filter:odd" to="mediator-converter-french"/> <binding from="mediator-filter:even" to="mediator-converter-english"/> <binding from="mediator-converter-french" protocol="console"/> <binding from="mediator-converter-english" protocol="console"/> </bindings>

   </chain>

</cilia> </source>

<!--

Exemple de spécification en DSL XML

Le DSL de médiation introduit une syntaxe et une sémantique propres à la médiation en supprimant dans le même temps toute référence à la syntaxe iPOJO. La spécification du médiateur de filtrage à partir de ce DSL est la suivante :

<source lang="xml"> <cilia>

       <dispatcher-component classname="cilia.examples.handler.dispatcher.NumberDispatcher"
               name="odd-even-dispatcher">
       </dispatcher-component>
       <mediator-component category="Filter" name="NumberFilterMediator">
               <processor  classname="cilia.examples.mediator.filter.NumberFilter"/>
               <scheduler  name="immediate-scheduler" data.type="fr.liglab.adele.cilia.Data"/>
               <dispatcher name="odd-even-dispatcher" data.type="fr.liglab.adele.cilia.Data"/>
       </mediator-component>

</cilia> </source>

En cours d'implantation... -->

Compiler et déployer

Le projet est compilé en utilisant Maven.

<code>mvn clean install</code>

Download.png Le résultat, et les bundles nécessaires TP4-files


Ce bundle doit être placé dans le dossier <code>load</code> de la plateforme d'exécution.

Déployer la chaîne de médiation

Le fichier tp4.dscilia doit être copié dans le répertoire <code>load</code> de la plateforme d'exécution pour créer dynamiquement une instance de la chaîne de médiation