Vous êtes sur la page 1sur 21

5/23/2017 Tutoriel 

sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Forums  Tutoriels  Magazine  FAQs  Blogs  Chat  Newsletter  Études  Emploi   Rechercher
Club  Contacts

Vos recrutements informatiques
700 000 développeurs, chefs de projets, ingénieurs, informaticiens...
Contactez notre équipe spécialiste en recrutement

Accueil ALM Java .NET Dév. Web EDI Programmation SGBD Office Solutions d'entreprise Applications Mobiles

Systèmes EDI   4D   Delphi   Eclipse   LabVIEW   NetBeans   MATLAB   Scilab   Visual Studio   WinDev   Visual Basic 6   Lazarus

Qt Creator

Actualités Eclipse   Forums Eclipse   FAQ Eclipse   Tutoriels Eclipse   Livres Eclipse   Outils, EDI & API Eclipse

Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Table des matières

I. Introduction
I­A. Connaissances requises
I­B. Prérequis logiciel
II. Exercice 1 : Création du modèle EMF d'un carnet d'adresses
II­A. But
II­B. Description
II­C. Étapes à suivre
III. Exercice 2 : Génération de codes Java
III­A. But
III­B. Description
III­C. Etapes à suivre
IV. Exercice 3 : Création d'instances via l'éditeur généré
IV­A. But
IV­B. Description
IV­C. Étapes à suivre
V. Exercice 4 : Création d'instances via l'API EMF : EarlyBinding
V­A. But
V­B. Description
V­C. Étapes à suivre
VI. Exercice 5 : Manipulation du métamodèle Ecore : LateBinding
VI­A. But
VI­B. Description
VI­C. Interroger le métamodèle Ecore
VI­D. Création d'instances via le métamodèle Ecore
VII. Conclusion et remerciements

Le but de cet atelier est d'apprendre à manipuler le framework de modélisation d'Eclipse appelé EMF. Nous couvrirons tous les
aspects liés aux développements dirigés par les modèles avec les briques logiciels fournies par la plateforme Eclipse.

conception de modèles EMF,
génération de code Java,
manipulation d'API EMF pour instancier le modèle,
manipulation du métamodèle Ecore,
sauvegarde et chargement de fichiers XMI.

Les sources des exemples sont disponibles ici.

Pour réagir à cet article, un espace de dialogue vous est proposé sur le forum 7 commentaires  .

Article lu 20517 fois.

L'auteur

Mickael Baron

L'article

Publié le 17 juin 2013 ­ Mis à jour le 18 novembre 2014 

Version PDF Version hors­ligne
I. Introduction▲
ePub, Azw et Mobi

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 1/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
Liens sociaux Cet article se présente sous la forme d'un atelier composé de cinq exercices
guidés :
         Partager   un premier exercice s'intéresse à la construction d'un modèle EMF,
un deuxième exercice montre comment générer du code Java et des outils
d'assistance à partir du modèle EMF,
le troisième exercice explique comment instancier le modèle EMF à partir
d'un éditeur graphique généré,
le quatrième exercice présente l'instanciation du modèle EMF en utilisant
directement les codes Java générés (technique appelée EarlyBinding),
le dernier exercice présente l'instanciation du modèle EMF en utilisant le
métamodèle Ecore (technique appelée LateBinding).

I­A. Connaissances requises▲
Cet article suppose que vous possédez quelques notions théoriques sur les aspects
liés à l'Ingénierie Dirigée par les Modèles (IDM). Vous pouvez parcourir cet article
pour vous familiariser sur les concepts de modèles et des métamodèles.

De même sur les aspects pratiques, je vous recommande de parcourir mon
support de cours consacré aux technologies EMF dédiées à l'IDM.

Enfin, quelques notions sur la programmation Java et sur la construction de
plugins avec la plate­forme Eclipse seraient un plus.

I­B. Prérequis logiciel▲
Pour reproduire les exemples de cet article, vous aurez besoin d'une version
Eclipse contenant la plupart des plugins dédiés à la modélisation. Vous pourrez
ainsi vous baser sur la distribution Eclipse Modeling Tools disponible sur le site
de la fondation Eclipse.

II. Exercice 1 : Création du modèle EMF d'un carnet d'adresses▲

II­A. But▲
Trois principaux objectifs seront visés :

démarrer un projet EMF ;
créer un modèle EMF avec les outils d'Eclipse ;
manipuler les différents éditeurs.

