QVTo Partie 2

publicité
25/11/2010
Cedric Dumoulin
Problème
 Pour une classe, nous voulons spécifier:
 isAbstract, isFinal,
 Pour une methode:
 isStatic, isFinal, isAbstract, isSynchronized, isConstructor
 Pour tous les éléments UML:
 author, version
 idem pour les autres éléments …
 UML ne permet pas de spécifier directement toutes ces
propriétés !
1
25/11/2010
Proposition
 Utiliser un profile UML proposant les propriétés
manquantes.
 Papyrus permet de définir des profiles
 Dans les transfo UML -> mjava
 Proposer des méthodes pour accéder aux stéreotypes et à
leurs valeurs  query
 Transformer ces valeurs
 Faire des librairies de methodes  library
Profil
 Profil :
 Un profil permet de définir des <<stéréotypes>>
 On applique (attache) un profil à un modèle afin de pouvoir utiliser les stéréotypes
qu’il contient
 Stéréotype
 Un stéréotype permet d’ajouter de l’information à un élément UML
 C’est un mécanisme permettant d’étendre les éléments existants
 Un stéréotype peut contenir des attributs appelés ‘tagged values’ (valeurs
marquées)
 Tagged Values (valeurs marquées)
 attribut d’un stéréotype
 est typé (par un type définit dans le modèle)
 l’utilisateur peut lui donner une valeur
2
25/11/2010
Définir un profile
 Dans Papyrus:
 Créer un nouveau modèle, choisir « profile »
 Créer des classes « stereotype »
 Leur ajouter des propriétés


Se sera les tagged values
Elles seront accessible dans le stéreotype
 Spécifier sur quelles éléments le stéreotype peut
s’appliquer :

utiliser
Profile UML pour Java
Papyrus 1
3
25/11/2010
Profile UML pour Java
Papyrus 2
Améliorer le profile
 Le profile UML est un modèle UML comme les autres
 Vous pouvez le modifier
 pour ajouter des stéréotypes, des valeurs marquées.
4
25/11/2010
Transformer un modèle
utilisant un profile UML
Transformer un modèle
utilisant un profile UML
 Il est possible :
 de tester si un stéréotype est appliqué à un concept UML
mapping uml::Class::Class2Class() : mjava::Class {
var stereotype = self.getAppliedStereotype("java::javaClass");
var isApplied = self.isStereotypeApplied(stereotype);
}
 de récupérer la valeur d’une valeur marquée
mapping uml::Class::Class2Class() : mjava:: {
var stereotype = self.getAppliedStereotype("java::javaClass");
var isTransient = self.getValue(stereotype, "isTransient").oclAsType(Boolean);
}
5
25/11/2010
QVT – Query
 Une query permet d’écrire une fonction réutilisable
query inputType::queryName(params) : returnedType
{
aValue = …;
return aValue
}
/*
* Utility query retrieving the tagged value of a stereotype.
* The tagged value should be of type Boolean
*/
query uml::NamedElement::getBooleanTaggedValue( stereotypeName : String,
taggedValueName : String ) : Boolean {
var stereotype = self.getAppliedStereotype(stereotypeName);
var value = self.getValue(stereotype, taggedValueName);
return value.oclAsType(Boolean);
}
var isTransient = self.getBooleanTaggedValue("java::javaClass", "isTransient");
Query - appel
 Une query peut retourner un type any
/*
* Utility query retrieving the tagged value of a stereotype.
* The tagged value should be of type Boolean
*/
query umlMM::NamedElement::getStereotypeBooleanValue(stereotypeName : String,
value : String) : OclAny {
var stereotype := self.getAppliedStereotype(stereotypeName);
var taggedValue := self.getValue(stereotype, value);
return taggedValue;
}
isTransient := self.getStereotypeBooleanValue('java::JavaProperty',
'isTransient').oclAsType(Boolean);;
6
25/11/2010
QVT – Library
 Librairie : permet d’externaliser les query dans un fichier séparé
 Pour réutiliser
 Pour faciliter la lecture
library umlQueries;
modeltype umlMM uses "http://www.eclipse.org/uml2/3.0.0/UML";
modeltype mjavaMM uses "http:///mjava.ecore";
/*
* Utility query retrieving the tagged value of a stereotype.
* The tagged value should be of type Boolean
*/
query umlMM::NamedElement::getBooleanStereotypeValue(stereotypeName : String,
value : String) : Boolean {
var stereotype := self.getAppliedStereotype(stereotypeName);
var taggedValue := self.getValue(stereotype, value).oclAsType(Boolean);
return taggedValue;
}
import umlQueries;
A propos des Enumeration
 Pour accéder à la valeur literal d’une énumération :
 EnumerationType::Literal
mapping uml::Class::Class2Class() : mjava::Class {
if( self.visibility = uml::VisibilityKind::public)
then
visibility := mjava::VisibilityKind::public
endif;
}
7
25/11/2010
Exercices
 Ecrire une query prenant en paramétre la visibilité
UML, et retournant la visibilité MJAVA
 Ecrire une query prenant en parametre le nom
d’un stereotype, le nom d’une valeur marquée, une
valeur par défaut. La query retourne la valeur
trouvé dans la valeur marquée, ou la valeur par
défaut si le stéréotype n’est pas appliqué.
Exercices
Solutions
 Voir code
8
25/11/2010
Exercices
9
Téléchargement