Eclipse Modeling Tools - Requête sur le modèle édité Laboratoire d'analyse et d'architecture des Systèmes Eclipse Modeling Tools Requête sur le modèle édité Select Noeuds Cout>=5 Résumé: Le méta-modèle utilisé dans les exemples précédents est enrichi: un coût (entier) est associé à chaque nœud. Un éditeur de modèle arborescent est généré à partir de ce méta-modèle. La requête porte sur le coût associé aux nœuds du graphe édités. Mots clés: Eclipse, INDIGO, Eclipse Modeling Tools, EMF, EMP Serge Bachmann CNRS LAAS 2I Serge Bachmann Page 1/41
Eclipse Modeling Tools - Requête sur le modèle édité Sommaire 1 Introduction...4 1.1 Spécification...4 1.2 Lancement de la plate-forme Eclipse...4 1.3 Passage en perspective «Ecore»...5 2 Création projet «EMF»...6 2.1 Création projet «Empty EMF Project»...6 3 Édition du méta modèle «Ecore»...8 3.1 Édition du diagramme...9 4 Générations du code...10 4.1 Création du fichier de génération...10 5 Création d'une requête...15 5.1 Création du projet «exemple.graphe.emf.statement»...15 6 Requête dans le «menubar»...18 6.1 Création package destiné à recevoir le code...18 6.2 Dependencies...19 6.3 Définition des Extensions...21 6.3.1 Création du point d'extension «org.eclipse.ui.editoractions»...21 6.3.2 Ajouter un menu...22 6.3.3 Ajouter un «separator»...23 6.3.4 Ajouter une action:...24 6.3.5 Définition «enablement»...26 6.3.6 Définition «objectclass»...26 6.4 Le fichier «plugin.xml»...27 6.5 Le Code...27 6.5.1 La classe «AbstractQueryDelegate»...28 6.5.2 La classe «SelectBigCostNodesDelegate»...32 7 Test query dans «Menu Bar»...35 7.1 Exécution «Query»...37 8 Requête dans le «popup» menu de l'éditeur...38 9 Test requête dans le «popup» menu...40 10 Conclusions...41 11 Licence...41 CNRS LAAS 2I Serge Bachmann Page 2/41
Eclipse Modeling Tools - Requête sur le modèle édité Informations Générale Fichier source document: E:\FORMATION_Eclipse\modeling-indigo- SR1\EMT\DOCUMENTATION\EMFModelQuery.odt Version Eclipse: INDIGO version 3.7.1 This package contains framework and tools to leverage models : an Ecore graphical modeler (class-like diagram), Java code generation utility for RCP applications and the EMF Framework, model comparison support, support for XSD schemas, OCL and graphical modeler runtimes. It includes a complete SDK, developer tools and source code. Download: eclipse-modeling-indigo-sr1-win32.zip Date de création: 17 novembre 2011 Date d'impression: 6 décembre 2011 Plate forme Windows 32 CNRS LAAS 2I Serge Bachmann Page 3/41
Eclipse Modeling Tools - Requête sur le modèle édité Introduction 1 Introduction 1.1 Spécification Le modèle défini dans les autres exemples est modifié: un coût sous la forme d'un entier est ajouté à chaque nœud. On désire implémenter la requête suivante: Tout nœud dont le coût est supérieur à 5 est sélectionné. 1.2 Lancement de la plate-forme Eclipse Double cliquer : ou 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: Choisir le workspace: Cliquer «OK», Fermer la fenêtre «Welcome». CNRS LAAS 2I Serge Bachmann Page 4/41
Eclipse Modeling Tools - Requête sur le modèle édité Introduction 1.3 Passage en perspective «Ecore» Faire: Choisir «Ecore» Cliquer «OK» On efface quelques vues: CNRS LAAS 2I Serge Bachmann Page 5/41
Eclipse Modeling Tools - Requête sur le modèle édité Création projet «EMF» 2 Création projet «EMF» 2.1 Création projet «Empty EMF Project» Faire: Sélectionner: Cliquer «Next >». Nommer le projet: Cliquer «Finish». CNRS LAAS 2I Serge Bachmann Page 6/41
Eclipse Modeling Tools - Requête sur le modèle édité Création projet «EMF» Le projet est créé: CNRS LAAS 2I Serge Bachmann Page 7/41
Eclipse Modeling Tools - Requête sur le modèle édité Édition du méta modèle «Ecore» 3 Édition du méta modèle «Ecore» Faire un clic droit sur «model» et sélectionner la commande: Nommer le diagramme: Cliquer «Finish» CNRS LAAS 2I Serge Bachmann Page 8/41
Eclipse Modeling Tools - Requête sur le modèle édité Édition du méta modèle «Ecore» 3.1 Édition du diagramme Éditer le diagramme, déjà édité dans le document: Édition graphique d'un méta-modèle «Ecore». Pour les besoins de notre exemple, un «EAttribute» «cout» de type «EInt» est ajouté à chaque nœud. Faire un sauvegarde du diagramme. Afficher «Graphe.ecore», on obtient: Vérifier que le méta modèle est valide (menu contextuel de l'éditeur de «Graphe.ecore»). CNRS LAAS 2I Serge Bachmann Page 9/41
Eclipse Modeling Tools - Requête sur le modèle édité Générations du code 4 Générations du code 4.1 Création du fichier de génération Faire un clic droit sur «exemple.graphe.emf» et sélectionner: Sélectionner: Cliquer «Next >». CNRS LAAS 2I Serge Bachmann Page 10/41
Eclipse Modeling Tools - Requête sur le modèle édité Générations du code On sélectionne le répertoire «model» comme «parent folder», on nomme le fichier de génération: Cliquer «Next >». La génération ce fait à partir d'un modèle «Ecore»: Cliquer «Next >». CNRS LAAS 2I Serge Bachmann Page 11/41
Eclipse Modeling Tools - Requête sur le modèle édité Générations du code On utilise «Browse Workspace...» dans la fenêtre «New EMF Generator Model Ecore Import» pour sélectionner notre modèle «ecore»: Cliquer «OK», on obtient: Cliquer «Next >» CNRS LAAS 2I Serge Bachmann Page 12/41
Eclipse Modeling Tools - Requête sur le modèle édité Générations du code Ne rien modifier: Cliquer «Finish». Le fichier «Graphe.genmodel» de génération est créé: Faire un clic droit dans l'éditeur de «Graphe.genmodel» et sélectionner la commande: «Generate Model Code» : Faire de même avec «Generate Edit Code», «Generate Editor Code» : CNRS LAAS 2I Serge Bachmann Page 13/41
Eclipse Modeling Tools - Requête sur le modèle édité Générations du code On obtient: CNRS LAAS 2I Serge Bachmann Page 14/41
Eclipse Modeling Tools - Requête sur le modèle édité Création d'une requête 5 Création d'une requête Nous allons créer un projet réalisant une requête simple sur le modèle édité. La requête porte sur l'attribut coût des nœuds: «Sélectionner tous les nœuds dont le coût est supérieur à 5» Nous allons créer un nouveaux projet pour traiter la requête. 5.1 Création du projet «exemple.graphe.emf.statement» Faire: sélectionner: Cliquer «Next >» CNRS LAAS 2I Serge Bachmann Page 15/41
Eclipse Modeling Tools - Requête sur le modèle édité Création d'une requête Nommer le projet: Cliquer «Next >» CNRS LAAS 2I Serge Bachmann Page 16/41
Eclipse Modeling Tools - Requête sur le modèle édité Création d'une requête Renommer l'«activator»: Cliquer «Finish», accepter de changer de perspective. Cliquer «Yes» CNRS LAAS 2I Serge Bachmann Page 17/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» 6 Requête dans le «menubar» La commande qui activera la requête est placée dans la barre des menus. 6.1 Création «package» destiné à recevoir le code Dans le répertoire «src» on crée le package: Nommer le «pakage»: Cliquer «Finish», ce qui donne: CNRS LAAS 2I Serge Bachmann Page 18/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» 6.2 Dependencies Le «plug-in» «exemple.graphe.emf.statement» fait référence à d'autres plug-ins. Dans le «Plugin Manifest Editor» du projet sélectionner l'onglet: «Dependencies». Dans la zone «Required Plugins», cliquer le bouton «Add...» Sélectionner: Cliquer «OK». Cliquer «Add...» et sélectionner : Cliquer «OK» CNRS LAAS 2I Serge Bachmann Page 19/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» Cliquer «Add...» et sélectionner : Au final on à: Faire une sauvegarde. CNRS LAAS 2I Serge Bachmann Page 20/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» 6.3 Définition des Extensions 6.3.1 Création du point d'extension «org.eclipse.ui.editoractions» Dans le «Plugin Manifest Editor», sélectionner l'onglet «Extensions». Dans la zone «All Extensions» cliquer «Add...» Dans le «Wizard» «New Extension Extension Point Selection» sélectionner: Cliquer «Finish» CNRS LAAS 2I Serge Bachmann Page 21/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» Le point d'extension est créé avec un sous élément (editor Contribution): Sélectionner le sous élément et initialiser ses «Extension Element Details»: Remarque : Utiliser le bouton «Browse...» pour sélectionner le «targetid*» : faire une sauvegarde pour mettre à jour la zone «All Extensions», on obtient: 6.3.2 Ajouter un menu Faire un clic droit sur «exemple.graphe.editor...» et sélectionner «New > menu» : Le menu est créé: CNRS LAAS 2I Serge Bachmann Page 22/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» l'initialiser: faire une sauvegarde, on obtient: 6.3.3 Ajouter un «separator» Faire: Le séparateur est créé: L'initialiser: Faire une sauvegarde, on obtient: CNRS LAAS 2I Serge Bachmann Page 23/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» 6.3.4 Ajouter une action: Faire: on obtient: L'initialiser: Faire une sauvegarde, on obtient: CNRS LAAS 2I Serge Bachmann Page 24/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» Sélectionner «Select Big Nodes (action)», dans «Extension Element Details» cliquer: «class*:». Définir la classe: Sélectionner l'interface proposée, faire un «remove» pour la supprimer. Cliquer «Finish», la classe est créée : Nous l'éditerons par la suite. On revient à la construction des extensions. CNRS LAAS 2I Serge Bachmann Page 25/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» 6.3.5 Définition «enablement» Retour dans le «Plugin Manifest Editor» onglet «Extensions» : Faire: 6.3.6 Définition «objectclass» Faire; ce qui donne: Utiliser le bouton «Browse...» dans «Extension Element Details» pour initialiser «name*:» Cliquer «OK». CNRS LAAS 2I Serge Bachmann Page 26/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» On obtient après sauvegarde: 6.4 Le fichier «plugin.xml» Sélectionner l'onglet «plugin.xml». On retrouve la définition complète de l'extension «org.eclipse.ui.editoractions» dans le fichier «plugin.xml» : <?xml version="1.0" encoding="utf-8"?> <?eclipse version="3.4"?> <plugin> <extension point="org.eclipse.ui.editoractions"> <editorcontribution id="exemple.graphe.editorcontribution" targetid="graphe.presentation.grapheeditorid"> <menu id="exemple.graphe.querymenuid" label="query" path="graphemenuid/additions"> <separator name="additions"> </separator> </menu> <action class="moncode.selectbigcostnodesdelegate" id="exemple.graphe.selectbigcostnode" label="select Big Cost Nodes" menubarpath="graphemenuid/exemple.graphe.querymenuid/additions" style="push"> <enablement> <objectclass name="org.eclipse.emf.ecore.eobject"> </objectclass> </enablement> </action> </editorcontribution> </extension> </plugin> 6.5 Le Code L'action définie dans l'extension «org.eclipse.ui.editoraction» fait référence à la classe: c'est à dire: CNRS LAAS 2I Serge Bachmann Page 27/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» Cette classe sera définie comme sous classe de la classe «AbstactQueryDelegate», classe qui est définie dans le paragraphe ci-dessous. 6.5.1 La classe «AbstractQueryDelegate» Faire : CNRS LAAS 2I Serge Bachmann Page 28/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» Définir la classe: Remarque : Utiliser le bouton «Browse...» pour définir les interfaces : CNRS LAAS 2I Serge Bachmann Page 29/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» Cliquer «Finish» la classe est créée: package moncode; import org.eclipse.jface.action.iaction; import org.eclipse.jface.viewers.iselection; import org.eclipse.swt.widgets.event; import org.eclipse.ui.iactiondelegate2; import org.eclipse.ui.ieditoractiondelegate; import org.eclipse.ui.ieditorpart; public class AbstractQueryDelegate implements IEditorActionDelegate, IActionDelegate2 { @Override public void run(iaction action) { // TODO Auto-generated method stub @Override public void selectionchanged(iaction action, ISelection selection) { // TODO Auto-generated method stub @Override public void init(iaction action) { // TODO Auto-generated method stub @Override public void dispose() { // TODO Auto-generated method stub @Override public void runwithevent(iaction action, Event event) { // TODO Auto-generated method stub @Override public void setactiveeditor(iaction action, IEditorPart targeteditor) { // TODO Auto-generated method stub L'éditer: package moncode; import graphe.presentation.grapheeditor; import java.util.collection; import org.eclipse.emf.ecore.eobject; import org.eclipse.jface.action.iaction; import org.eclipse.jface.dialogs.messagedialog; import org.eclipse.jface.viewers.iselection; import org.eclipse.jface.viewers.istructuredselection; import org.eclipse.swt.widgets.event; import org.eclipse.swt.widgets.shell; import org.eclipse.ui.iactiondelegate2; import org.eclipse.ui.ieditoractiondelegate; import org.eclipse.ui.ieditorpart; /** * This action delegate queries the user for the name of a class. Then it uses * the query APIs to find the class and selects it in the editor. * * @see IEditorActionDelegate */ public abstract class AbstractQueryDelegate CNRS LAAS 2I Serge Bachmann Page 30/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» implements IEditorActionDelegate, IActionDelegate2 { /** * Error message to display when an exception occurred */ protected static final String MESSAGE_EXCEPTION = "QueryStatementsMessages.message_exception"; /** * The shell this action is hosted in */ protected Shell shell = null; /** * The active editor */ protected GrapheEditor editor = null; /** * Selected EObjects */ protected Collection<EObject> selectedeobjects = null; /** * The InputDialog title */ protected String title; /** * The InputDialog message */ protected String message; /** * The message to output when query result set is empty */ protected String notfoundmessage; /** * Constructor */ public AbstractQueryDelegate(String titlein, String messagein, String notfoundmessagein) { title = titlein; message = messagein; notfoundmessage = notfoundmessagein; /** * Perform a query that returns a set of objects. * * @param value * The value used to drive the query * @return The set of objects returned by the query */ protected abstract Collection<EObject> performquery(object value) throws Exception; /* * @see org.eclipse.ui.iactiondelegate#selectionchanged(org.eclipse.jface.action.iaction, * org.eclipse.jface.viewers.iselection) */ public void selectionchanged(iaction action, final ISelection selection) { this.selectedeobjects = null; try { if (selection instanceof IStructuredSelection) { IStructuredSelection structuredselection = (IStructuredSelection) selection; this.selectedeobjects = new java.util.arraylist<eobject>(); for (Object next : structuredselection.tolist()) { if (next instanceof EObject) { selectedeobjects.add((eobject) next); catch (Exception e) { // Exceptions are not expected MessageDialog.openInformation(shell, title, MESSAGE_EXCEPTION); throw new RuntimeException(e); finally { CNRS LAAS 2I Serge Bachmann Page 31/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» action.setenabled((null!= selectedeobjects)); /* * @see org.eclipse.ui.iactiondelegate2#dispose() */ public void dispose() { //No-op /* * @see org.eclipse.ui.ieditoractiondelegate#setactiveeditor(org.eclipse.jface.action.iaction, * org.eclipse.ui.ieditorpart) */ public void setactiveeditor(iaction action, IEditorPart targeteditor) { this.editor = (GrapheEditor) targeteditor; if ( targeteditor!= null ) { this.shell = targeteditor.getsite().getshell(); /* * @see org.eclipse.ui.iactiondelegate2#init(org.eclipse.jface.action.iaction) */ public void init(iaction action) { // No-op /* * @see org.eclipse.ui.iactiondelegate2#runwithevent(org.eclipse.jface.action.iaction, * org.eclipse.swt.widgets.event) */ public void runwithevent(iaction action, Event event) { run(action); Faire une sauvegarde. Structure de la classe: CNRS LAAS 2I Serge Bachmann Page 32/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» 6.5.2 La classe «SelectBigCostNodesDelegate» Dans le «Package Explorer» double cliquer «SelectBigCostNodesDelegate» Éditer la classe: package moncode; import graphe.graphepackage; import java.util.collection; import org.eclipse.emf.ecore.eobject; import org.eclipse.emf.query.conditions.eobjects.eobjectcondition; import org.eclipse.emf.query.conditions.eobjects.structuralfeatures.eobjectattributevaluecondition; import org.eclipse.emf.query.conditions.numbers.numbercondition; import org.eclipse.emf.query.statements.from; import org.eclipse.emf.query.statements.select; import org.eclipse.emf.query.statements.where; import org.eclipse.jface.action.iaction; import org.eclipse.jface.dialogs.messagedialog; public class SelectBigCostNodesDelegate extends AbstractQueryDelegate { public SelectBigCostNodesDelegate() { super("selection Noeuds de Cout supérieur ou égal à 5", null, "Pas de noeud de cout supérieur ou égal à 5"); @Override public void run(iaction action) { try { Collection<EObject> result = performquery(null); if (result.isempty()) { MessageDialog.openInformation(shell, title, notfoundmessage); else { this.editor.setselectiontoviewer(result); catch (Exception e) { // Exceptions are not expected MessageDialog.openInformation(shell, title, MESSAGE_EXCEPTION); throw new RuntimeException(e); @Override protected Collection<EObject> performquery(object value) throws Exception { /* * Looking for nodes whose "cout" > 5 */ EObjectCondition condition = new EObjectAttributeValueCondition( GraphePackage.eINSTANCE.getNoeuds_Cout(), CNRS LAAS 2I Serge Bachmann Page 33/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «menubar» NumberCondition.between(5,Integer.MAX_VALUE)); // Build the select query statement SELECT select = new SELECT( new FROM(selectedEObjects), new WHERE(condition)); // Execute query return select.execute(); Faire une sauvegarde. Structure de la classe: CNRS LAAS 2I Serge Bachmann Page 34/41
Eclipse Modeling Tools - Requête sur le modèle édité Test query dans «Menu Bar» 7 Test query dans «Menu Bar» Exécuter le plug-in sur une nouvelle plate-forme: Dans «Run Configurations» double cliquer «Eclipse Application». Mettre à jour le nom de la configuration. Cliquer «Apply»: CNRS LAAS 2I Serge Bachmann Page 35/41
Eclipse Modeling Tools - Requête sur le modèle édité Test query dans «Menu Bar» Faire «Run», fermer la fenêtre «Welcome», quelques vues. Ouvrir un projet «General > Project», le nommer «testquery». Faire un clic droit sur le projet et sélectionner la commande : «New > Other...». Sélectionner «Example EMF Model Creation Wizards > Graphe Model». Nommer le Fichier «G1.graphe» Selectionner l'objet du modèle à créer : «Graphe». Ouvrir la vue «Properties», éditer le modèle : Faire une sauvegarde. En ouvrant le modèle en mode textuel: CNRS LAAS 2I Serge Bachmann Page 36/41
Eclipse Modeling Tools - Requête sur le modèle édité Test query dans «Menu Bar» on visualise tous les attributs «Cout» associé aux nœuds: 7.1 Exécution «Query» Dans l'éditeur de «G1.graphe» sélectionner «Graphe» puis faire: ce qui donne: les Nœuds N5 et N6 qui ont un coût supérieur ou égal à 5 sont sélectionés. CNRS LAAS 2I Serge Bachmann Page 37/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «popup» menu de l'éditeur 8 Requête dans le «popup» menu de l'éditeur Pour créer rapidement cette requête on sélectionne l'onglet «plugin.xml» du «plug-in Manifest Editor», on l'édite, pour ajouter l'extension «org.eclipse.ui.popupmenus»: <?xml version="1.0" encoding="utf-8"?> <?eclipse version="3.4"?> <plugin> <extension point="org.eclipse.ui.editoractions"> <editorcontribution id="exemple.graphe.editorcontribution" targetid="graphe.presentation.grapheeditorid"> <menu id="exemple.graphe.querymenuid" label="query" path="graphemenuid/additions"> <separator name="additions"> </separator> </menu> <action class="moncode.selectbigcostnodesdelegate" id="exemple.graphe.selectbigcostnode" label="select Big Cost Nodes" menubarpath="graphemenuid/exemple.graphe.querymenuid/additions" style="push"> <enablement> <objectclass name="org.eclipse.emf.ecore.eobject"> </objectclass> </enablement> </action> </editorcontribution> </extension> <extension point="org.eclipse.ui.popupmenus"> <viewercontribution id="exemple.graphe.viewercontribution" targetid="graphe.presentation.grapheeditorid"> <menu id="exemple.graphe.querymenuid" label="query" path="additions"> <separator name="separator"> </separator> </menu> <action class="moncode.selectbigcostnodesdelegate" id="exemple.graphe.selectbigcostnodes" label="select Big Cost Nodes" menubarpath="exemple.graphe.querymenuid/additions"> <enablement> <objectclass name="org.eclipse.emf.ecore.eobject"> </objectclass> </enablement> </action> </viewercontribution> </extension> </plugin> Faire une sauvegarde. CNRS LAAS 2I Serge Bachmann Page 38/41
Eclipse Modeling Tools - Requête sur le modèle édité Requête dans le «popup» menu de l'éditeur Ce qui donne si l'on sélectionne l'onglet «Extension» CNRS LAAS 2I Serge Bachmann Page 39/41
Eclipse Modeling Tools - Requête sur le modèle édité Test requête dans le «popup» menu 9 Test requête dans le «popup» menu On relance le test avec dans la barre des outils. Une nouvelle plateforme Eclipse est lancée, on retrouve le graphe précédemment édité. Sélectionner «Graphe», faire un clic droit dans la zone d'édition et dans le menu popup menu on sélectionne «Query > Select Big Cost Nodes» ce qui donne: CNRS LAAS 2I Serge Bachmann Page 40/41
Eclipse Modeling Tools - Requête sur le modèle édité Conclusions 10 Conclusions La programmation des «Query» peut paraître complexe. Le lecteur se reportera utilement au «help» grâce à la commande «Help > Help Contents»: 11 Licence La licence «créative commons» : http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ s'applique à ce document. CNRS LAAS 2I Serge Bachmann Page 41/41