# Eclipse Modeling Framework

En génie logiciel, le projet Eclipse Modeling Framework (EMF) est un framework de modélisation, une infrastructure de génération de code et des applications basées sur des modèles de données structurées. Partant d'une spécification décrite généralement sous la forme d'un modèle en XMI, EMF fournit des outils permettant de produire des classes Java représentant le modèle avec un ensemble de classes pour adapter les éléments du modèle afin de pouvoir les visualiser, les éditer avec un système de commandes et les manipuler dans un éditeur.

## Historique et développement

Le projet EMF a été lancé par IBM dans le but d'unifier les outils de développement développés par IBM utilisant des modèles basés sur EMOF. Avec la libération du code source de la plateforme Eclipse, IBM a donné à la fondation Eclipse le projet EMF. À l'instar de la majorité des projets de la fondation Eclipse, EMF est disponible sous licence EPL. EMF est un projet développé en Java et dont le code source est disponible sur les serveurs de la fondation Eclipse. Depuis la migration vers Git des projets de la fondation Eclipse, le code source d'EMF de certains sous-projets d'EMF est accessible sur la plateforme Github. Le projet EMF est aujourd'hui maintenu au sein de la fondation Eclipse. La forte adoption d'EMF au sein des projets de la fondation Eclipse permet une forte interopérabilité entre ces projets qui peuvent partager des données sous forme de modèles.

## Structure du projet EMF

Le projet EMF peut être séparé en deux grandes parties, le cœur d'EMF et les projets d'outillage d'EMF (EMFT).

### EMF

Le cœur d'EMF contient le framework de modélisation ainsi que l'infrastructure de génération de code et de manipulation des modèles EMF.

#### Modélisation

Le projet EMF permet de créer deux types de modèles, d'un côté des modèles définissant des concepts, souvent nommé le méta-modèle, et de l'autre des modèles instanciant ces concepts. À titre d'exemple, on peut définir un méta-modèle définissant des concepts tels que « Classe », « Operation » et « Attribut » et ensuite utiliser ce méta-modèle pour définir des modèles contenant par exemple un élément de type « Classe » nommé « Voiture » avec une « Operation » nommée « rouler » et un « Attribut » nommé « consommation ». Tout modèle EMF est une instance d'un modèle EMF avec pour racine commune le modèle Ecore fourni par EMF. EMF permet non seulement de créer un méta-modèle représentant les concepts désirés par l'utilisateur mais il permet ensuite à l'utilisateur de créer des modèles issus de ce méta-modèle et de les manipuler avec un outillage adapté.

##### Exemple de modélisation

La première étape dans le cadre d'une utilisation simple d'EMF consiste à créer un projet Java dans Eclipse à définir son méta-modèle en créant un nouveau fichier de type "ecore" avec l'aide des wizards fournit par EMF.
Dans ce modèle EMF, on peut ensuite créer un package, racine d'un méta-modèle définit avec EMF. La vue "Properties" d'Eclipse permet de définir le nom de ce package avec son préfixe et son uri. L'uri d'une instance de package venant d'Ecore est un identifiant unique permettant d'identifier un méta-modèle.
Au sein de ce package, nous pouvons définir les différents concepts de notre domaine que nous souhaitons manipuler avec EMF. Dans cet exemple, nous pouvons voir des instances de classes venant d'Ecore permettant de définir les concepts d'une bibliothèque simple. L'image ci-dessous montre donc une instance du concept de package, quatre instances du concept de classes, une instance d'énumération et plusieurs instances de références et attributs.
Une fois ce méta-modèle définit, nous pouvons l'utiliser avec l'éditeur basique pour fichier "ecore" pour créer une instance du concept "Library" dans le méta-modèle. On peut donc voir sur la capture suivante, l'éditeur basique d'EMF avec une instance de nos concepts Library, Book, Employee et Writer. Lorsque l'on sélectionne un élément, on peut voir et éditer ses attributs dans la vue "Properties".
Cet exemple représente une utilisation très basique d'EMF. Il est par exemple possible d'initialiser un modèle "ecore" à partir d'une série de classes java ou bien d'un fichier "xsd". EMF permet aussi de choisir la sérialisation à utiliser pour un modèle EMF (par défaut XMI).

##### Ecore

Tous les modèles créés avec EMF sont liés d'une manière ou d'une autre avec Ecore. Ecore est un modèle EMF définissant les concepts manipulables dans EMF. Ces concepts, toujours préfixés par un "E", sont les suivants :
* EAttribute
* EAnnotation
* EClass
* EClassifier
* EDataType
* EEnum
* EEnumLiteral
* EFactory
* EModelElement
* ENamedElement
* EObject
* EOperation
* EPackage
* EParameter
* EReference
* EStructuralFeature
* ETypedElement
* EStringToStringMapEntry
* EGenericType
* ETypeParameter
Ecore contient aussi de nombreux types de données afin d'initialiser des modèles EMF sans besoin de redéfinir les types primitifs courants (EString, EBoolean, EInt, EFloat, etc).

