Master d’informatique 2007 2008 de l’université Paris VI
cps
TME 4 : Conception par contrat et outillage

L’objectif de ce TME est de réaliser une implémentation de l’exemple des cuves et tuyaus (PipeMania) vu en cours, dans le cadre de la conception par contrat outillée.

L’outil que nous utilisons est TamagoCC, un générateur de code expérimental. Ce TME permet notamment d’illustrer l’intégration de la génération de code comme partie intégrante du cycle de développement logiciel. Comme souvent dans les nouvelles technos, le langage pivot est codé en XML et sa syntaxe est décrite par un XSchéma (ce qui n’en facilite pas la compréhension mais évite en gros d’avoir à utiliser un parser dédié).

IMPORTANT : cet énoncé (également légèrement expérimental) doit être suivi très précisément.

Installation du squelette

On créera tout d’abord un répertoire pour le TME. Dans ce répertoire, on décompressera l’archive du squelette

- récupérer l’archive du squelette

On prendra soin de récupérer également les dépendances : la bibliothèque tamago ainsi que le générateur de code tamagoCC

- récupérer la bibliothèque tamago (attention, ne pas réutiliser la bibliothèque du TM2 des modifications ont été effectuées)
- récupérer le générateur de code tamagoCC

L’archive du TME contient :
- un fichier de construction ant build.xml et son fichier de propriétés build.properties
- un répertoire contracts/ contenent les descripteurs de contrat
- un répertoire src/ contenant les sources éditables
- un répertoire gensrc/ des sources générés non-éditables
- un répertoire build/ pour les fichiers compilés

Important : supprimer le fichier cuve.xml (remplacé par TankService.xml)

Le fichier build.properties doit être édité. Les propriétés name1 et name2 doivent être correctement initialisées, de même que les chemins vers les archives tamago.jar et tamagoCC.jar

Parcourir le fichier build.xml pour découvrir les différentes cibles :
- cible init : initialisation des propriétés
- cible firstgen : génération automatique des squelettes
- cible gen : génération automatique du code de vérification des contrats
- cible compile : compilation du projet
- cible clean : nettoyage
- cible dist : génération de l’archive pour le rendu du projet

Description des contrats

Dans le répertoire contrats/ sont placés deux spécifications :

  1. une spécification pour le service de cuve TankService.xml
  2. une spécification pour un composant fournisseur du service cuve TankComponent.xml

Les contracts sont décrits dans le langage TamagoCDL, un dialecte xml dont le schéma est disponible en ligne.

- voir le schéma TamagoCDL

IMPORTANT : bien lire les contrats pour les comprendre et bien étudier les liens avec le XSchéma associé (sinon difficile de modifier les contrats ou d’en créer de nouveaux).

Génération des squelettes

Dans un premier temps, nous allons réaliser une implémentation du composant cuve (TankComponent). Le générateur TamagoCC permet, à partir de la description d’un contrat, de générer automatiquement les interfaces de service et de composant ainsi que les squelettes d’implémentation. La cible utilisée est firstgen

Parcourir chaque fichier généré dans gensrc/ et expliquer à quoi sert selon-vous le fichier. Quel(s) fichier(s) sont éditable(s) ? L’idée est que les fichiers non-éditables et auto-générés sont placés dans gensrc/ et les fichiers éditables sont dans src/

Attention pour l’intégration eclipse ou netbeans il faut que src/ et gensrc/ soient tous deux indiqués comme répertoires de source.

On prendra soin de recopier le(s) squelette(s) éditable(s) (un seul fichier, lequel est-ce ?) dans le répertoire des sources éditables src/ (attention : à chaque génération les fichiers du répertoire gensrc/ sont effacés).

Lorsque l’on modifie ou ajoute des contrats, la cible gen est utilisée. Sa définition est erronée inspirez vous de firstgen pour la corriger (la seule différence doit être l’ajout de l’option -noskeletons par rapport à firstgen)

Implémentation des cuves

Proposer une implémentation du service Cuve en complétant le squelette auto-généré (fichier TankComponentBusiness.java).

Ajouter un exemple cps.PipeMania.Example1 avec un main et permettant de tester le comportement des cuves

Ajouter une cible run au fichier build.xml pour effectuer votre test (cette cible requiert bien sûr la compilation du projet via la cible compile).

Pour écrire le main

Pour créer une instance de composant avec Tamago on utilise la fonction de bibliothèque TamagoCC.Lookup. Voici un exemple pour la cuve :

TankComponent tank = (TankComponent) TamagoCC.LookUp("cps.pipemania.TankComponent");

tank.fill(200);

Modification des contrats

Dans le contrat de cuve (TankService.xml) le contrat de la méthode pump est incomplet. Que faut-il ajouter ? (attention : longue phase de décryptage du XMLSchéma, pas drôle mais courant dans les nouvelles technos).

L’outil expérimental utilisé ne permet pour l’instant que d’indiquer une seule précondition et postcondition par méthode. Pour effectuer un ajout de précondition ou de post-condition il faut donc combiner les expressions logiques avec un et logique.

La syntaxe (d’après le XSchema) sera du type

<pre>
<operator name="and">
    précondition 1
    precondition 2
</operator>
</pre>

Après modification des contrats, on relance le générateur de code (cible gen et surtout pas firstgen) puis on fait à nouveau le test.

Ajouter une propriété booléenne empty au contrat de cuve et ajouter l’invariant correspondant à empty=(quantity=0)

Services et composants tuyaux

Décrire dans le langage CDL un contrat de service PipeService.xml ainsi qu’un contrat de composant PipeComponent.xml. Un composant tuyau fournit le service tuyau et requiert deux services cuve (cf. cours)

Proposer une implémentation et un test (cible run) réalisant un assemblage de deux cuves et un tuyau.


Retour à la page d’accueil