I. Introduction

I-A. Spécification

À partir d'un modèle EMF de graphe précédemment défini, on génère un éditeur arborescent de graphe.

I-B. Lancement de la plate-forme Eclipse

Double-cliquer : Image non disponibleou le raccourci vers cet exécutable si vous l'avez créé dans le répertoire destiné à recevoir les « workspaces ». La plate-forme « Eclipse » est lancée :

Image non disponible

On sélectionne le « workspace » :

« E:\FORMATION_Eclipse\modeling-indigo-SR1\EMT\WS\GenerationEditeurArborescent »

Image non disponible

Cliquer « OK ». Fermer la fenêtre « Welcome ».

I-C. Passage en perspective « Ecore »

Faire :

Image non disponible

Sélectionner la perspective « Ecore »

Image non disponible

Cliquer « OK », on obtient :

Image non disponible

II. Édition du modèle EMF décrivant un graphe

II-A. Création du projet

Un nouveau projet est créé :

Image non disponible

Nommer le projet :

Image non disponible

Cliquer « Finish ». Le projet est créé.

II-B. Ouverture de l'éditeur

Faire :

Image non disponible

Initialiser « Domain file name » :

Image non disponible

Cliquer « Finish ».

L'éditeur apparaît, on ferme quelques fenêtres, mais on garde les « Properties » :

Image non disponible

II-C. Édition

Si nécessaire se reporter à l'article Édition graphique d'un modèle EMF.

Éditer le modèle EMF. Faire une sauvegarde générale :

Image non disponible

On peut valider le modèle « Graphe.ecore » :

Image non disponible

III. Création projet EMF

Faire :

Image non disponible

Sélectionner :

Image non disponible

Cliquer « Next > ». Nommer le projet :

Image non disponible

Cliquer « Next > ».

Sélectionner « Ecore model »

Image non disponible

Cliquer « Next ». Dans « New EMF Project - Ecore Import » utiliser « Browse Workspace... » pour importer le modèle :

Image non disponible

Cliquer « OK », on obtient :

Image non disponible

Cliquer « Load » puis « Next > ».

Dans « New EMF Project - Package Selection », sélectionner « Graphe.ecore ».

Image non disponible

Cliquer « Finish ». Le projet « exemple.graphe.emf » est créé. Double-cliquer « Graphe.genmodel », sélectionner « Graphe » et initialiser « Base Package » à « exemple.graphe » :

Image non disponible

Faire une sauvegarde générale.

IV. Génération du code associé au modèle

Dans le menu contextuel de l'éditeur de « model>Graphe.genmodel » sélectionner « Generate All »

Image non disponible

Trois nouveaux projets sont générés :

Image non disponible

En particulier « exemple.graphe.emf.editors » qui est un éditeur arborescent du modèle défini par le

métamodèle « Ecore »

V. Test de l'éditeur

L'éditeur arborescent correspond au projet « exemple.graphe.emf.editor ».

Nous allons tester cet éditeur sans générer le plugin. Faire :

Image non disponible

Dans « Run Configurations - Create, manage, and run configurations » sélectionner « Eclipse Application » par un double-clic . Initialiser « Name: » , « Location : » est mis à jour :

Image non disponible

Faire « Apply » puis « Run » Une nouvelle plateforme Eclipse est lancée, son « Workspace » est « runtime-GenerationEditeurArborescent ».

Fermer la fenêtre « Welcome » et quelques vues... :

Image non disponible

Faire :

Image non disponible

Choisir le type de projet :

Image non disponible

Cliquer « Next > »

Nommer le projet :

Image non disponible

Cliquer « Finish ».

Faire :

Image non disponible

Sélectionner :

Image non disponible

Cliquer « Next > »

Nommer le graphe :

Image non disponible

Cliquer « Next > ».

Sélectionner l'objet du modèle à créer :

Image non disponible

Cliquer « Finish ».

On obtient :

Image non disponible

V-A. Édition du modèle

Faire apparaître la vue properties :

Image non disponible

V-A-1. Création « Noeud »

Faire :

Image non disponible

Initialiser le nom du nœud dans la vue « Properties ». Cliquer dans la vue « G1.graphe » pour que le nom soit mis à jour, on peut alors faire une sauvegarde.

Image non disponible

On édite très simplement le modèle :

Image non disponible

Remarque : si une mise à jour des « Properties » n'est pas prise en compte faire un clic dans l'éditeur.

Faire une sauvegarde générale.

Quitter la plateforme de test.

VI. Accès au modèle édité

Nous souhaitons accéder au modèle édité afin de réaliser un traitement de ce modèle.

Nous allons créer une commande qui affiche dans un message le « Graphe » édité.

VI-A. Création de la commande « View Model »

VI-A-1. Création du « package » pour recevoir le code de la commande

Dans le projet « exemple.graphe.emf.editor » on crée sous « src » un « package » destiné à recevoir le code (Handler) associé à la commande :

Image non disponible

Nommer le « package » :

Image non disponible

Cliquer « Finish » le « package » est créé.

VI-A-2. Création de l'arbre des extensions

Nous traiterons rapidement la mise en place de la commande, pour plus de précision se reporter au document « Plug-ins - Premier Plug-in ».

