Cilia/Workshop/DSL XML - proposition

From Wiki Adele Team
Jump to: navigation, search

Pourquoi un DSL?

Le Cilia DSL permet de définir les médiateurs qui vont interagir avec la chaîne de médiation et leurs propriétés, en plus permettre de créer des liaisons entre les médiateurs.

Description en XML

Le racine du XML doit être toujours "cilia". Il est possible d'avoir plus d'une chaîne de médiation dans le même fichier.

NAME OPTIONAL DESCRIPTION
cilia No It's the root node.
chain No Each chain is defined in this chain node.
<cilia>
   <chain ...>
     <!-- -->
   </chain>

   <chain ...>
     <!-- -->
   </chain>
</cilia>

Chaque chaîne de médiation doit avoir un type et un identificateur. Pour l'instant le type n'apporte pas de fonctionnalité a la chaîne mais est utile pour les distinguer.

NAME OPTIONAL DESCRIPTION
id No Chain unique identification.
type No Chain type.
<cilia>
    <chain id="MyChainId" type="MyChainType">
        <!-- -->
    </chain>
</cilia>

Dans la version actuelle (1.0.0-SNAPSHOT) il y a deux balises principales pour chaque chaîne de médiation.

<chain>
   <mediators>..</mediators>
   <bindings>...</bindings>
</chain>
NAME OPTIONAL DESCRIPTION
mediators No It contains all the mediator instances configurations used in each chain.
bindings No It contains all the bindings in the chain.

Description de médiateurs

Tous les médiateurs instances d'une chaîne doivent être définis dans la balise mediators. Et, tout comme les chaînes, chaque médiateur doit avoir un type et un identificateur. Contrairement aux chaînes de médiation, le type de chaque instance (balisse type) est important pour qu'il soit résolu dans la plateforme d'exécution. L'identificateur est aussi important et doit être unique dans chaque chaîne.

<chain id="chainId" type="chainType">
    <mediators>
      <mediator-instance id="mediatorId" type="MyMediatorType">
        <processor>
           <property name="propertyName" value="propertyValue"/>
        </processor>
        <scheduler>
           <property name="schedPropertyName" value="propertyValue"/>
        </scheduler>
        <dispatcher>
           <property name="dispPropertyName" value="propertyValue"/>
        </dispatcher>
      </mediator-instance>
    </mediators>
</chain>
NAME OPTIONAL DESCRIPTION
id No Unique identifier for mediator instance
type No Mediator type used to resolve it in the execution platform.
property Yes Each mediator instance could have different properties, in this section each mediator's property are defined. Properties are for each of the three mediators elements (processor, scheduler, dispatcher)
property name No Each mediator property must have a name.
property value No Each mediator property must have a value, it could be a string or a map.


i Chaque propriété dans la déclaration des composants iPOJO doivent être nome processor.propertyName, dispatcher.dispPropertyName, scheduler.schedPropertyName. Sinon, en la déclaration de l'instance du médiateur ils doivent être dehors les balises processor, dispatcher, scheduler


Les propriétés de type Map du médiateur

Les propriétés d'un médiateur(processor, scheduler, dispatcher) peuvent être (dans la version 1.0.0-SNAPSHOT) un simple valeur de type native (int, String, float, boolean, ...) ou de type Map. Les propriétés de type Map son décrit comme le suivent:

<chain id="chainId" type="chainType">
    <mediators>
      <mediator-instance id="mediatorId" type="MyMediatorType">
        <processor>
           <property name="MapProperty">
              <item key="keyValue" value="itemValue"/>
              <item key="otherKeyValue" value="otherItemValue"/>
           </property>
        </processor>
      </mediator-instance>
    </mediators>
</chain>

Cet types des propriétés sont utilises pour constituants complexes, par exemple le content-based-dispatcher.

Description de Bindings

Le deuxième balise d'une chaîne de médiation sert à décrire les bindings.

<chain id="chainId" type="chainType">
    <mediators>
      <!-- mediator instances -->
    </mediators>
    <bindings>
       <binding from="mediatorId1:exitPoint1" to="mediatorId2:inPoint1" />
    </bindings>
</chain>
NAME OPTIONAL DESCRIPTION
binding No Binding declaration
binding from Yes Describes which mediator is the one who sends the data, and which port is used by this binding.
binding to Yes Describes which mediator is the one who receives the data, and which port is used by this binding.
binding type Yes Describes the type of the binding between mediators, event-admin-binding is the default one.

Binding Port

La spécification d'un port dans un binding peut être omis. Dans ce cas un port "std" est utilisé.

<chain id="chainId" type="chainType">
    <mediators>
      <!-- mediator instances -->
    </mediators>
    <bindings>
       <binding from="mediatorId1" to="mediatorId2" />
    </bindings>
</chain>

La spécification précèdent est équivalent a la spécification qui suive.

<chain id="chainId" type="chainType">
    <mediators>
      <!-- mediator instances -->
    </mediators>
    <bindings>
       <binding from="mediatorId1:std" to="mediatorId2:std" />
    </bindings>
</chain>

Type de binding

Le type de binding pourras être spécifié pour changer le type de protocole a utilises au moment de faire un liaison. Cilia utilise un liaison OSGi/EventAdmin si aucun type a être spécifiée. Pour spécifier un autre type de liaison on doit metre le type attribut dans le balise bind.

    <bindings>
       <binding from="mediatorId1:std" to="mediatorId2:std" protocol="jms-binding"/>
    </bindings>

Binding avec l'extérieur

Quand on va faire un liaison entre un chaîne de médiation et un autre application externe, ou un protocole de communication mais pas nécessairement pour faire communiquer deux médiateurs on utilises les bindings qui utilisent seulement un médiateur.

    <bindings>
       <binding from="mediatorId1:std" type="jms-binding">
          <property name="jms.topic" value="example$to$topic"/>
       </binding>
    </bindings>

Dans l'exemple précèdent, le médiateur "mediatorId1" en utilisant le port "std", a un binding de type "jms-binding" et envoie la donnée vers le topic "example$to$topic"

    <bindings>
       <binding to="mediatorId2:std" type="jms-binding">
          <property name="jms.topic" value="example$from$topic"/>
       </binding>
    </bindings>

Pour recevoir la donnée, on change le "from" de la liaison pour "to". Dans cet exemple, le médiateur "mediatorId2" reçoit le donnée envoie par le topic "example$from$topic"

Exemple d'un chaîne de médiation

<cilia>
    <chain id="MyChainId" type="MyChainType">
       <mediators>
          <mediator-instance type="myMediator" id="mediatorId1"/>
          <mediator-instance type="myMediator2" id="mediatorId2"/>
       </mediators>
       <bindings>
          <binding from="mediator1:std" to="mediatorId2:std" >
       </bindings>
    </chain>
</cilia>

Déploiement de la Chaîne

Pour déployé une chaîne de médiation cilia, on doit construire un fichier xml qui contient les descriptions d'une ou plusieurs chaînes, cet fichier doit avoir une extension .dscilia.

Le fichier .dscilia doit être deployer selon la configuration de fileinstall de Felix. Normalement dans le dossier load

Pour que cilia puisse construire la chaîne de médiation à partir de cet fichier, le bundle cilia-deployer doit être installé dans le passerelle.