II­B. Description▲
L'exemple qui illustre cet article est un carnet d'adresses. Ce dernier est identifié
par un nom et contient une liste de personnes (contains). Une personne est
identifiée par un prénom, un nom et un âge. Une personne contient
obligatoirement une adresse (location). Une adresse est identifiée par un numéro
et un nom de rue.

Le modèle UML donné ci­dessous représente graphiquement la modélisation
attendue pour cet exercice. Nous nous intéressons ici à créer le modèle UML
présenté via les outils d'Eclipse.

Modélisation UML d'un carnet d'adresses

II­C. Étapes à suivre▲
Démarrer l'environnement de développement Eclipse contenant les plugins
de modélisation puis créer un nouveau Workspace (workspaceEMF) afin de

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 2/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
disposer d'un répertoire spécifique à la modélisation.
Pour afficher les vues Eclipse spécifiques à la modélisation EMF, ouvrir la
perspective Ecore.

Créer un nouveau projet EMF vide (File ­> New ­> Project … ­> Eclipse
Modeling Framework ­ > Empty EMF Project) et nommer le projet
eclipse.emf.addressbook.

Sélectionner le répertoire model et créer un diagramme Ecore (Ecore
Diagram). Nommer le fichier ecore addressbook.ecore.

Construire les trois classes, définir tous les attributs et créer les
associations entre les classes. Veuillez respecter les contraintes de
cardinalités exprimées sur le modèle UML précédent. Aidez­vous de la vue
Properties afin de spécifier les cardinalités voulues.

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 3/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Vous pouvez visualiser votre modèle sous différentes représentations via
l'utilisation d'éditeurs adaptés : OCLinEcore (Ecore) Editor et Sample Ecore Model
Editor. Bien entendu, cette liste n'est pas exhaustive et d'autres éditeurs sont
également disponibles. Il suffira juste d'installer les plugins adéquates si
nécessaires.

Visualisation du modèle EMF Carnet d'adresses via l'éditeur
OCLinEcore

Visualisation du modèle EMF Carnet d'adresses via l'éditeur Sample
Ecore Model Editor

Visualiser finalement votre modèle au format XML, vous remarquerez qu'il
s'agit d'un fichier XMI dont les données correspondent à des instances du
métamodèle Ecore. Nous reviendrons sur cette notion dans les prochaines
sections.

 
Sélectionnez
1. 
2. 
3. 
4. 

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 4/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
5. 
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 
24. 
25. 
<?xml version="1.0" encoding="UTF‐8"?>
<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="addressbook" 
    nsURI="http://addressbook/1.0" nsPrefix="addressbook"> 
  <eClassifiers xsi:type="ecore:EClass" name="AddressBook"> 
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType
    <eStructuralFeatures xsi:type="ecore:EReference" name="contains" upperBound="‐1" 
        eType="#//Person" containment="true"/> 
  </eClassifiers> 
  <eClassifiers xsi:type="ecore:EClass" name="Person"> 
    <eOperations name="display" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ES
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="familyName" eType="ecore:EDataType
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="firstName" eType="ecore:EDataType
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="age" eType="ecore:EDataType
    <eStructuralFeatures xsi:type="ecore:EReference" name="location" lowerBound="1" 
        eType="#//Address" containment="true"/> 
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="identifier" eType="ecore:EDataType
        changeable="false" volatile="true" transient="true" derived="true"/> 
  </eClassifiers> 
  <eClassifiers xsi:type="ecore:EClass" name="Address"> 
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" eType="ecore:EDataType
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="street" eType="ecore:EDataType
  </eClassifiers> 
</ecore:EPackage> 

III. Exercice 2 : Génération de codes Java▲

III­A. But▲
Quatre principaux objectifs seront visés :

Créer un modèle de génération à partir d'un Ecore ;
Paramétrer le modèle de génération de code ;
Générer un code Java correspondant au modèle EMF ;
Mettre à jour modèle, re­générer le code et modifier le code généré.

III­B. Description▲
Nous nous intéressons maintenant à toutes les étapes de génération de code à
partir d'un modèle EMF. Nous nous intéressons également aux étapes de re­
génération et de protection des codes modifiés par le développeur. Un modèle
supplémentaire est requis et dédié à cette tâche. Il contient les informations
dédiées uniquement à la génération et qui ne pourraient pas être intégrées au
modèle EMF (chemin de génération, package, préfixe…). Ce modèle appelé
genmodel est également un modèle EMF et chaque classe du modèle de
génération est un décorateur des classes Ecore.