#### Génération de code
##### Génération du code du modèle

Le projet EMF embarque une série de générateurs de code destinés à la génération de classes Java à partir d'un modèle "ecore". La génération traditionnelle est paramétrée par un modèle EMF possédant l'extension "genmodel". Le "genmodel" permet de paramétrer la génération en définissant entre autres le copyright des fichiers générés, leur emplacement, des conventions de nommages et la version d'EMF avec laquelle le code généré sera compatible. L'éditeur du "genmodel" permet d'avoir accès aux différentes actions de génération de code où l'utilisateur peut choisir de générer le code Java correspondant au méta-modèle ainsi que le code pour générer les classes java pour adapter les éléments du méta-modèles pour les afficher, le code java d'un éditeur intégré à Eclipse ainsi que les tests unitaires pour les instances du méta-modèle.
* Code généré par EMF pour le modèle.
Par défaut, le code généré par EMF comprend les interfaces représentant les concepts du méta-modèle (dans le package org.eclipse.emf.model.library dans l'exemple), les classes d'implémentation de ces interfaces (dans le package org.eclipse.emf.model.library.impl) ainsi que deux classes utilitaires comprenant une classe "xxxFactory" implémentant le patron de conception "Factory". Le code généré par EMF comprend de nombreux mécanismes par défaut tel qu'un système de notifications pour toutes modifications lors de l'utilisation d'une méthode d'accès aux attributs de la classe ainsi que des méthodes permettant de manipuler facilement les classes générées de manière réflective ("eGet" et "eSet" notamment). Il est ainsi possible de connaitre aisément le conteneur d'une instance grâce à la méthode "eContainer" (dans notre exemple, le conteneur d'une entité de type "Book" serait l'entité racine de type "Library").
Le projet Eclipse Modeling contient des projets destinés à la génération de code utilisant des modèles EMF et ciblant des plateformes plus variées que des objets java représentant le modèle tel qu'Acceleo.

##### Visualisation

EMF permet aussi de générer le code java pour visualiser un modèle EMF grâce au "genmodel". Ce code généré permet d'adapter facilement les objets du méta-modèle afin de fournir un texte et une image afin d'afficher l'élément. Des icônes par défaut sont aussi fournies ainsi que des descriptions par défaut internationalisées.
* Code généré par EMF pour la visualisation des modèles.

##### Édition

EMF permet de générer le code java d'un wizard et d'un éditeur EMF simple destiné à la manipulation du méta-modèle.
| Code généré par EMF pour l'éditeur des modèles. | Le wizard de création de nouveau modèle instanciant "Library" | L'éditeur généré par EMF une fois déployé dans une nouvelle instance d'Eclipse. |

##### Tests

Enfin EMF permet de générer la structure des tests unitaires permettant de facilement tester le code du méta-modèle.
* Code généré par EMF pour tester les modèles.

### EMFT

La seconde partie du projet EMF comprend tous les outils réutilisant le cœur d'EMF et permettant d'améliorer l'utilisation d'EMF. Au sein de ce projet EMFT réside donc de nombreux sous-projets différents destinés à l'amélioration d'un point particulier de l'outillage d'EMF.

#### Comparaison de modèles

Le projet EMFT contient un projet destiné à la comparaison de modèles réalisés avec EMF nommé EMF Compare. EMF Compare permet de comparer les différences entre modèles EMF ainsi que de garder la cohérence des modèles EMF lors de certaines opérations comme la manipulation avec le système de gestion de version EGit. Si plusieurs modèles sont interdépendants, EMF compare va s'assurer que l'utilisateur ne puisse pas sauvegarder sur le système de gestion de version une partie de ces modèles sans sauvegarder le reste dans les cas où la sauvegarde partielle entraînerait un problème de cohérence entre les modèles. EMF Compare permet aussi de réaliser une comparaison graphique entre modèle EMF.
| Comparaison graphique de modèle avec EMF Compare. | Comparaison arborescente avec EMF Compare. | Conservation de la cohérence avec EMF Compare. |

#### Édition collaborative

Le projet EMFT contient des projets destinés à la manipulation collaborative de modèle EMF comme CDO. CDO est un framework permettant à des outils manipulant des modèles EMF de gérer collaborativement ces derniers. Un outil intégrant CDO peut ainsi permettre à ces utilisateurs de travailler sur un même modèle en même temps en prévenant certains conflits, en pouvant verrouiller une partie du modèle et en gérant un système de versions à l'instar d'un système de gestion de versions traditionnel.
CDO fournit un système de persistance des modèles EMF avec un accès transactionnel multi-utilisateurs. Cette capacité transactionnelle permet de définir des verrous sur tout ou partie du modèle ainsi que des points de sauvegarde permettant ainsi de restaurer le modèle depuis un état précédent. Au sein de CDO, un modèle peut évoluer de manière parallèle avec un système de branches similaire à des systèmes de gestion de version comme SVN et Git. CDO offre aussi le chargement paresseux des modèles EMF ne chargeant ainsi en mémoire que les éléments du modèle demandé, grâce à ce mécanisme CDO permet de faire monter en charge des applications basées sur EMF. Enfin CDO offre la capacité de travailler de manière déconnecté ainsi que des fonctionnalités permettant de résister aux erreurs tel qu'un système de re-connexion.

#### Génération d'interface graphique

Le projet EMFT contient aussi le projet EEF dont le but est de permettre la génération d'interface graphique plus riche que l'éditeur EMF basique pour éditer des modèles créés avec EMF. Ainsi avec EEF, on peut générer des wizards, des éditeurs ou des vues pour Eclipse destinés à l'édition de modèle EMF. Le projet EEF contient aussi une génération EMF alternative basée sur Acceleo.
* Capture d'écran d'une vue Eclipse générée par EEF.

## Le projet EMF et Eclipse Modeling

La popularité d'EMF a donné naissance à de nombreuses initiatives réutilisant EMF au sein de la fondation Eclipse dans le projet Eclipse Modeling regroupant les projets destinés au MDA.

### Amalgamation

Le projet Amalgamation gère la construction de la déclinaison d'Eclipse destiné à Eclipse Modeling. Cette déclinaison est accessible dans la page de téléchargement d'Eclipse et elle contient un ensemble d'outils développés au sein de la fondation Eclipse pour former un environnement de développement destiné à l'approche MDA. Pour la sortie d'Eclipse 3.7 Indigo, la déclinaison fournie par le projet Amalgamation contient, en plus du cœur de la plateforme Eclipse, les outils suivants :
* org.eclipse.amalgam.discovery (fonctionnalités spécifiques à cette déclinaison)
* org.eclipse.cvs (outillage pour le système de gestion de versions CVS)
* org.eclipse.egit (outillage pour le système de gestion de versions Git)
* org.eclipse.emf.cdo.epp (CDO, framework de travail collaboratif sur des modèles EMF)
* org.eclipse.emf.compare.sdk (EMF Compare, framework de comparaison de modèle)
* org.eclipse.emf.ecoretools.sdk (Ecore Tools, outillage pour EMF)
* org.eclipse.emf.eef.codegen.ecore (EEF, génération d'interface graphique pour l'édition de modèles EMF)
* org.eclipse.emf.query.sdk (EMF Query, framework de requête sur les modèles EMF)
* org.eclipse.emf.sdk (EMF, framework de modélisation)
* org.eclipse.emf.transaction.sdk (EMF Transaaction, framework de gestion transactionnel pour EMF)
* org.eclipse.emf.validation.sdk (EMF Validation, framework de validation des modèles EMF)
* org.eclipse.gmf.runtime.sdk (GMF, framework de modélisation graphique pour EMF)
* org.eclipse.mylyn (Mylyn, outillage de gestion de tâches)
* org.eclipse.ocl.all.sdk (OCL, implémentation de référence du langage OCL de l'OMG, utilisé entre autres pour définir des contraintes et des requêtes sur des modèles EMF)
* org.eclipse.uml2.sdk (UML, implémentation du méta-modèle UML réalisé avec EMF et outillage associé)
* org.eclipse.xsd.sdk (XSD, outillage de manipulation de fichiers XSD)

### UML

Le projet Eclipse Modeling héberge une implémentation du standard UML reposant sur EMF. Cette implémentation contient un méta-modèle du standard UML avec des éditeurs permettant de définir des diagrammes de classes, d'activité, de cas d'utilisation etc.

### Transformation de modèles vers modèles

Parmi les projets contenus dans Eclipse Modeling, on trouve le projet ATL destiné à la transformation de modèles vers modèles. ATL est inspiré du standard QVT créé par l'OMG.

### Génération de code

Le projet Eclipse Modeling contient une partie destinée aux projets de génération de code à partir de modèle EMF. Dans cette catégorie, on peut trouver le projet Acceleo implémentant le langage standard de transformation de modèle vers texte de l'OMG (MOFM2T). Contrairement à la génération de code vu précédemment, Acceleo permet de générer du code pour n'importe quelle cible technologique (java, scala, ruby, etc). La compatibilité avec les modèles définit par EMF permet ainsi de générer n'importe quel type de code depuis n'importe quel méta-modèle (UML, SysML, un méta-modèle destiné à un domaine comme l'exemple "Library", etc).

### Modélisation graphique

Le projet Eclipse Modeling contient aussi des projets destinés à la manipulation graphique de modèle EMF tel que Graphical Modeling Framework (GMF) et Graphiti.

## Le futur d'EMF
### La plateforme Eclipse 4

À la suite de la forte utilisation d'EMF au sein des projets de la fondation Eclipse, EMF fait partie du cœur de la nouvelle plateforme Eclipse 4.