Pour créer la commande dans le projet « exemple.graphe.emf.editor » on ouvre le « plug-in Manifest Editor » onglet « Extension » afin de créer l'arbre des extensions suivant :

Image non disponible

On retrouve l'ensemble des « Extension Details » associées aux extensions que l'on vient de créer dans le fichier plugin.xml (onglet « plugin.xml »)

Image non disponible
 
Sélectionnez
<extension
     point="org.eclipse.ui.commands">
 
  <command
        id="command.viewModel"
        name="View Model">
  </command>
</extension>
<extension
     point="org.eclipse.ui.handlers">
  <handler
        class="monCode.ViewModel"
        commandId="command.viewModel">
  </handler>
</extension>
<extension
     point="org.eclipse.ui.menus">
  <menuContribution
        allPopups="false"
        locationURI="menu:org.eclipse.ui.main.menu?after=additions">
     <menu
           id="processModel"
           label="Process Model">
        <command
              commandId="command.viewModel"
              style="push">
        </command>
     </menu>
  </menuContribution>
</extension>

VI-A-3. Le code du « handler »

 
Sélectionnez
package monCode;
 
import java.util.Iterator;
 
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.IHandlerListener;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.handlers.HandlerUtil;
 
import exemple.graphe.graphe.Arc;
import exemple.graphe.graphe.Noeud;
import exemple.graphe.graphe.impl.GrapheImpl;
 
publicclass ViewModel implements IHandler {
 
   @Override
   publicvoid addHandlerListener(IHandlerListener handlerListener) {
       // TODO Auto-generated method stub
 
   }
 
   @Override
   publicvoid dispose() {
       // TODO Auto-generated method stub
 
   }
 
   String titre;
   Shell shell;
 
   @Override
   public Object execute(ExecutionEvent event) throws ExecutionException {
 
       titre = HandlerUtil.getActiveEditor(event).getTitle();
       shell = HandlerUtil.getActiveWorkbenchWindow(event).getShell();
       ISelection selection = HandlerUtil.getCurrentSelection(event);
       Object first = ((TreeSelection) selection).getFirstElement();
       GrapheImpl graphe;
       try {
           graphe = (GrapheImpl) first;
           vueModel(graphe);
       } catch (Exception e) {
           // TODO Auto-generated catch block
           MessageDialog.openError(shell,
                   "Graph Editor", "Sélectionner: Graphe");
       }
       returnnull;
   }
 
   privatevoid vueModel(GrapheImpl graphe){
       String message = new String("");
       message = "Fichier: "+titre+"\n";
       message += "Liste des noeuds\n";
       EList<Noeud> listeNoeuds = graphe.getListeNoeuds();
       Iterator<Noeud> in = listeNoeuds.iterator();
       while (in.hasNext()){
           Noeud n = in.next();
           message += "   "+n.getNom()+"\n";
       }
       message += "Liste des arcs\n";
       EList<Arc> listeArcs = graphe.getListeArcs();
       Iterator<Arc> ia = listeArcs.iterator();
       while (ia.hasNext()){
           Arc a = ia.next();
           message += "   "+a.getNom()+
           "("+a.getOrigine().getNom()+
           "->"+a.getExtremite().getNom()+")\n";
       }
 
       MessageDialog.openInformation(shell, "View Model", message);
 
   }
 
   @Override
   publicboolean isEnabled() {
       // TODO Auto-generated method stub
       returntrue;
   }
 
   @Override
   publicboolean isHandled() {
       // TODO Auto-generated method stub
       returntrue;
   }
 
   @Override
   publicvoid removeHandlerListener(IHandlerListener handlerListener) {
       // TODO Auto-generated method stub
   }
 
}

Le modèle édité est récupéré via la sélection. On vérifie que la sélection correspond bien à la sélection d'un graphe. Puis on accède au modèle édité en utilisant les définitions du métamodèle :

Image non disponible

Par exemple, à partir du graphe, les méthodes : graphe.getListeNoeuds() et graphe.getListeArcs()

permettent respectivement d'accéder la liste des Nœuds et la liste des Arcs...

VI-B. Test de la commande « View Model »

On lance l'éditeur : Image non disponible , on récupère le modèle précédemment édité :

Image non disponible

Sélectionner dans la zone d'édition « Graphe » puis la commande « Process Model > View Model »

Image non disponible

Le message suivant s'affiche :

Image non disponible

Attention si « Graphe » n'est pas sélectionné un message d'erreur s'affiche :

Image non disponible
Image non disponible

VII. Conclusions

À partir d'un modèle EMF, un éditeur arborescent est généré. Cette forme d'édition peut conduire à une représentation du modèle peu dense. Les attributs des objets (à part les noms) sont affichés uniquement dans la vue « Properties ». Il n'est donc pas possible de visualiser la totalité du modèle dans l'éditeur.

Ici on voit la définition de l' « Arc 2 » :

Image non disponible

Il faut sélectionner l' «Arc 1 » pour voir sa définition :

Image non disponible

VIII. Licence

La licence « Creative Commons » s'applique à ce document, veuillez-vous référer à ce site pour de plus amples informations : http://creativecommons.org/licenses/by-nc-nd/2.0/fr/.