III­C. Etapes à suivre▲
Créer un modèle de génération (New ­> Other… ­> Eclipse Modeling
Framework ­> EMF Generator Model), sélectionner ensuite le répertoire
model du projet eclipse.emf.addressbook puis nommer le fichier
addressbook.genmodel.

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 5/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Sélectionner ensuite Ecore model comme type de modèle utilisé pour créer
ce modèle de génération.

Sélectionner enfin le fichier addressbook.ecore (à partir de la navigation du
Workspace courant Browse Workspace…) puis terminer.

Modifier le contenu du fichier genmodel pour que le package de génération
soit eclipse.emf.addressbook.model (propriétés : Base Package). Utiliser
pour cela la vue Properties en modifiant l'attribut Base Package.

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 6/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Sélectionner depuis le fichier genmodel le package racine Addressbook et
générer le code Java correspondant au modèle (Generate Model Code). Un
ensemble de classes Java doivent être générées dans le package
eclipse.emf.addressbook.model.addressbook.
Examiner les classes générées et remarquer le découpage en trois
catégories qui font apparaître une programmation par contrats : interfaces,
implémentations et classes utilitaires.

Nous décidons par la suite de modifier le modèle de façon à :

ajouter un attribut dérivé dans Person appelé identifier de type String qui
retourne une chaîne de type (firstName + familyName + age),
ajouter une opération String display() qui se chargera d'effectuer un
affichage complet d'une instance de Person.

Le schéma ci­dessous représente graphiquement la modélisation attendue par
cette modification.

Compléter votre modèle EMF (via l'éditeur Ecore Diagram Editing par
exemple) de façon à intégrer les modifications demandées. Pour l'attribut
identifier, déclarer le Derived, Volatile, Transient et non Changeable.

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 7/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
Cela a pour effet pour l'attribut identifier :

derived : calculé à partir d'autres attributs,
volatile : ne génère par l'attribut pour stocker l'état, le corps de la méthode
est également laissé à vide,
transient : ne sera pas sauvegardé,
changeable : valeur pouvant changer

Le fichier addressbook.ecore est automatiquement impacté. Toutefois, le
fichier genmodel doit être explicitement mis à jour. Sélectionner le fichier
addressbook.genmodel puis cliquer sur Reload (via le menu contextuel).
Sélectionner ensuite Ecore model et laisser les valeurs par défaut puis
valider. Vous remarquerez que les nouveaux attributs ont été ajoutés et que
les anciennes valeurs de configuration de génération (Base Package en
l'occurrence) n'ont pas été supprimées.
Impacter la classe
eclipse.emf.addressbook.model.addressbook.impl.PersonImpl de façon à
implémenter les méthodes getIdentifier() et display(), voir le code ci­
dessous.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 
        /** 
     * <!‐‐ begin‐user‐doc ‐‐> 
     * <!‐‐ end‐user‐doc ‐‐> 
     * @generated NOT 
     */ 
    public String getIdentifier() { 
        return this.getFirstName() + this.getFamilyName() + this.getAge(); 
    } 
 
    /** 
     * <!‐‐ begin‐user‐doc ‐‐> 
     * <!‐‐ end‐user‐doc ‐‐> 
     * @generated NOT 
     */ 
    public String display() { 
        StringBuffer sb = new StringBuffer(); 
        sb.append("FirstName:").append(this.getFirstName()) 
            .append(" FamilyName:").append(this.getFamilyName()) 
            .append(" Age:").append(this.getAge()) 
            .append(" Address:").append(this.getLocation()); 
 

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 8/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
        return sb.toString(); 
    } 

Remarquer que l'en­tête des méthodes getIdentifier() et display() contient
l'annotation @generated NOT. Cette dernière annotation permet d'empêcher que
le code modifié par le développeur soit écrasé par la génération.

Re­générer les codes Java (Generate Model Code) et s'assurer que le code
saisi n'a pas été modifié.

IV. Exercice 3 : Création d'instances via l'éditeur généré▲

IV­A. But▲
Quatre principaux objectifs seront visés :

Générer un éditeur graphique ;
Exécuter une configuration d'exécution ;
Créer des instances via l'éditeur généré ;
Valider des contraintes.

IV­B. Description▲
Nous allons maintenant générer le code correspondant à un éditeur graphique. Cet
éditeur sera utilisé pour créer graphiquement des instances de notre modèle.
Nous vérifierons par ailleurs la validité de notre modèle par rapport à un jeu
d'instances.

IV­C. Étapes à suivre▲
À partir du modèle de génération (genmodel), ouvrir l'éditeur EMF
Generator et générer le code de l'éditeur (Generate Edit Code et Generate
Editor Code).

