Ingénierie Dirigée par les Modèles (IDM)
Ingénierie Dirigée par les Modèles : fini Eclipse GMF, vive Eclipse Sirius ( didacticiel / tutoriel Sirius)
Dans nos 2 précédents articles :
https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-didacticiel-gmf-ca-marche-ce-truc
et
nous avons vu qu'Eclipse Graphical Modeling Framework est d'une complexité effroyable, le mode opératoire est aussi rebutant qu'une fiche de montage d'un meuble IKEA.
Et si seulement ça marchait, mais le pire c'est qu'ayant suivi scrupuleusement le processus des dernières versions, on tombe sur des erreurs de génération de code qui ne sont même pas "googlelisées" !
Heureusement, l'ennjeu de pouvoir concevoir des éditeurs de diagrammes avec ses propres DSL ( Domain Specific Language ) ou DSM ( Domain Specific Model ) est tellement important qu'Eclipse semble avoir mis le paquet sur un super plugin nommé "Sirius" digne successeur de GMF.
Les entreprises Obeo et Thales participent largement au projet ce qui un gage de sérieux, de qualité et de fiabilité.
Quand on installe Sirius à partir du site d'Eclipse Modeling Project, on télécharge directement la version complète "Obeo Designer Community".
Installer Sirius
https://www.eclipse.org/sirius/download.html
Vous êtes redirigé vers le site d'Obeo
http://www.obeodesigner.com/download
Téléchargez, installez et lancez.
Mais au fait quel est le but ?
On part d'un métamodèle conforme à Ecore et conçu avec le framwork EMF et ses outils.
Faisons "quick and dirty" et prenons celui de l'exemple fourni avec Sirius :
Comme à l'habiture : File - New - Example - Basic Family Metamodel Definition - sélectionnez le projet org.eclipse.sirius.sample.basicfamily
Résullats des courses : 3 projets sont créés :
- org.eclipse.sirius.sample.basicfamily
- org.eclipse.sirius.sample.basicfamily.edit ( 1er éditeur de modèle )
- org.eclipse.sirius.sample.basicfamily.editor( 2ème éditeur de modèle )
En fait c'est comme si on avait créé un métamodèle ecore "basicfamily.ecore" puis on avait généré le fichier "basicfamily.genmodel" puis dans l'éditeur du genmodel on avait fait clic doir sur la racine - Generate all pour générer le code des 3 projets.
Exécutez le 1er plugin : clic droit sur le projet - Run configuration - Eclipse Application - onglet arguments - VM arguments
- -Xms256m
- -Xmx768m
- -XX:MaxPermSize=256m
puis Run. Un nouvel Eclipse s'ouvre, attention avec un autre workspace "runtime-EclipseApplication" différent du premier ( par défaut =" workspace" ).
C'est moi qui ne l'ai pas fait ;-) le modèle à partir des plugins générés des éditeurs.
Le modèle est fourni dans les exemple, il suffit de faire File - New - Example - Basic Family Sample Model
Clic droit sur le fichier "example.basicfamily" - Open With - Basic Family Model Editor - un éditeur s'ouvre avec différents onglets correspondant à différentes représentations.
Dans un prochain billet on verra comment créer un éditeur de diagramme avec Sirius.
"Se réveiller, c’est se mettre à la recherche du monde."
Alain
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles : didacticiel GMF, avec "Generate diagram code (Xtend2)" et suppression de quelques éléments ça marche !
Dans l'article précédent " https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-didacticiel-gmf-ca-marche-ce-truc", je présentais un tutoriel GMF qui ne marchais pas !
En tout cas la génération du diagramme avec l'option Generate diagram code conduisait à plusieurs erreurs probablement dues à des bogues.
Par contre l'option clic droit sur testgmf.gmfgen - Generate diagram code (Xtend2) générait qu'une seule erreur concernant l'appel d'une méthode qui n'est pas définie. A priori l'erreur est liée à l'entité Thread.
Qu'a cela me tienne, supprimons tout sauf testgmf.ecore et testgmf.genmodel.
Recommençons et lorsqu'on va créer "testgmf.gmfgraph" et "testgmf.gmftool" on désélectionne les Thread et ThreadItem.
Le clic droit sur testgmf.gmfgen - Generate diagram code (Xtend2) affiche cette fois-ci le message "Code generate successfully".
Un nouveau projet "testgmf.diagram" est créé, il correspond à un plugin Eclipse.
Pour l'exécuter : clic droit sur le projet testgmf.diagram - Run As - Eclipse Application - un nouvel Eclipse se lance - créez un projet vide "mindmap" - clic droit sur le projet - New - Example - sélectionnez le nouveau plugin qui a été généré : Testgmf Diagram - nommez votre diagramme "cartementale".
2 fichiers sont créés : cartementale.mindmap et cartementale.mindmap_diagram.
Ouvrez cartementale.mindmap_diagram - la palette sur la droite permet de créer des Topics, de les relier et de mettre des ressources.
On peut bien sur embellir avec de la couleur, des formes spécifiques, ... mais le principal est fait.
Un clic droit sur cartementale.mindmap - Open With - Text Editor - on a le source XMI du modèle, les entités "carte mentale", "qualités" et "titres" de types Topic.
Un clic droit sur cartementale.mindmap_diagram - Open With - Text Editor - on a le source XMI de la représentation du diagramme.
On voit donc que la sémantique ( les entités et leurs relations ) et la représentation du diagramme sont représentées distinctement.
Une sémantique pouvant avoir plusieurs représentations différentes.
"La peine et le plaisir passent comme une ombre : la vie s'écoule en un instant ; elle n'est rien par elle-même ; son prix dépend de son emploi. Le bien seul qu'on a fait demeure, et c'est par lui qu'elle est quelque chose."
Jean-Jacques Rousseau
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles : didacticiel GMF, ça marche ce truc ?
Eclipse GMF ( Graphical Modeling Framework ) permet en théorie de réaliser des diagrammes personnaliser à partir d'un métamodèle (DSL Domain Specific Language ou DSM Domain Specifc Model).
Je dis bien en théorie car j'y ai consacré une semaine (j'ai aussi eu d'autres occupations) et ça n'a jamais marché malgré tous mes essais avec toutes les dernières versions, mises à jour et recherches sur google sur les différents problèmes que je rencontrais.
Installez la dernière version d'Eclipse Mars Modeling Tools :
Comme dit l'homme tombant du 20 ème étage et arrivant au 19 ème :"jusqu'ici tout va bien !". Cette nouvelle mouture contient entre autre EMF et Sirius, qui a mon avis remplace avantageusement GMF.
La documentation de GMF nous dit d'installer dans l'ordre QVTO ( Query View Transformation Operational, le langage impératif de transformation de modèles normalisé par l'OMG)
Installation locale : http://www.eclipse.org/mmt/downloads/?project=qvto
Et oui, vous l'avez deviné à un moment donné il faut bien installer GMF
Insstallation par update :
Vérifier les mises à jour : Help - Check for Updates
Des nouvelles mises à jour vous sont proposées, acceptez-les !
Pour démontrer que ça ne marche pas il nous faut un métamodèle. Prenons celui de la documentation comme ça on ne pourra mettre en cause notre modèle !
Il s'agit du métamodèle de mindmap vu dans un préédent article :
Créer un projet GMF : File - New - Other - Graphical Modeling Framework - Graphical editor project - "testgmf" - Finish
Créez le modèle Ecore à partir du source XMI founi par l'article
Clic droit sur Model - New - Other - Eclipse Modeling Framework - Ecore Model - testgmf.ecore - finish
Clic droit sur testgmf.ecore - Open with- Text editor - remplacer le contenu par celui du source XMI du métamodèle de mindmap mentionné dans l'article cité précédemment
Double cliquer sur testgmf pour vérifier que l'on a bien les classe "Map", "Topic", ... Sauvegarder régulièrement à chaque étape successive.
Générer le fichier genmodel : Clic droit sur Model - New - Other - Eclipse Modeling Framework - EMF Generator Model - "testgmf.genmodel" - cliquez sur load pour le fichier ecore - laissez toutes les valeurs par défaut - Finish
Générer le code : double cliquez sur testgmf.genmodel pour ouvrir l'éditeur, clic droit dans l'éditeur sur Testgmf - Generate all - vérifiez dans src que les classes Map, Topic, ... sont bien créées.
Créer le graphe : Clic droit sur Model - New - Other - Graphical Modeling Framework - Simple Graphical Definition Model - "testgmf.gmfgraph" - laissez toutes les valeurs par défaut.
Crèez les tools ( palette, ...) : Clic droit sur Model - New - Other - Graphical Modeling Framework - Simple Tooling Definition Model - "testgmf.gmftool" - laissez toutes les valeurs par défaut.
Créez le mapping : Clic droit sur Model - New - Other - Graphical Modeling Framework - Guide Mapping Model Creation - "testgmf.gmfmap" - laissez toutes les valeurs par défaut.
Double cliquez sur testgmf.gmfmap - ouvrez l'arborescence jusqu'à Mapping - Link Mapping <Thread ...> - Feature Label Mapping [Thread.subject:EString] - View Onglet Properties - Misc - Diagram Label - Diagram Label Thread Subject
Générer le code : Clic droit sur testgmf.gmfmap - Create generator model - "testgmf.gmfgen" - cliquez sur load - laissez toutes les valeurs par défaut. - Finish
Générer le diagramme : clic droit sur testgmf.gmfgen - Generate diagram code
On arrive quoiqu'on fasse à l'erreur :
Exception (Boolean expected (was: org.eclipse.ocl.ecore.internal.OCLStandardLibraryImpl$1)!:in CodeStyle, line 18) while generating code
Boolean expected (was: org.eclipse.ocl.ecore.internal.OCLStandardLibraryImpl$1)!:in CodeStyle, line 18
Malgré tous mes essais d'installation, de réinstallation, de recherches sur Google de l'exception, des problèmes similaires, de simplification du métamodèle ( une seule classe avec un seul attribut ! ), de "post" sur les différents spécialisés, rien n'y fait, je m'avoue vaincu.
Du reste c'est peut être un bien et je me tourne maintenant vers Sirius qui permet de concevoir ses propres diagrammes à partir de ses métamodèles.
Par contre : clic droit sur testgmf.gmfgen - Generate diagram code (Xtend2) à l'air de mieux fonctionner, puisqu'il n'y a qu'une erreur dans un source facilement corrigeable.
"Tout changement est difficile au début, compliqué au milieu et magnifique à la fin."
Robin Sharma
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles : métamodèle de mindmap, un petit dernier pour la route
Pour compléter les métamodèles de mindmap déjà vus dans les articles :
- https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-les-metamodeles-mindmap-l-embarras-du-choix
- https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-metamodele-simplifie-de-mindmap
- https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-metamodele-de-mindmap-en-veux-tu-en-voila
en voici un petit dernier.
La sémantique est similaire seul les noms changent.
Dans un prochain article je vous livrerais le source XMI du fichier ecore.
"La différence entre l'amour et l'argent, c'est que si on partage son argent, il diminue, tandis que si on partage son amour, il augmente. L'idéal étant d'arriver à partager son amour avec quelqu'un qui a du pognon."
Philippe Geluck
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles : métamodèle de mindmap, en veux tu en voilà
Mes 2 derniers articles :
et https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-metamodele-simplifie-de-mindmap
a permis de présenter 2 exemples de métamodèle de mindmap.
En voici un autre utilisant l'héritage.
Voici comme à notre habitude le source XMI du fichier Ecore :
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="mindmap" nsURI="http://www.eclipse.org/2008/mindmap" nsPrefix="mindmap">
<eClassifiers xsi:type="ecore:EClass" name="Map">
<eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1"
eType="#//MapElement" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="title" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="created" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="rootTopics" upperBound="-1"
eType="#//Topic" volatile="true" transient="true" derived="true">
<eAnnotations source="http://www.eclipse.org/2007/OCL">
<details key="derive" value="let topics : Set(mindmap::Topic) = self.elements->select(oclIsKindOf(mindmap::Topic))->collect(oclAsType(mindmap::Topic))->asSet() in topics->symmetricDifference(topics.subtopics->asSet())"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="MapElement" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
defaultValueLiteral="Element"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Topic" eSuperTypes="#//MapElement">
<eOperations name="allSubtopics" upperBound="-1" eType="#//Topic">
<eAnnotations source="http://www.eclipse.org/2007/OCL">
<details key="body" value="self->closure(subtopics)"/>
</eAnnotations>
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="subtopics" upperBound="-1"
eType="#//Topic" eOpposite="#//Topic/parent"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="start" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="priority" eType="#//Priority"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//Topic"
eOpposite="#//Topic/subtopics"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Relationship" eSuperTypes="#//MapElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
eType="#//Topic"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1"
eType="#//Topic"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//Type"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Type">
<eLiterals name="DEPENDENCY" literal="d"/>
<eLiterals name="INCLUDE" value="1" literal="i"/>
<eLiterals name="EXTEND" value="2" literal="e"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Priority">
<eLiterals name="HIGH"/>
<eLiterals name="MEDIUM" value="1"/>
<eLiterals name="LOW" value="2"/>
</eClassifiers>
</ecore:EPackage>
Il nous restera un petit dernier pour un prochain article.
"Les grands principes participants du bonheur sont : quelque chose à faire, quelque chose à aimer, et quelque chose à espérer."
Allan K. Chalmers
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles : métamodèle simplifié de mindmap
Dans l'article précédent https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-les-metamodeles-mindmap-l-embarras-du-choix nous avons vu un métamodèle complet de mindmap.
En voici un autre quasiment identique mais auquel on a retiré des classes qui ne sont pas primordiales et qui peut être utilisé pour des mises au point de transformation vers d'autres modèles.
Voici le source XMI du fichier Ecore :
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="mindmap" nsURI="mindmap" nsPrefix="mindmap">
<eClassifiers xsi:type="ecore:EClass" name="Topic">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="subtopics" upperBound="-1"
eType="#//Topic"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="resources" upperBound="-1"
eType="#//Resource" eOpposite="#//Resource/topics"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="percentComplete" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"
defaultValueLiteral="0"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="priority" eType="#//Priority"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="endDate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="duration" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"
defaultValueLiteral="0"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="comments" upperBound="-1"
eType="#//Thread" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Map">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="title" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="rootTopics" upperBound="-1"
eType="#//Topic" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="relations" upperBound="-1"
eType="#//Relationship" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="resources" upperBound="-1"
eType="#//Resource" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Resource">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="topics" upperBound="-1"
eType="#//Topic" eOpposite="#//Topic/resources"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="email" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="comments" upperBound="-1"
eType="#//Thread" eOpposite="#//Thread/author"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Relationship">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="label" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
eType="#//Topic"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1"
eType="#//Topic"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//RelationshipType"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="RelationshipType">
<eLiterals name="DEPENDENCY"/>
<eLiterals name="INCLUDES" value="1"/>
<eLiterals name="EXTENDS" value="2"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Priority">
<eLiterals name="ONE" value="1"/>
<eLiterals name="TWO" value="2"/>
<eLiterals name="ZERO"/>
<eLiterals name="THREE" value="3"/>
<eLiterals name="FOUR" value="4"/>
<eLiterals name="FIVE" value="5"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Thread">
<eStructuralFeatures xsi:type="ecore:EReference" name="author" eType="#//Resource"
eOpposite="#//Resource/comments"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="subject" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="items" upperBound="-1"
eType="#//ThreadItem" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="postDate" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ThreadItem">
<eStructuralFeatures xsi:type="ecore:EReference" name="author" eType="#//Resource"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="body" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="itemPostDate" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
</eClassifiers>
</ecore:EPackage>
Il nous reste encore 2 métamodèles de mindmap à voir qui sont cette fois-ci différents et qui feront l'objet des 2 prochains articles.
"Les gens qui arrivent à quelque chose dans ce monde sont ceux qui se lèvent , qui recherchent les circonstances qu’ils désirent et qui, s’ils ne les trouvent pas, les créent."
George Bernard Shaw
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles : les métamodèles mindmap, l'embarras du choix !
Dans les articles précédents, j'ai présenté les raisons ( https://www.urbanisation-si.com/modelisation-metier-mindmap-ne-vous-perdez-plus-dans-votre-cheminement-de-pensee-mettez-de-l-ordre-dans-vos-idees ) pour utiliser les mindmap ainsi que mes outils préférés gratuits bien évidemment ( https://www.urbanisation-si.com/modelisation-metier-outils-mindmap ).
Il serait intéressant d'industrialiser l'intégration des informations contenues dans les mindmap des modéles métier utilisant KAOS, SysML ou bien encore UML.
Pour transformer un modèle mindmap dans un autre modèle, il nous faut son métamodèle ( https://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-idm-tutoriel-atl-atlas-transformation-language-concevez-les-metamodeles-avant-de-passer-aux-choses-serieuses ).
Plutôt que de me faire des noeuds au cerveau pour concevoir un métamodèle de mindmap, j'ai cherché sur internet. Heureusement ou malheureusement, j'en ai trouvé plusieurs.
Un premier métamodéle de mindmap a été récupéré sur le site d'Eclipse.
La racine est constituée de l'entité "DocumentRoot" qui sert de conteneur et qui n'est pas vraiment utile, du reste on verra dans le prochain article un métamodèle de mindmap simplifié dans lequel cette entité a été supprimée.
L'entité "Map" représente le mindmap qui est un composite de "Topic" (Sujet) à leur tour lié par une composition de "Thread" (ou fil de discussion) composée de "ThreadItem".
Toutes ces entités (Map, topic, Thread, ThreadItem) sont liées à des "Resource" (auteur, ...).
On peut aussi établir des relations ("Relationship") entre 2 sujets ("Topic") source et cible.
Voici le source XMI du fichier Ecore :
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="mindmap" nsURI="http://www.example.org/mindmap" nsPrefix="mindmap">
<eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value=""/>
<details key="kind" value="mixed"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="elementWildcard"/>
<details key="name" value=":mixed"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" upperBound="-1"
eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
transient="true" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="xmlns:prefix"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" upperBound="-1"
eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
transient="true" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="xsi:schemaLocation"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="map" upperBound="-2" eType="#//Map"
volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="map"/>
<details key="namespace" value="##targetNamespace"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Map">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Map"/>
<details key="kind" value="elementOnly"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="rootTopics" upperBound="-1"
eType="#//Topic" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="rootTopics"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="relations" upperBound="-1"
eType="#//Relationship" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="relations"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="resources" upperBound="-1"
eType="#//Resource" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="resources"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="title" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="title"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Priority">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Priority"/>
</eAnnotations>
<eLiterals name="ZERO"/>
<eLiterals name="ONE" value="1"/>
<eLiterals name="TWO" value="2"/>
<eLiterals name="THREE" value="3"/>
<eLiterals name="FOUR" value="4"/>
<eLiterals name="FIVE" value="5"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EDataType" name="PriorityObject" instanceClassName="org.eclipse.emf.common.util.Enumerator">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Priority:Object"/>
<details key="baseType" value="Priority"/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Relationship">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Relationship"/>
<details key="kind" value="empty"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="label" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="label"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="source" eType="#//Topic">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="source"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//Topic">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="target"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//RelationshipType"
defaultValueLiteral="DEPENDENCY" unsettable="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="type"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="RelationshipType">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="RelationshipType"/>
</eAnnotations>
<eLiterals name="DEPENDENCY"/>
<eLiterals name="INCLUDES" value="1"/>
<eLiterals name="EXTENDS" value="2"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EDataType" name="RelationshipTypeObject" instanceClassName="org.eclipse.emf.common.util.Enumerator">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="RelationshipType:Object"/>
<details key="baseType" value="RelationshipType"/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Resource" abstract="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Resource"/>
<details key="kind" value="empty"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="comments" upperBound="-1"
eType="#//Thread" eOpposite="#//Thread/author">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="comments"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="email" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="email"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="name"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="topics" upperBound="-1"
eType="#//Topic" eOpposite="#//Topic/resources">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="topics"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Thread">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Thread"/>
<details key="kind" value="elementOnly"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="items" upperBound="-1"
eType="#//ThreadItem" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="items"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="author" eType="#//Resource"
eOpposite="#//Resource/comments">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="author"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="postDate" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Date">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="postDate"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="subject" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="subject"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ThreadItem">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="ThreadItem"/>
<details key="kind" value="empty"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="author" eType="#//Resource">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="author"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="body" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="body"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="itemPostDate" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Date">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="itemPostDate"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Topic">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="Topic"/>
<details key="kind" value="elementOnly"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="comments" upperBound="-1"
eType="#//Thread" containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="comments"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="duration" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" defaultValueLiteral="0"
unsettable="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="duration"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="endDate" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Date">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="endDate"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="name"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="percentComplete" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="percentComplete"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="priority" unique="false"
eType="#//Priority" defaultValueLiteral="ZERO" unsettable="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="priority"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="resources" upperBound="-1"
eType="#//Resource" eOpposite="#//Resource/topics">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="resources"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Date">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="startDate"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="subtopics" upperBound="-1"
eType="#//Topic">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attribute"/>
<details key="name" value="subtopics"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
</ecore:EPackage>
Nous verrons dans le prochain article un métamodèle de mindmap simplifié.
"Lire c’est recréer l’âme des choses, écrire c’est fabriquer un nid pour les oeufs de la mémoire."
Ernest Pépin
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Eclipse Modeling Framework (EMF) : revoyons les fondamentaux
L'OMG nous a promis MDA (Model Driven Architecture). Ce framework permet de spécifier des applications avec un haut niveau d'abstraction appelé PIM (Platform Independent Model).
Les technologies de transformation comme on en a vu un exemple dans notre article "Tutoriel de transformation de modèles avec ATL (ATLAS Transformation Language)" permettent de convertir un PIM en PSM (Platform Specific Model) c'est à dire en modèle propre au choix d'implémentation de code.
MDA inclu plusieurs normes :
- UML(Unified Modeling Language)
- MOF (Meta-Object Facility)
- XMI (XML Metadata Interchange)
- QVT (Query View Transform)
Tout cela est bien beau mais malheureusement cela reste à l'état de rêve, car la réalité est tout autre.
En effet, quand on regarde d'un peu plus près, on s'aperçoit que le MOF (métamétamodèle), l'infrastructure d'UML 2 entièrement spécifiée en OCL (Object Constraint Language) sont d'une extrême complexité.
D'autre part il n'existe aucun outil supportant entièrement la norme QVT, le langages de transformation de l'OMG. Il existe bien par exemple un plugin pour Eclipse QVTO (QVT Operational) mais encore rien ou presque pour QVTD (QVT Declarative) qui est le plus intéressant.
Bref, l'OMG a eu les yeux plus gros que le ventre et a été pris d'ambitions démesurées. Ce qui a eu pour résultats des normes trop complexes à réaliser et au final aucun outil réellement opérationnel.
EMF est au contraire, un cadre de pensée simple et pragmatique ayant pour objectifs la génération de code et les manipulations de modèles avec de nombreux retours d'expérience positifs.
EMF contribue largement aujourd'hui à l'Ingénierie Dirigée par les Modèles (IDM ou MDE Model Driven Engineering).
Contrairement à ce que pense de nombreux développeurs, les modèles ne servent pas seulement à la documentation, mais permettent de générer des applications.
Tous les programmes manipulent des modèles de données en UML, XML Schema, ...
Le projet "Eclipe Modeling Project" regroupe :
- EMF
- CDO (Connected Data Objects),
- Sirius qui vous permet de créer facilement votre propre environnement de modélisation graphique,
- GMF,
- Graphiti pour réaliser rapidement des éditeurs de diagrammes,
- Ecore Tools pour concevoir des modèles Ecore,
- OCL,
- Papyrus un environnement permettant d'éditer tous les types de modèles EMF et supporte tout particulièrment UML et SysML.
- XML Schema Definition (XSD)
- ATL (ATLAS Transformation Language)
- MMT (Model-to-Model Transformation) avec ATL, QVT Operational (Impératif) et QVTd (Declarative) à l'état embryonnaire
- ...
EMF est un métamétamodèle définissant les concepts d'objets, d'attributs, d'opérations, de relations entre les objets et des contraintes qui sont représentés par un diagramme de classe UML 2.
EMF peut définir :
- des interfaces Java
- des diagrammes de classe UML 2
- des XSD
A vous de choisir une de ces 3 représentaions et EMF vous donne les 2 autres ainsi que le code Java implémenté.
Tous les modèles sont donc des instances d'Ecore.
Ecore dispose d'un format de persistance XMI avec les fichiers ".ecore".
Il existe une alternative en utilisant une partie du MOF : EMOF Essential MOF avec les fichiers ".emof"
Toutes les méta classes (EObject, ...) ont une implémentation Java avec leurs attributs et méthodes (voir la javadoc Ecore).
"La prière est le plus grand rempart de l'âme."
Saint Augustin
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Tutoriel Papyrus : vos diagrammes UML 2 comme à l'époque des manuscrits de l'antiquité !
Papyrus est un ensemble de plugins Eclipse faisant partie du projet Eclipse Modeling Project.
Il s'agit d'un nouvel environnement pour éditer tout type de modèle EMF (Eclipse Modeling Framework) et tout particulièrment UML 2 (Unified Modeling Language la norme de l'OMG).
La version supportée 2.4.1 est presque la dernière (2.5). Cela nous satisferait déjà, mais cerise sur le gateau, Papyus supporte SysML (System Modeling Language), ce qui est particulièrement intéressant pour les diagrammes d'exigences et les diagrammes paramétrés. MARTE (Modeling and Analysis of Real-Time and Embedded systems) est aussi intégré.
Papyrus offre des fonctions avancées pour créer des profils UML afin de définir des éditeurs DSL (Domain Specific Language).
Une manière d'installer Papyrus a été vue lors de notre article "Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language) pour voir la vraie vie".
- Ouvrez la perspective Papyrus.
- File - New - Papyrus Project - nommez le projet : PapyrusFamilies - Next - choisissez UML - Next - Cochez UML Diagram (vous pourriez sélectionner les 13 diagrammes UML 2) - Sélectionnez A UML model with primitive types (ModelWithBasicTypes) - Finish
- Dans la vue Project Explorer, double cliquez sur di (model.di), l'éditeur Papyrus Editor Core s'ouvre avec la palette, permettant de créer des packages, classes, attributs, relations, opérations, ...
- Pour créer un élément il suffit de faire un drag&drop.
- Le bandeau d'Eclipse contient un bouton proposant des options d'alignement.
- La vue Model Explorer permet avec les menus contextuels d'ajouter des nouveaux diagrammes.
- La partie Edges de la palette permet de créer tous les types de relations.
- Un clic droit sur une relation - Format -Line Style permet de choisir des styles de trait.
Le framework EMF permet d'importer des métamodèle Ecore (voir article "Ingénierie Dirigée par les Modèles (IDM) : tutoriel Eclipse Ecore, le corps à corps avec les méta modèles"), des métamodéles UML, ...
Pour créer des modèles UML instances de métamodèles UML, on utilisera donc les outils EMF.
Nous reviendrons sur les 13 diagrammes UML 2 avec Papyrus, sur la création de profils UML, nous aborderons SysML, l'utilisation de Papyrus avec ATL et QVTO (Query View Transform Operational le langage de transformation de modèles normalisé OMG et concurrent d'ATL) et en déssert un comparatif entre ATL et QVTO mais cela est une autre histoire.
"Les gagnants ne lâchent jamais et les lâcheurs ne gagnent jamais."
Vince Lombardi
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
Ingénierie Dirigée par les Modèles (IDM) : tutoriel Eclipse Ecore, le corps à corps avec les méta modèles
Si vous avez manquez le début, résumé des épisodes de la 1ère saison de notre série estivale qui nous a fait voyagé dans les modèles, les méta, les métamétamodèles et leurs transformations avec ATL (ATLAS Transformation Language).
L'objectif était de transformer les membres d'une famille (père, mère, fils et filles) en simples personnes en précisant le sexe.
Nous sommes partis d'un métamodèle "Families" sérialisé en XMI et conforme au métamétamodèle Ecore d'Eclipse Modeling Framework (EMF), nous avons écrit avec ATL, les règles de transformation vers le métamodèle "Persons" en XMI et conforme à Ecore.
Et enfin pour tester, nous avons "peuplé" la famille en utilisant un modèle en XMI instanciant le métamodèle "Families", puis exécuté la transformation ATL pour obtenir un modèle d'instances de "Persons généré en XMI.
Je vous propose un flashback et de voir comment a été créé ce métamodèle "Families" en XMI passé en entrée de notre transformation et comment on a créé un modèle d'objets XMI (lui aussi en entrée de transformation) instance de ce métamodèle.
A vos marques, prêt partez, démarrez Eclipse Modeling Tools (voir le tutoriel sur l'installation dans l'article "Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language) pour voir la vraie vie").
- Optez pour la perspective "Modeling"
- File - New - Other - Eclipse Modeling Framework - Ecore Modeling Project
- Name - MetaModeleFamilies - Next - Next
- Sélectionnez tous les viewpoints qui permettent d'avoir par la suite toutes les fonctionnalités (diagrammes, tables, documentation, génération d'éditeurs, ...) - Finish
Vous obtenez dans votre projet, 3 fichiers :
- metaModeleFamilies.aird
- metaModeleFamilies.ecore
- metaModeleFamilies.genmodel
Un nouveau plugin Sirius, développé en collaboration avec la société Obeo, que nous n'avons pas encore installé (mais ça ne serait tardé), permet à votre modèle d'être accessible par tous les éditeurs de votre projet.
Les "viewpoint" sont différentes représentations de votre métamodèle Ecore :
- Clic droit sur le projet - Viewpoints Selection permet de choisir des représentations (sélectionnez les 4 : Archetype, Design, Generation et Review)
Toutes ces représentations sont stockées dans le fichier .aird
- Clic droit sur le EPackage metaModeleFamilies de metaModeleFamilies.ecore - New Representation permet d'avoir le metaModeleFamilies class diagram, ...
- Même chose pour metaModeleFamilies.genmodel
Un modèle d'un autre projet peut être chargé :
- Sous le projet MetaModeleFamilies - Project Dependencies - Clic droit - Add model
Pour créer un diagramme à partir d'un fichier Ecore :
- Clic droit sur le fichier Ecore - Initialize Ecore Diagram ...
- Design Entities - platform ... - sélectionnez votre métamodèle Ecore - Nommez votre diagramme de classe
- Un diagramme de classe vide est alors créé.
- Clic droit dans le diagramme de classe - Add related Elements - Sélectionnez toutes les classes du métamodèle Ecore existant.
- La 1ère icône en haut à gauche du diagramme Arrange all permet de mieux disposer les éléments de modélisation mais pas dans le cas où il y aurait plusieurs relations entre 2 classes, elles apparaîtront toutes superposées, il vous faudra mettre la main à la pâte pour les séparer !
- L'Entities Diagram Editor permet de créer, de modifier et de visualiser le métamodèle Ecore. Mais attention, il n'est pas synchronisé automatiquement avec toutes les EClasses du EPackage, mais seulement celles qui ont été sélectionnées soit par drag&drop du Model Explorer dans le diagramme, soit par Add de la palette ou bien encore par le menu contextuel Add Related Elements.
Sinon vous vous pouvez ajouter des EClasse, ... grâce à la Palette dans un nouveau fichier Ecore vide :
- Drag&Drop Eclasse dans le diagramme
- Pour modifier les propriétés soit directement dans la vue Properties, soit en double cliquant sur la EClasse.
- Nommez votre EClasse Family
Pour ajouter un attribut et le typer :
- Double cliquer sur le fichier Ecore (.ecore)
- Dans l'onglet "metaModeleFamilies.ecore", dans le package puis dans la classe "Family", clic droit New Child - EAttribute
- Sélectionner le nouvele attribut "null"
- Dans la vue Properties, dans EType, sélectionner EString et dans Name saisir "lastName " (si vous ne mettez pas de type, la validation du modèle ne se fait pas et la classe reste en rouge !)
De la même manière créez la classe Member avec l'attribut fisrtName.
Créez les relations bi-directionnelles (voir le diagramme en début de cet article).
- Sélectionnez dans la palette Relation - Bi-directionnal Reference
- Modifiez directement dans le diagramme, d'abord coté Family puis Member, les cardinalités et les rôles en cliquant dans les zones des rôles et en saisissant la cardinalité par ex. 0..* et le libellé du rôle
- Sélectionnez la relation - Containment dans les Properties pour avoir une relation de composition entre le composite Family et ses composants Member.
Dans l'icône Layers en haut du diagramme, si Validation est cochée alors une erreur dans le modèle (par exemple un oubli de typer un attribut) provoque l'affichage en rouge de l'élément erroné (dans ce cas la classe de l'attribut).
En laissant la souris un moment sur l'élément en rouge, un tooltip apparaît mentionnant la cause de l'erreur.
Pour visualiser la sérialisation XMI du métamodèle metaModeleFamilies.ecore :
Clic droit - Open With - Text Editor
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="metaModeleFamilies" nsURI="http://www.example.org/metaModeleFamilies"
nsPrefix="metaModeleFamilies">
<eClassifiers xsi:type="ecore:EClass" name="Family">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="lastName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="father" lowerBound="1"
eType="#//Member" containment="true" eOpposite="#//Member/familyFather"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="mother" lowerBound="1"
eType="#//Member" containment="true" eOpposite="#//Member/familyMother"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="sons" upperBound="-1" eType="#//Member"
containment="true" eOpposite="#//Member/familySon"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="daughters" upperBound="-1"
eType="#//Member" containment="true" eOpposite="#//Member/familyDaughter"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Member">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="firstName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyFather" eType="#//Family"
eOpposite="#//Family/father"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyMother" eType="#//Family"
eOpposite="#//Family/mother"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familySon" eType="#//Family"
eOpposite="#//Family/sons"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyDaughter" eType="#//Family"
eOpposite="#//Family/daughters"/>
</eClassifiers>
</ecore:EPackage>
Une fois le métamodèle Families conforme au métamétamodèle Ecore finalisé, il ne reste plus qu'à générer un modèle d'instances.
- Double cliquez sur le fichier metaModeleFamilies.genmodel
- Clic droit sur la racine - Generate All (les classes Java + les 2 éditeurs sous forme de nouveaux plugins Eclipse servant à la création du modèle)
- Vérifiez que les classe Java sont générées dans src (3 packages suivant le pattern de la programmation par contrat : interfaces, implémentations et utilitaires).
- 3 projets sont créés : MetaModeleFamilies.edit , MetaModeleFamilies.editor, MetaModeleFamilies.tests
Exécuter le premier éditeur :
- Clic droit sur MetaModeleFamilies.edit - Run As - Eclipse Application
- Un nouvel Eclipse se lance.
- Créez un projet vide : File - New - Project (dans General) - Nommez le ModeleFamilies
- Clic droit sur le projet - File - New - Example EMF Model Creation Wizards - Sélectionnez votre métamodèle MetaModeleFamilies Model - Next - sélectionnez votre projet ModeleFamilies - Nommez votre modèle : PremierModele.metamodelefamilies (remarquez l'extension correspondant à votre métamodèle) - Next - Model Object : Family (le composite) - Finish
- Dans la fenêtre de l'éditeur - Sélectionnez Family (sous la racine platform) - dans Properties : LastName=Dupond - Clic droit - New Child : Father Member - FisrtName=Jean
- Répéter la même opération pour les autres membres de la famille : mère=Alexandra, 1er fils=Pierre, 2ème fils=Paul, 1ère fille=Louane, 2ème fille=Manon
- Sauvegarder Tout
- Clic droit sur le fichier PremierModele.metamodelefamilies - Open With - Text Editor et vérifier que l'on a bien la sérialisation XMI désirée :
<metaModeleFamilies:Family xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:metaModeleFamilies="http://www.example.org/metaModeleFamilies" lastName="Dupond">
<father firstName="Jean"/>
<mother firstName="Alexandra"/>
<sons firstName="Pierre"/>
<sons firstName="Paul"/>
<daughters firstName="Louane"/>
<daughters firstName="Manon"/>
</metaModeleFamilies:Family>
Ce fichier peut servir en entrée de notre transformation ATL de nos précédents articles.
"Les femmes détestent les hommes trop prévisibles, elles adorent un certain coefficient de surprise."
Antonio Lobo Antunes
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/