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