Deux plugins doivent être créés (eclipse.emf.addressbook.edit et
eclipse.emf.addressbook.editor).

Passer en perspective Java et créer une configuration d'exécution (Run ­>
Run Configurations…) à partir d'un type Eclipse Application. Nommer cette

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 9/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
configuration AddressBookConfiguration, puis modifier la valeur de son
chemin avec cette valeur (${workspace_loc}/runtime­
AddressBookConfiguration).

Ajouter à cette configuration d'exécution les trois plugins (addressbook, edit
et editor).
Décocher Target Platform puis faites Add Required Plug­ins.
Ajouter enfin le plugin org.eclipse.ui.ide.application et
org.eclipse.ui.navigator.resources et faites une nouvelle fois Add Required
Plug­ins.

Exécuter cette configuration d'exécution. Une nouvelle instance d'Eclipse
s'exécute en intégrant votre éditeur de modèle de carnet d'adresse.
Créer un simple projet (File ­> New ­> Project… ­> General ­> Project) que
vous appellerez AddressBookSampleInstances.
À partir de cette nouvelle instance, créer une instance du modèle
AddressBook (File ­> New ­> Other… ­> Example EMF Model Creation
Wizards ­> Addressbook Model) que vous appellerez Sample.addressbook.
Choisir ensuite Address Book comme modèle objet à créer.

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 10/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Construire les instances via l'éditeur associé à votre modèle en s'appuyant
sur les instances données ci­dessous.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
11. 
<addressbook:AddressBook ...> 
  <contains familyName="DUPONT" firstName="Raoul" age="37"> 
    <location number="1" street="Rue DotNet"/> 
  </contains> 
  <contains familyName="BARON" firstName="Mickael" age="36"> 
    <location number="50" street="Place de Java"/> 
  </contains> 
  <contains familyName="SARPOL" firstName="John" age="38"> 
    <location number="50" street="Square Express"/> 
  </contains> 
</addressbook:AddressBook> 

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 11/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

Sélectionner le nœud racine de vos instances et valider ces instances en
cliquant sur Validate (via le menu contextuel).

V. Exercice 4 : Création d'instances via l'API EMF : EarlyBinding▲

V­A. But▲
Trois principaux objectifs seront visés :

Créer des instances via l'API EMF ;
Créer un plugin (fragment) de test ;
Sauvegarder et charger via l'API EMF des instances via un XMI.

V­B. Description▲
Nous allons, dans cet exercice, créer des instances d'un modèle de manière
programmatique. Dans ce cas les plugins générés précédemment (Edit et Editor)
ne seront pas utilisés. Nous utiliserons un plugin spécifique appelé fragment
(utilisé pour enrichir un plugin existant) pour créer des classes de tests.

V­C. Étapes à suivre▲
Créer un nouveau plugin de type fragment (File ­> New ­> Other…­> Plug­
in Development ­> Fragment Project) nommé eclipse.emf.addressbook.test.
Choisir comme plugin hôte eclipse.emf.addressbook (créé dans la section
II). Une fois le fragment créé, ajouter la dépendance vers le plugin
org.junit (4.8.2) (onglet Dependencies quand le fichier MANIFEST.MF est en
cours d'édition).
Créer un package eclipse.emf.addressbook.model.test et créer une classe
appelée AddressBookTest.
Depuis AddressBookTest compléter la méthode de tests
createAddressBookTest en s'assurant que les assertions associées soient
vraies.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 12/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
24. 
25. 
26. 
27. 
28. 
29. 
30. 
31. 
32. 
33. 
34. 
35. 
36. 
37. 
38. 
39. 
40. 
41. 
42. 
43. 
44. 
45. 
46. 
public class AddressBookTest { 
    @Test 
    public void createAddressBookTest() { 
        AddressBook createAddressBook = AddressbookFactory.eINSTANCE.createAddressBook
        createAddressBook.setName("Mon Carnet d'Adresses"); 
 
        Address createMBAddress = AddressbookFactory.eINSTANCE.createAddress(); 
        createMBAddress.setNumber(50); 
        createMBAddress.setStreet("Place de Java"); 
        Person mickaelBaron = AddressbookFactory.eINSTANCE.createPerson(); 
        mickaelBaron.setAge(36); 
        mickaelBaron.setFamilyName("BARON"); 
        mickaelBaron.setFirstName("Mickael"); 
        mickaelBaron.setLocation(createMBAddress); 
 
        Address createDRAddress = AddressbookFactory.eINSTANCE.createAddress(); 
        createDRAddress.setNumber(1); 
        createDRAddress.setStreet("Rue DotNet"); 
        Person raoulDupont = AddressbookFactory.eINSTANCE.createPerson(); 
        raoulDupont.setAge(37); 
        raoulDupont.setFamilyName("DUPONT"); 
        raoulDupont.setFirstName("Raoul"); 
        raoulDupont.setLocation(createDRAddress); 
 
        Address createSJAddress = AddressbookFactory.eINSTANCE.createAddress(); 
        createSJAddress.setNumber(50); 
        createSJAddress.setStreet("Square Express"); 
        Person johnSarpol = AddressbookFactory.eINSTANCE.createPerson(); 
        johnSarpol.setAge(38); 
        johnSarpol.setFamilyName("SARPOL"); 
        johnSarpol.setFirstName("John"); 
        johnSarpol.setLocation(createSJAddress); 
 
        createAddressBook.getContains().add(mickaelBaron); 
        createAddressBook.getContains().add(raoulDupont); 
        createAddressBook.getContains().add(johnSarpol); 
 
        Assert.assertEquals(3, createAddressBook.getContains().size()); 
        Assert.assertEquals("Mon Carnet d'Adresses", createAddressBook.getName()); 
        Assert.assertEquals("BARON", mickaelBaron.getFamilyName()); 
        Assert.assertEquals("Raoul", raoulDupont.getFirstName()); 
        Assert.assertEquals("JohnSARPOL38", johnSarpol.getIdentifier()); 
         
        ... 
    } 

Les instances des classes sont obtenues par l'utilisation de la fabrique
AddressbookFactory (ligne 4). Le reste des modifications ne vous sera pas
étranger.

Pour l'exécution du test unitaire, il doit se faire obligatoirement dans un
environnement de plugins (Run As JUnit Plug­in Test).

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 13/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

On s'intéresse maintenant à sauvegarder et charger le contenu des instances
depuis un fichier XMI.

Compléter la méthode de tests de manière à sauvegarder les instances
créées précédemment (voir code ci­dessous). Vous adapterez le chemin de
sauvegarde du fichier APISample.addressbook (ligne 6) en rapport avec
celui utilisé pour sauvegarder Sample.addressbook. Le fichier d'instances
sera stocké dans le répertoire utilisé par la configuration d'exécution de
l'exercice 3.

 
Sélectionnez
44. 
45. 
46. 
47. 
48. 
49. 
50. 
51. 
52. 
53. 
54. 
55. 
56. 
57. 
58. 
59. 
60. 
61. 
62. 
        ... 
        ResourceSet resourceSet = new ResourceSetImpl(); 
        resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("addressbook
                  new XMIResourceFactoryImpl()); 
 
        final String apiSamplePath = "D://workspaceEMF_BARON_Mickael//runtime‐  
                      AddressBookConfiguration//AddressBookSampleInstances//"; 
        URI uri = URI.createURI("file:/" + apiSamplePath + "APISample.addressbook"); 
        Resource resource = resourceSet.createResource(uri); 
        resource.getContents().add(createAddressBook); 
        try { 
            resource.save(null); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        Assert.assertTrue(new File(apiSamplePath + "APISample.addressbook").exists());
        ... 
    } 

Faites attention à importer le bon package pour la classe URI (import
org.eclipse.emf.common.util.URI; et non import java.net.URI;).

Ajouter dans votre plugin la dépendance vers le plugin
org.eclipse.emf.ecore.xmi et exécuter le test unitaire.
Compléter la méthode de tests de manière à charger les instances (fichier
Sample.addressbook) créées au début de l'exercice 3, voir ci­dessous le
résultat du code.

 
Sélectionnez
60. 
61. 
62. 

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 14/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
63. 
64. 
65. 
        ... 
        resourceSet = new ResourceSetImpl(); 
        uri = URI.createURI("file:/" + apiSamplePath + "Sample.addressbook"); 
        resource = resourceSet.getResource(uri, true); 
        createAddressBook = (AddressBook) resource.getContents().get(0); 
        Assert.assertEquals("Mon Carnet d'Adresses", createAddressBook.getName()); 

Compléter en début de la méthode de façon à ajouter pour les instances de
type AddressBook un écouteur sur les changements. Ainsi à chaque
changement opéré sur une instance d'AddressBook, le notifieur affichera
l'ancienne et la nouvelle valeur.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
public class AddressBookTest { 
    @Test 
    public void createAddressBookTest() { 
        AddressBook createAddressBook = AddressbookFactory.eINSTANCE.createAddressBook
        createAddressBook.eAdapters().add(new EContentAdapter() { 
 
            @Override 
            public void notifyChanged(Notification notification) { 
                System.out.print("Ancienne Valeur : " + notification.getOldValue()); 
                System.out.println(" Nouvelle Valeur : " + notification.getNewValue());
            } 
        }); 
 
        createAddressBook.setName("Mon Carnet d'Adresses"); 
        ... 
    } 

VI. Exercice 5 : Manipulation du métamodèle Ecore : LateBinding▲

VI­A. But▲
Trois principaux objectifs seront visés :

Manipuler le métamodèle Ecore ;
Créer des instances via le métamodèle Ecore ;
Créer des instances via les outils d'Eclipse.

VI­B. Description▲
Nous allons dans cet exercice manipuler le métamodèle Ecore afin de connaître la
structure de notre modèle (puisque le modèle AddressBook est une instance du
métamodèle Ecore). Nous allons également créer et modifier des instances de
notre modèle via le métamodèle Ecore. Finalement nous sauvegarderons et
chargerons ces instances afin d'obtenir un fichier XMI identique à l'exercice 4.
L'intérêt de cet exercice est d'utiliser une API de type LateBinding où le
métamodèle Ecore est manipulé. Nous présentons à titre indicatif le métamodèle
Ecore.

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 15/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)

VI­C. Interroger le métamodèle Ecore▲
Dans la classe AddressBookTest du fragment eclipse.emf.addressbook.test ajouter
une méthode appelée queryAddressBookStructure. L'objectif de cette méthode est
d'afficher la structure complète de votre modèle en interrogeant le métamodèle.
Le résultat attendu est donné par la capture d'écran ci­dessous.

Le code donné ci­dessous montre comment obtenir un tel résultat. Vous noterez
que le point d'accès au métamodèle se fait par l'intermédiaire du package
AddressbookPackage.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 
24. 
25. 
26. 
27. 
28. 
29. 
30. 
31. 
32. 
33. 
34. 
35. 
36. 
37. 
38. 
39. 
http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 16/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
40. 
41. 
42. 
43. 
44. 
    @Test 
    public void queryAddressBookStructure() { 
        AddressbookPackage addressbookPackage = AddressbookPackage.eINSTANCE; 
        EList<EClassifier> eClassifiers = addressbookPackage.getEClassifiers(); 
 
        for (EClassifier eClassifier : eClassifiers) { 
            System.out.println(eClassifier.getName()); 
            System.out.print("  "); 
 
            if (eClassifier instanceof EClass) { 
                EClass eClass = (EClass) eClassifier; 
                EList<EAttribute> eAttributes = eClass.getEAttributes(); 
                for (EAttribute eAttribute : eAttributes) { 
                    System.out.print(eAttribute.getName() + "(" 
                            + eAttribute.getEAttributeType().getName() + ") "); 
                } 
 
                if (!eClass.getEAttributes().isEmpty() 
                        && !eClass.getEReferences().isEmpty()) { 
                    System.out.println(); 
                    System.out.print("  Références : "); 
 
                    EList<EReference> eReferences = eClass.getEReferences(); 
                    for (EReference eReference : eReferences) { 
                        System.out.print(eReference.getName() + "(" 
                            + eReference.getEReferenceType().getName() + "[" 
                            + eReference.getLowerBound() + ".." 
                            + eReference.getUpperBound() + "])"); 
                    } 
                } 
 
                if (!eClass.getEOperations().isEmpty()) { 
                    System.out.println(); 
                    System.out.print("  Opérations : "); 
 
                    for (EOperation eOperation : eClass.getEOperations()) { 
                        System.out.println(eOperation.getEType().getName() 
                                + " " + eOperation.getName()); 
                    } 
                } 
            } 
            System.out.println(); 
        } 
    } 

VI­D. Création d'instances via le métamodèle
Ecore▲
Pour l'instant, nous avons vu que pour créer des instances du modèle nous
devions utiliser les classes générées, approche dite EarlyBinding. Par réflexivité,
il est possible de créer et modifier des instances du modèle sans avoir à
manipuler explicitement les classes générées. Nous allons montrer comment
réaliser cela.

Construire un projet EMF vide (File ­> Project … ­> Eclipse Modeling
Framework ­> Empty EMF Project) que vous appellerez
eclipse.emf.addressbook.latebinding ;
Ajouter la dépendance vers les plugin org.junit (4.8.2) et
org.eclipse.emf.ecore.xmi ;
Créer ensuite le package eclipse.emf.addressbook.latebinding et finalement
créer la classe
eclipse.emf.addressbook.latebinding.AddressBookLateBinding ;
Copier votre fichier addressbook.ecore réalisé dans le premier exercice
dans le répertoire model de votre nouveau projet ;

Ce nouveau plugin ne contient aucune dépendance vers les plugins créés
précédents.

Créer une méthode de test appelée
queryAddressBookStructureWithoutGeneratedCode dont l'objectif est :
de charger le fichier addressbook.ecore afin de charger le modèle
(accessible via le package racine),
d'afficher la structure du modèle comme précisée dans la question
précédente.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 17/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 
24. 
25. 
26. 
27. 
28. 
29. 
30. 
31. 
32. 
33. 
34. 
35. 
36. 
37. 
38. 
39. 
40. 
41. 
42. 
43. 
44. 
45. 
46. 
47. 
48. 
49. 
50. 
51. 
52. 
53. 
    @Test 
    public void queryAddressBookStructureWithoutGeneratedCode() { 
        Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; 
        Map<String, Object> m = reg.getExtensionToFactoryMap(); 
        m.put("ecore", new XMIResourceFactoryImpl()); 
        ResourceSet resourceSet = new ResourceSetImpl(); 
        URI fileURI = URI.createFileURI("model/addressbook.ecore"); 
        Resource resource = resourceSet.getResource(fileURI, true); 
 
        EPackage ePackage = (EPackage) resource.getContents().get(0); 
 
        EList<EClassifier> eClassifiers = ePackage.getEClassifiers(); 
 
        for (EClassifier eClassifier : eClassifiers) { 
            System.out.println(eClassifier.getName()); 
            System.out.print("  "); 
 
            if (eClassifier instanceof EClass) { 
                EClass eClass = (EClass) eClassifier; 
                EList<EAttribute> eAttributes = eClass.getEAttributes(); 
                for (EAttribute eAttribute : eAttributes) { 
                    System.out.print(eAttribute.getName() + "(" 
                            + eAttribute.getEAttributeType().getName() + ") "); 
                } 
 
                if (!eClass.getEAttributes().isEmpty() 
                        && !eClass.getEReferences().isEmpty()) { 
                    System.out.println(); 
                    System.out.print("  Références : "); 
                } 
 
                EList<EReference> eReferences = eClass.getEReferences(); 
                for (EReference eReference : eReferences) { 
                    System.out.print(eReference.getName() + "(" 
                            + eReference.getEReferenceType().getName() + "[" 
                            + eReference.getLowerBound() + ".." 
                            + eReference.getUpperBound() + "])"); 
                } 
 
                if (!eClass.getEOperations().isEmpty()) { 
                    System.out.println(); 
                    System.out.print("  Opérations : "); 
 
http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 18/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
 
                    for (EOperation eOperation : eClass.getEOperations()) { 
                        System.out.println(eOperation.getEType().getName() 
                                + " " + eOperation.getName()); 
                    } 
                } 
            } 
            System.out.println(); 
        } 
 
    } 

Créer une méthode appelée createAndSaveAddressBookWithMetaModel (voir
code ci­dessous) dont l'objectif est :
de charger le fichier addressbook.ecore correspondant à notre modèle
(accessible via le package racine),
de créer des instances identiques à celles créées pendant l'exercice 4
sans avoir à manipuler explicitement les classes Java du modèle.
Cette façon de procéder est dite Dynamique.

 
Sélectionnez
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 
24. 
25. 
26. 
27. 
28. 
29. 
30. 
31. 
32. 
33. 
34. 
35. 
36. 
37. 
38. 
39. 
40. 
41. 
42. 
43. 
44. 
45. 
46. 
47. 
48. 
49. 
50. 
51. 
52. 
53. 
54. 
55. 
56. 
57. 
58. 
59. 
60. 
61. 
62. 
63. 

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 19/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
64. 
65. 
66. 
67. 
    @Test 
    public void createAndSaveAddressBookWithMetaModel() throws IOException { 
        Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; 
        Map<String, Object> m = reg.getExtensionToFactoryMap(); 
        m.put("ecore", new XMIResourceFactoryImpl()); 
 
        ResourceSet resourceSet = new ResourceSetImpl(); 
        URI fileURI = URI.createFileURI("model/addressbook.ecore"); 
        Resource resource = resourceSet.createResource(fileURI); 
 
        resource.load(null); 
        EPackage ePackage = (EPackage) resource.getContents().get(0); 
 
        EClass eAddressBook = (EClass) ePackage.getEClassifier("AddressBook"); 
        EReference eContains = (EReference) eAddressBook 
                .getEStructuralFeature("contains"); 
        EAttribute eName = (EAttribute) eAddressBook 
                .getEStructuralFeature("name"); 
        EObject addressBookInstance = ePackage.getEFactoryInstance().create( 
                eAddressBook); 
        addressBookInstance.eSet(eName, "Mon Carnet d'Adresses"); 
 
        EClass ePerson = (EClass) ePackage.getEClassifier("Person"); 
        EAttribute eFirstName = (EAttribute) ePerson 
                .getEStructuralFeature("firstName"); 
        EAttribute eFamilyName = (EAttribute) ePerson 
                .getEStructuralFeature("familyName"); 
        EObject personInstance = ePackage.getEFactoryInstance().create(ePerson); 
        personInstance.eSet(eFirstName, "Mickael"); 
        personInstance.eSet(eFamilyName, "BARON"); 
 
        List<EObject> containsList = new ArrayList<EObject>(); 
        containsList.add(personInstance); 
        addressBookInstance.eSet(eContains, containsList); 
 
        resourceSet = new ResourceSetImpl(); 
        resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() 
                .put("xmi", new XMIResourceFactoryImpl()); 
        URI uri = URI.createURI("file:/addressbookinstancesonlymodel.xmi"); 
        resource = resourceSet.createResource(uri); 
        resource.getContents().add(addressBookInstance); 
        resource.save(null); 
 
        resourceSet = new ResourceSetImpl(); 
        resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() 
                .put("xmi", new XMIResourceFactoryImpl()); 
        Registry packageRegistry = resourceSet.getPackageRegistry(); 
        packageRegistry.put("http://addressbook/1.0", ePackage); 
 
        uri = URI.createURI("file:/addressbookinstancesonlymodel.xmi"); 
        resource = resourceSet.getResource(uri, true); 
        resource.load(null); 
        DynamicEObjectImpl addressBookImpl = (DynamicEObjectImpl)(resource.getContents
        EClass addressBook = addressBookImpl.eClass(); 
        EAttribute nameAttribute = (EAttribute)(addressBook.getEStructuralFeature("name
        EReference containsAttribute = (EReference)(addressBook.getEStructuralFeature(
        Assert.assertEquals("Mon Carnet d'Adresses", addressBookImpl.eGet(nameAttribute));
 
        EcoreEList eGets = (EcoreEList)addressBookImpl.eGet(containsAttribute); 
        DynamicEObjectImpl personImpl = (DynamicEObjectImpl)eGets.get(0); 
        EClass person = personImpl.eClass(); 
        EAttribute familyName = (EAttribute)person.getEStructuralFeature("familyName");
        EAttribute firstName = (EAttribute)person.getEStructuralFeature("firstName"); 
 
        Assert.assertEquals("BARON", personImpl.eGet(familyName)); 
        Assert.assertEquals("Mickael", personImpl.eGet(firstName)); 
    } 

Noter pour la dernière partie du code (ligne 53), l'apparition d'une nouvelle classe
appelée DynamicEObjectImpl. Il s'agit d'une implémentation de l'interface
EObject. Cette classe est employée quand l'utilisation dynamique est utilisée pour
la création des instances.

VII. Conclusion et remerciements▲

Cet atelier vous montre toutes les facettes de la création et de l'instanciation de
modèles EMF. La plateforme Eclipse via son framework EMF fournit un outillage
pour faciliter la manipulation. Toutefois, il peut être intéressant de se détacher
des outils graphiques afin de mieux cerner les APIs sous­jacentes.

Dans un prochain atelier, nous ajouterons une couche graphique à notre modèle.

Je tiens à remercier Gueritarish et alain.bernard pour la relecture technique. Je
tiens également à remercier ced pour sa relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez­le en cliquant sur les boutons
suivants :           Partager  

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 20/21
5/23/2017 Tutoriel sur la création et l'instanciation de modèles avec Eclipse Modeling Framework (EMF)
  

 
Le contenu de cet article est rédigé par Mickael BARON et est mis à disposition selon les termes de la Licence Creative Commons
Attribution ­ Partage dans les Mêmes Conditions 3.0 non transposé.  
Les logos Developpez.com, en­tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.

Responsables bénévoles de la rubrique Eclipse : Mickael Baron ­ Robin56 ­ Contacter par email

Nous contacter Participez Hébergement Informations légales


Copyright © 2000­2017 ­ www.developpez.com

http://mbaron.developpez.com/tutoriels/eclipse/emf/creation­instanciation­modeles/ 21/21

Vous aimerez peut-être aussi