Extensions et Points d'Extensions

3 114 vues

Publié le

Ce support de cours s'intéresse à détailler les principes d'extensions et de points d'extensions de la plateforme Eclipse. Les aspects suivants sont étudiés : définition du mécanisme d'extensions, la création d'extensions (View et Preference) via l'outil PDE, description détaillée des points d'extensions et de Schema XML, création de nouveaux points d'extensions, interrogation des extensions et points d'extensions via le registre d'extensions et finalement création dynamique d'extensions et de points d'extensions.

Publié dans : Technologie
  • Soyez le premier à commenter

Extensions et Points d'Extensions

  1. 1. Développement de clients riches : Plateforme Eclipse Mickaël BARON - 2008 (Rev. Janvier 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr @mickaelbaron Chapitre 3 : Conception de plug-ins Extensions et Points d’Extensions
  2. 2. 2Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Creative Commons Contrat Paternité Partage des Conditions Initiales à l'Identique 2.0 France http://creativecommons.org/licenses/by-sa/2.0/fr Licence
  3. 3. 3Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Organisation du cours sur les extensions et les points d’extension † Extensions et points d’extension : généralités † Extension : définition † Point d’extension : définition et Schema XML † Platform : gestion du registre des extensions Tous les exemples du cours sont disponibles directement à l’adresse mbaron.developpez.com/eclipse/extension
  4. 4. 4Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et Points d’extension : généralités † Ce support de cours s’intéresse uniquement aux fondements des extensions et des points d’extensions † Le détail des principaux points d’extension de la plateforme Eclipse sera examiné dans le prochaine partie de ce chapitre où nous étudierons les points d’extension relatifs à † Vue, Editor, Perspective † Action † Activities, Themes, … † Un glossaire de tous les nouveaux acronymes et concepts est proposé à la fin de ce support de cours
  5. 5. 5Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et Points d’extension : déroulement du cours † Pédagogie du cours † Présentation des concepts † Illustration avec de nombreux exemples qui sont disponibles à l’adresse mbaron.developpez.com/eclipse/extension † Des bulles d’aide tout au long du cours † Logiciels utilisés † Eclipse 3.4 Ganymede † Pré-requis † Connaissance de Java, XML et XML Schema † Principes de base concernant la boite à outils SWT † Principes de base liés à la conception de plug-ins † Remerciements † Developpez.com : Jawher Moussa † … Ceci est une alerte Ceci est une astuce
  6. 6. 6Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et Points d’extension : ressources … † Des articles sur la notion d’extension et point d’extensions † www.eclipsetotale.com/articles/Developpement_de_plugins_Eclipse_partie2.html † www-128.ibm.com/developerworks/opensource/library/os-ecl-dynext † www.ibm.com/developerworks/xml/library/x-wxxm29.html † www.vogella.de/articles/EclipseExtensionPoint/article.html † Des supports de cours concernant XML Schema † Site W3C : www.w3.org/XML/Schema † W3Schools : www.w3schools.com/schema † Schema XML : mbaron.developpez.com/divers/schemaxml † Des livres † Eclipse – Building Commercial-Quality Plug-ins, 2004 - ISBN : 0-321-22847-2 † Eclipse – Rich Client Platform, 2005 – ISBN : 0-321-33461-2
  7. 7. 7Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et points d’extension : généralités † Le framework de la plateforme Eclipse fournit un socle à base de plug-ins extensibles † Plug-in pour créer des vues (View) † Plug-in pour créer des pages de préférences (PreferencePages) † Plug-in pour créer un éditeur (Editor) † Plug-in pour créer une perspective (Perspective), … † Les plug-ins extensibles du socle permettent à de nouveaux plug-ins de les étendre et devenir à leur tour extensible † Une application Eclipse est donc basée sur un ensemble de plug-ins du framework de la plateforme et de plug-ins développés pour les besoins spécifiques
  8. 8. 8Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et points d’extension : généralités † Un point d’extension est un mécanisme propre à Eclipse permettant la connexion entre plug-ins † Un point d’extension décrit un contrat entre le plug-in émetteur du contrat et ses plug-ins clients † Ce contrat est défini au travers d’un XML Schema (fichier au format .exsd) † La grammaire définie par le schéma XML doit être respectée par les plug-ins souhaitant se brancher au plug-in qui définit le point d'extension † Généralement le point d'extension stipule la manière dont des interfaces et/ou des classes doivent être utilisées par d’autres plug-ins † Le fichier plugin.xml permet de déclarer les noms des fichiers schémas XML utilisés par un plug-in
  9. 9. 9Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et points d’extension : généralités † L’extension est la réponse apportée à un point d’extensions † Les plug-ins qui souhaitent se brancher à un point d’extensions déclare ainsi une extension † Pour tout point d’extension exploité par un plug-in une extension est obligatoirement réalisée † Un même point d’extension peut être connecté à plusieurs extensions † Un plug-in peut définir des extensions connectées à des points d’extension que ce même plug-in a définis † L’extension devra par conséquent respecter le schéma XML imposé par le point d’extensions † Le fichier plugin.xml permet la description des extensions d’un plug-in client
  10. 10. 10Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et points d’extension : généralités Plug-in A Trois fichiers schéma XML définissent respectivement la grammaire des trois points d’extensions Ext1 Ext2 Le Plug-in B définit trois points d’extension dont deux sont connectés à des extensions Plug-in B Point1 Point2 Point3 point1.exsd point2.exsd point3.exsdplugin.xml Un point d’extension peut être branché à plusieurs extensions Le fichier plugin.xml spécifie trois points d’extension et leur fichier respectif Le Plug-in A définit deux extensions branchées à deux points d’extension du plug-in B Ce point d’extension est défini mais pas branché à une extension Une extension ne peut exister sans point d’extension associé plugin.xml Le fichier plugin.xml contient la définition des extensions créées par le plug-in A
  11. 11. 11Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et points d’extension : généralités † Dans le précédent cours lié à la conception de plug-ins nous avons vu que des plug-ins pouvaient collaborer sans passer par les points d’extensions † Un plug-in peut simplement importer des classes d’un autre plug-in en utilisant la balise require-bundle définie dans le fichier de configuration MANIFEST.MF † En utilisant l’importation, les services offerts sont ceux qui ont été développés. Dés lors, les services ne seront disponibles qu’à la suite d’une compilation † En utilisant les points d’extensions, les services sont spécifiés via les schémas XML et sont disponibles avant même qu’ils soient développés
  12. 12. 12Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extensions et points d’extension : généralités † La plateforme Eclipse fournit un registre d’extensions qui permet d’interroger les extensions disponibles à l’exécution † Le registre d’extensions est accessible via une API † Au travers de cette API, il est possible de déclencher des services exposés par les points d’extensions † La classe Platform (vue précédemment pour les Logs, …) fournit des méthodes pour accéder au registre d’extensions † Dans la suite, nous présentons les méthodes de Platform pour accéder aux extensions et nous donnons des exemples représentatifs de leur utilisation
  13. 13. 13Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension : définition et création † Dans cette partie, nous étudions la création d’extension à partir de points d’extension définis par le framework Eclipse † La création d’une vue, qui est sans doute le point d’extension le plus utilisé lors de la création d’une application Eclipse † La création de page de préférence (exemple déjà illustré dans le partie JFace (Composants additionnels avec JFace) † L’objectif de cette partie est d’insister sur † La création des extensions à partir de l’outil PDE (Plugin Development Environment) † Le respect des grammaires des points d’extension définies dans des XML Schema † L’implémentation de certaines classes (si présentes) exigée par la grammaire du point d’extensions
  14. 14. 14Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création † Sélectionner à partir du menu Eclipse l’action File -> New -> Project pour l’assistant de création de plug-in (Plug-in Project) Décocher cette option de façon à ce que ce plug-in ne crée pas automatiquement une vue Projet ViewExample
  15. 15. 15Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création La liste des extensions est actuellement vide, nous allons dans la suite ajouter une extension † Sélectionner l’onglet Extensions à partir de l’outil PDE lors de l’édition du fichier plugin.xml ACTION : Utiliser le bouton « add » pour ajouter de nouvelles extensions L’onglet Extensions est utilisé pour gérer toutes les extensions d’un plug-in
  16. 16. 16Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Cet assistant permet de choisir les points d’extension de manière à créer une nouvelle extension Liste tous les points d’extension dont les plug-ins associés sont visibles depuis le plug-in en cours de développement (classpath et projet Eclipse en cours)
  17. 17. 17Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création L’onglet Extension Wizards permet de choisir des squelettes prêts à l’emploi de création d’extension Liste l’ensemble des assistants de création d’extension Si un squelette de création est sélectionné, une description est donnée
  18. 18. 18Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Ce champ de texte permet d’effectuer une sélection en appliquant un filtre Exemple : *.ui donne tous les points d’extension qui contiennent le package ui En décochant cette option les points d’extension dont les plug-ins ne sont pas précisés dans les dépendances seront également visibles † Sélectionner le point d’extension org.eclipse.ui.views Une description est donnée lorsqu’un point d’extension est sélectionné S’il existe des squelettes prêts à l’emploi de création d’extension, ils sont affichés dans cette liste
  19. 19. 19Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Ce lien permet d’ouvrir la description du point d’extension sélectionné Description du contrat (défini dans un XML Schema) relatif au point d’extension Views
  20. 20. 20Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Le plug-in qui définit le point d’extension est ajouté dans la liste des dépendances s’il n’est pas présent initialement Le plug-in org.eclipse.ui est ajouté comme dépendance puisqu’il définit un point d’extension qui est utilisé Onglet Dependencies
  21. 21. 21Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création L’extension relative au point d’extension org.eclipse.ui.views a été créée Possibilité d’avoir un aperçu détaillé du contrat du point d’extension sélectionné Onglet Extensions
  22. 22. 22Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Pour ajouter des éléments à l’extension en cours, afficher le menu popup (bouton droit de la souris) † Ajouter un élément view à l’extension L’outil PDE fournit une aide pour respecter le contrat imposé par le point d’extensions Le contrat définit que trois éléments facultatifs sont autorisés Dans la suite, nous présenterons rapidement le format XML Schema
  23. 23. 23Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création L’élément view est créé Différents attributs sont à renseigner Onglet Extensions
  24. 24. 24Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Les attributs de l’élément view sont également décrits dans le contrat du point d’extension Views Les attributs suivis du caractère * doit être obligatoirement renseignés Une description détaillée de tous les champs permet de les exploiter facilement Les commentaires sont très importants. Ils permettent de comprendre l’utilité des éléments et des attributs
  25. 25. 25Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Id unique qui représente l’identifiant de la vue Nom donné à la vue qui sera affiché à l’utilisateur Une classe qui doit implémenter IViewPart ou hériter ViewPart Id des catégories utilisées pour référencer les vues Nom de l’image associée à la vue Une description détaillée du point d’extension views sera étudiée dans la prochaine partie de ce chapitre En cliquant sur le lien class, l’assistant de création de classe est utilisé si la classe n’existe pas
  26. 26. 26Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création L’assistant configure automatiquement les champs La classe doit hériter obligatoirement de ViewPart Préciser le nom de la classe
  27. 27. 27Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création package eclipse.extension.viewexample; public class SampleView extends ViewPart { public SampleView() { // TODO Auto-generated constructor stub } @Override public void createPartControl(Composite parent) { Label myLabel = new Label(parent, SWT.NONE); myLabel.setText("Hello World in a new View"); } @Override public void setFocus() { // TODO Auto-generated method stub } } SampleView.java du Projet viewExample ViewPart est une classe abstraite A utiliser pour construire l’interface utilisateur de la vue (utiliser les compétences vues dans le précédent chapitre) Préciser le composant qui prendra le focus lors de l’affichage de la vue † Implémenter le code spécifique à la vue (utilisation des boîtes à outils SWT et JFace)
  28. 28. 28Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création Onglet plugin.xml Toutes les informations liées aux extensions sont stockées dans le fichier plugin.xml plugin.xml du projet viewExample Une extension est associée obligatoirement à un point d’extensions
  29. 29. 29Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension View : définition et création La vue est disponible dans la liste Une nouvelle vue est venue étendre les fonctionnalités d’une application Eclipse
  30. 30. 30Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création † Dans le précédent chapitre, nous avions étudié la mise en place d’un gestionnaire de préférences en utilisant l’API Preference † Nous devions définir de manière programmatique † Le conteneur de pages de préférences † Les pages et leur agencement interne via des objets FieldEditor † Agencement entre les pages (PreferenceNode) † Dans une application Eclipse, il n’existe qu’un seul conteneur de pages de préférences † L’intérêt d’utiliser les points d’extension est de pouvoir étendre ce conteneur de pages de préférences d’une application Eclipse † La construction de chaque page restera à la charge du développeur. Cette étape reste identique à celle présentée dans le chapitre précédent
  31. 31. 31Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création † Sélectionner à partir du menu Eclipse l’action File -> New -> Project pour l’assistant de création de plug-in (Plug-in Project) Décocher cette option de façon à ce que ce plug-in ne crée pas automatiquement un vue Projet PreferenceExamples
  32. 32. 32Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création † Choisir le point d’extension org.eclipse.ui.preferencePages Le point d’extension preferencePages propose un squelette prêt à l’emploi Une description du point d’extension preferencePages est donnée
  33. 33. 33Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création † Ajouter un élément page à l’extension preferencePage Pour ajouter des éléments à l’extension preferencePage, afficher le menu popup (bouton droit de la souris) L’outil PDE fournit une aide pour respecter le contrat imposé par le point d'extension preferencePage Le contrat définit qu’un élément facultatif est autorisé
  34. 34. 34Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création L’élément page est créé Différents attributs sont à renseigner Onglet Extensions
  35. 35. 35Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création Id unique qui représente l’identifiant de la page Nom donné à la page qui sera affiché à l’utilisateur Une classe qui doit implémenter IWorkbenchPreferencePage Id de la page « parent » utilisé pour agence les pages entre elles Une description détaillée du point d'extension preferencePage sera étudiée dans la prochaine partie de ce chapitre
  36. 36. 36Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création † Définir que Page Two est fille de Page One L’identifiant de Page One L’identifiant de Page One est utilisé pour indiquer à Page Two qu’il s’agit d’une sous page
  37. 37. 37Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création La classe doit hériter un sous type de PreferencePage Préciser le nom de la classe La classe doit implémenter l’interface IWorkbenchPreferencePage
  38. 38. 38Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création public class PreferenceFieldEditorPageTwo extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { private static final String FONT_PROPERTIES = "pageTwo.font"; private static final String RADIO_PROPERTIES = "pageTwo.radio"; private static final String PATH_PROPERTIES = "pageTwo.path"; private static final String SCALE_PROPERTIES = "pageTwo.scale"; public PreferenceFieldEditorPageTwo() { super("Page Deux", GRID); } protected void createFieldEditors() { FontFieldEditor ffe = new FontFieldEditor(FONT_PROPERTIES, "Police", getFieldEditorParent()); addField(ffe); final String[][] strings = new String[][] {{ "Première Valeur", "tag1"}, ...}; RadioGroupFieldEditor rfe = new RadioGroupFieldEditor(RADIO_PROPERTIES, "RadioGroup", 2, strings, getFieldEditorParent(), true); addField(rfe); PathEditor pe = new PathEditor(PATH_PROPERTIES, "Path:", "Choisir des chemins", getFieldEditorParent()); addField(pe); ScaleFieldEditor sfe = new ScaleFieldEditor(SCALE_PROPERTIES, "Echelle", getFieldEditorParent(), 0, 100, 1, 10); addField(sfe); } public void init(IWorkbench workbench) { } } † Implémenter le code spécifique à la page de préférence Il s’agit du même code que celui présenté dans le précédent chapitre (Composants Aditionnels avec JFace) Cette méthode est appelée à l’instanciation de cette classe
  39. 39. 39Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création Onglet plugin.xml La description de l’extension qui vient d’être créée Description de l’élément Page One Description de l’élément Page Two
  40. 40. 40Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Tutoriel extension Preference : définition et création Ouvrir l’éditeur de préférence Les fonctionnalités de l’application Eclipse ont été étendues en ajoutant deux pages de préférences
  41. 41. 41Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Extension : définition et création † Toutes les informations de création d’une extension sont stockées dans le fichier plugin.xml <?xml encoding="US-ASCII"?> <?eclipse version="3.2"?> <!ELEMENT plugin (extension-point*, extension*)> <!ELEMENT fragment (extension-point*, extension*)> <!ELEMENT extension-point EMPTY> <!ATTLIST extension-point name CDATA #REQUIRED id CDATA #REQUIRED schema CDATA #IMPLIED > <!ELEMENT extension ANY> <!ATTLIST extension point CDATA #REQUIRED name CDATA #IMPLIED id CDATA #IMPLIED > Les fragments seront étudiés dans la partie internationalisation Une extension est obligatoirement associée à un point d'extensionplugin.dtd est la description du fichier plugin.xml Une extension contient un corps qui varie selon le nature du point d’extensions L’élément extension-point est étudié en détail dans la suite Un plug-in peut décrire des points d’extension et ou des extensions
  42. 42. 42Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : définition et création † Précédemment nous avons montré l’utilisation de points d’extension fournis par le framework Eclipse † Nous présentons dans cette partie que tout plug-in autre que ceux du framework peut créer ses propres points d’extension † Pour rappel, un point d’extension est défini par une grammaire au format XML Schema † Il y autant de fichiers XML Schema qu’il y a de points d’extension définis dans le plug-in † Un plug-in expose ses points d’extension aux autres plug-ins si les fichiers XML Schema associés sont précisés dans le fichier plugin.xml
  43. 43. 43Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Localisation du schéma XML † Le plug-in org.eclipse.ui définit de nombreux points d’exten- sion comme Views et PreferencePages Pour chaque point d’extension est défini le XML Schema servant à décrire sa grammaire plugin.xml du projet org.eclipse.ui Ce plug-in définit également un ensemble d’extension connecté à des points d’extension que ce même plug-in a définis
  44. 44. 44Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Localisation du schéma XML † La grammaire d’un point d’extension est accessible soit au niveau de l’outil PDE lors de la création d’une extension … plugin.xml du projet PreferenceExamples Ouvre une description pré- formatée de la grammaire du point d’extension Ouvre une description du fichier Schema XML
  45. 45. 45Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Localisation du schéma XML † Ou soit au niveau du plug-in qui définit le point d’extension plugin.xml du projet org.eclipse.ui Les fichiers au format Schema XML du plug-in org.eclipse.ui sont localisés dans le fichier org.eclipse.ui.source_3.x.x.jar dans le répertoire schema Accés aux informations du points d’extension sélectionnés
  46. 46. 46Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Localisation du schéma XML Contenu du fichier org.eclipse.ui.source_3.x.x.jar Par convention, les fichiers Schema XML sont localisés dans le répertoire schema du plug-in
  47. 47. 47Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Description du schéma XML preferencePages.exsd du projet org.eclipse.ui L’onglet Source de l’outil PDE permet l’édition à la « mano » du schema XML de description des points d’extension Le schema XML d’un point d’extension est à première vue très verbeux et toutes modifications dans ce mode de visualisation en dévient difficiles … † Visualisation du Schema XML en mode Source
  48. 48. 48Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Description du schéma XML † Visualisation du Schema XML en mode Définition L’onglet Definition de l’outil PDE pour l’édition à base de formulaire du Schema XML d’un point d’extension Ce mode de représentation facilite l’édition d’un Schema XML d’un point d’extension Même si cet outil facilite la construction du Schema XML du point d’extension, il demande de la part du concepteur des connaissances en Schema XML Des outils pour spécifier facilement des indicateurs d’ordre entre éléments
  49. 49. 49Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Description du schéma XML † Description du Schema XML en mode Définition (bis) L'élément extension est l'élément racine preferencePages.exsd du projet org.eclipse.ui L'élément extension est de type complexe et contient des sous éléments page (0 ou plusieurs) et trois attributs (point, id et name) Un élément page contient quatre attributs (identifiant de la page, le nom de la page, la classe implémentant le comportement de la page et l'emplacement de la page) Un élément page de type complexe contient également des sous éléments de type keywordReference
  50. 50. 50Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Description du schéma XML <element name="extension"> <complexType> <sequence> <element ref="page" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="point" type="string" use="required" /> <attribute name="id" type="string" /> <attribute name="name" type="string" /> </complexType> </element> <element name="page"> <complexType> <sequence> <element ref="keywordReference" minOccurs="0"maxOccurs="unbounded"/> </sequence> <attribute name="id" type="string" use="required" /> <attribute name="name" type="string" use="required" /> <attribute name="class" type="string" use="required" /> <attribute name="category" type="string" /> </complexType> </element> <element name="keywordReference"> ... </element> † Description du Schema XML en mode Source (bis) Extrait de preferencePages.exsd du projet org.eclipse.ui extension contient des sous éléments page (0 ou plusieurs) et trois attributs (point, id et name) page contient quatre attributs
  51. 51. 51Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Description du schéma XML <plugin> <extension point="org.eclipse.ui.preferencePages"> <page class="eclipse.extension.preferenceexamples.PreferenceFieldEditorPageOne" id="eclipse.extension.preferenceexamples.pageOneId" name="Page One"> </page> <page category="eclipse.extension.preferenceexamples.pageOneId" class="eclipse.extension.preferenceexamples.PreferenceFieldEditorPageTwo" id="eclipse.extension.preferenceexamples.pageTwoId" name="Page Two"> </page> </extension> </plugin> † Création d'une extension à partir de la description d'un point d'extension La balise extension est le point de départ de la description d'une l'extension preferencePages plugin.xml du projet PreferenceExamples 3 attributs sur 4 ont été utilisés (1 attribut est optionnel) Deux pages de préférences ont été créés comme sous élément de la balise extension
  52. 52. 52Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Conventions à respecter † Lors de la définition du Schema XML d'un nouveau point d'extension, veuillez assurer la présence de l'élément extension et de ces trois attributs (point, id, name) † L'élément extension est utilisé comme élément racine lors de la création d'une extension † Toute la structure d'un point d'extension dépend des sous éléments de l'élément extension <element name="extension"> <complexType> <sequence> <element ref="page" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="point" type="string" use="required" /> <attribute name="id" type="string" /> <attribute name="name" type="string" /> </complexType> </element> Sous éléments structurant le point d'extension
  53. 53. 53Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Exemple † Dans la suite du cours, nous présentons la création des points d'extension via l'exemple de la calculatrice † Il s'agit d'une calculatrice extensible où chaque opérateur est défini au travers d'une extension † Un point d'extension est défini par type d'opérateur (opérateurs binaires, unaires, fonctions de calculs, …) † Pour simplifier l'exemple, limitons nous à l'usage des opérateurs binaires en définissant deux opérateurs plus et moins † Un plug-in Calculator décrit le point d'extension opérateur binaire et deux plug-ins définissent respectivement les opérateurs plus et moins † Le plug-in Calculator définit également le dialogue homme machine de la calculatrice
  54. 54. 54Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Exemple Plus plusId Calculator BinaryOperator BinaryOperator † Description détaillée de l'exemple Minus minusId plugin.xml Le plug-in Plus définit une extension plusId basée sur le point BinaryOperator Un fichier schéma XML définit la grammaire du point d'extension BinaryOperator Le fichier plugin.xml spécifie un point d'extension et son fichier respectif binaryoperator.exsd Le plug-in Minus définit une extension minusId basée sur le point BinaryOperator Plug-in défini par le projet binaryOperator.minus Plug-in défini par le projet binaryOperator.plus Fichier classe Plus implémentant l'opérateur minus
  55. 55. 55Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Exemple † Description détaillée du point d'extension L'élément binaryOperator définit trois attributs Utilisé pour stocker l'identifiant de l'opérateur Utilisé pour désigner le nom de l'opérateur Utilisé pour définir l'interface qui implémentera le comportement de l'opérateur Un élément binaryOperator doit au moins être présent une fois L'élément extension est le l'élément racine et doit être présent Veuillez assurer que l'élément extension est défini et qu'il contient les attributs point, id et name
  56. 56. 56Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d'extension : Création d'un point d'extension Onglet Extension Points Action Add permet d'ajouter une nouvelle déclaration d'un point d'extension au fichier plugin.xml † Sélectionner l’onglet Extension Points à partir de l’outil PDE lors de l’édition du fichier plugin.xml plugin.xml du projet Calculator
  57. 57. 57Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d'extension : Création d'un point d'extension † Editer les informations pour la création d'un nouveau point d'extension Identifiant du point d'extension utilisé lors de la création d'une extension (attribut point de l'élément extension) Nom du point d'extension (attribut name) Schema XML qui décrit le point d'extension (attribut schema)
  58. 58. 58Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d'extension : Création d'un point d'extension Onglet plugin.xml plugin.xml du projet Calculator † Les informations concernant la création d'un nouveau point d'extension ont été sauvegardées dans le fichier plugin.xml Pour chaque point d'extension les trois attributs id, name et schema sont sauvegardés
  59. 59. 59Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d'extension : Création d'un point d'extension † Les informations concernant la création d'un nouveau point d'extension apparaissent dans l'outil PDE Onglet Extension Points plugin.xml du projet Calculator Le point d'extension binaryOperator est disponible dans la liste des points d'extension du plug-in Calculator conformément au contenu du fichier plugin.xml
  60. 60. 60Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création d'un point d'extension binaryoperator.exsd du projet Calculator Différentes actions pour créer des éléments, des attributs et des indicateurs d'ordre Onglet Definition
  61. 61. 61Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création des éléments † Création de l'élément binaryOperator Une description de l'élément peut être donnée L'élément binaryOperator a été ajouté au Schema XML binaryoperator.exsd du projet Calculator
  62. 62. 62Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création des attributs † Un élément peut contenir des attributs dont les types sont restreints à † boolean : un attribut contenant la valeur true ou false † string : un attribut contenant un nom † java : une référence à un objet Java † ressource : une référence à un fichier ressource (image par exemple) † identifier : un identifiant du conteneur Eclipse † Selon le type de l'attribut choisi, différentes options sont disponibles dans les interfaces de PDE
  63. 63. 63Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création des attributs Attribut de type resource Attribut de type boolean Attribut de type string Restriction sur le contenu de la chaîne de caractères au travers d'une énumération Contenu de la chaîne de caractères peut être traduite
  64. 64. 64Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création des attributs Attribut de type java Possibilité de préciser une classe à étendre et / ou une interface à implémenter Attribut de type identifier Précise un nom d'identifiant du conteneur Eclipse
  65. 65. 65Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création des attributs † Création des attributs de l'élément binaryOperator Onglet Definition Trois attributs ont été définis L'interface IBinaryOperator devra être implémentée L'attribut class est de type java binaryoperator.exsd du projet Calculator
  66. 66. 66Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Création des attributs † Création de l'interface IBinaryOperator package eclipse.extension.calculator.binaryoperator; public interface IBinaryOperator { Double compute(Double left, Double right); } IBinaryOperator du projet Calculator Toute extension créée devra implémenter cette interface La méthode compute permet de faire des opérations sur un membre de gauche et un membre de droite
  67. 67. 67Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Indicateur d'ordre † Ajouter une séquence sur l'élément extension binaryoperator.exsd du projet CalculatorOnglet Definition Deux types d'indicateur d'ordre autorisés : choice et sequence Possibilité de définir le nombre d'occurrence
  68. 68. 68Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Extensions liées à BinaryOperator † Extension minusId (définition des attributs) plugin.xml du projet MinusOnglet Extension L'attribut class impose la création d'une class Minus qui implémente IBinaryOperator
  69. 69. 69Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Extensions liées à BinaryOperator † Extension minusId (implémentation de IBinaryOperator) package eclipse.extension.binaryoperator.minus; import eclipse.extension.calculator.binaryoperator.IBinaryOperator; public class Minus implements IBinaryOperator { public Minus() { } public Double compute(Double left, Double right) { double leftValue = left.doubleValue(); double rightValue = right.doubleValue(); double doubleResult = leftValue - rightValue; return doubleResult; } } Minus.java du projet Minus Impose que le plugin Minus à une dépendance vers le plugin Calculator Interface à implémenter (respect du contrat) L'implémentation définit le comportement de l'opérateur moins
  70. 70. 70Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Extensions liées à BinaryOperator † Extension plusId (définition des attributs) plugin.xml du projet Plus Onglet Extension L'attribut class impose la création d'une class Plus qui implémente IBinaryOperator Un seul projet aurait pu être utilisé pour définir plusieurs extensions du point d'extension binaryoperator
  71. 71. 71Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Extensions liées à BinaryOperator † Extension plusId (implémentation de IBinaryOperator) package eclipse.extension.binaryoperator.plus; import eclipse.extension.calculator.binaryoperator.IBinaryOperator; public class Plus implements IBinaryOperator { public Plus() { } public Double compute(Double left, Double right) { double leftValue = left.doubleValue(); double rightValue = right.doubleValue(); double doubleResult = leftValue + rightValue; return doubleResult; } } Plus.java du projet Plus Impose que le plugin Plus à une dépendance vers le plugin Calculator Interface à implémenter (respect du contrat) L'implémentation définit le comportement de l'opérateur moins
  72. 72. 72Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Traitement des extensions † Bilan actuel de l'exemple Calculatrice † Le plug-in Calculator décrit le point d'extension binaryoperator † Les plug-ins Minus et Plus définissent respectivement les extensions plusId et minusId (création de deux classes) † Reste à faire … † Fournir une interface utilisateur qui permettra de saisir les nombres à calculer et l'opérateur de calcul. Le résultat du calcul sera affiché (utilisation d'une extension View) † Choisir une implémentation de l'interface IBinaryOperator et faire appel à la méthode compute (utilisation des extensions minusId et plusId)
  73. 73. 73Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Traitement des extensions † Interface utilisateur de l'exemple Calculatrice Choix de l'opérateur Membre de gauche Membre de droite Demande du calcul : 23 - 3 Affichage du résultat du calcul 23 - 3 = 20 CalculatorView.java du projet Calculator
  74. 74. 74Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Traitement des extensions † Le nombre d'opérateurs contenu dans le composant Combo dépend du nombre d'extensions binaryoperator définit à l'exécution du plugin Calculator Deux extensions binaryoperator ont été prises en compte Ici, une seule extension binaryoperator a été prise en compte
  75. 75. 75Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Point d’extension : Traitement des extensions † Comme chaque extension binaryoperator est définie dans un plugin spécifique, il suffit d'ajouter ou pas ces plugins dans l'environnement d'exécution du plugin Calculator Environnement d'exécution du projet Calculator Seule l'extension minusId (du plugin minus) est prise en compte
  76. 76. 76Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : gestion du registre des extensions † Le registre des extensions permet de connaître pour un point d'extension les extensions qui existent † Le registre des extensions est accessible par programmation via une API fournit par le plateforme Eclipse † Au travers du registre d'extensions il est possible d'accéder au contenu d'une extension † Connaître son identifiant unique † Connaître les valeurs de chaque attribut † Instancier une classe décrite par un attribut de l'extension † Le registre des extensions permet également de créer dyna- miquement des extensions † Exemple : création d'une extension View de manière programmatique † Registre des extensions est accessible via la classe Platform † static IExtensionRegistry getExtensionRegistry()
  77. 77. 77Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les extensions † L'interface IExtensionRegistry fournit une API permettant d'interroger les extensions à partir de leur identifiant ou d'un espace de nommage † IExtension getExtension(String extId) : récupère une extension par son identifiant unique † IExtension getExtension(String extPointId, String extId) : récupère une extension par l'id du point d'extension et via l'id de l'extension † IExtension[] getExtensions(String namespace) : récupère toutes les extensions déclarées dans l'espace de nommage donné
  78. 78. 78Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les extensions † Pour rappel, l'identifiant unique d'une extension est donnée par l'intermédiaire de l'attribut id de l'élément extension † La valeur est optionnelle et par défaut elle vaut null plugin.xml du projet Calculator Onglet Extension L'identifiant de cette extension est eclipse.extension.Calculator.calculatorViewId Si aucun espace de nommage est utilisé pour définir l'identifiant de l'extension, c'est l'identifiant du plugin qui est utilisé comme espace de nommage
  79. 79. 79Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les extensions † Exemple 1 : récupérer une extension par son identifiant ... Button example1Button = new Button(parent, SWT.FLAT); example1Button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); IExtension extension = extensionRegistry.getExtension( "eclipse.extension.binaryoperator.minusId"); System.out.println(extension.getLabel()); } }); example1Button.setText("Extension MinusID"); RegistryQueryView.java du projet Calculator Vue RegistryQueryView Récupère une extension à partir de son identifiant unique
  80. 80. 80Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les extensions † Exemple 2 : récupérer toutes les extensions d'un namespace ... Button example2Button = new Button(parent, SWT.FLAT); example2Button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); IExtension[] extensions = extensionRegistry.getExtensions("eclipse.extension.binaryoperator"); for (IExtension current : extensions) { System.out.println(current.getLabel()); } } }); example2Button.setText("Extensions"); RegistryQueryView.java du projet Calculator Vue RegistryQueryView Récupère toutes les extensions à partir de l'espace de nommage eclipse.extension.binaryoperator Espace de nommage
  81. 81. 81Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les points d'extension † L'interface IExtensionRegistry fournit une API permettant d'interroger les extensions et les points d'extension à partir de leur identifiant ou d'un espace de nommage † IExtensionPoint getExtensionPoint(String extPointId) : récupère le point d'extension à partir de son identifiant † IExtensionPoint getExtensionPoint(String nspace, String extPointId) : récupère le point d'extension à partir de son espace de nommage et de son identifier) † IExtensionPoint[] getExtensionPoints() : récupère tous les points d'extension du registre † IExtensionPoint[] getExtensionPoints(String namespace) : retourne tous les points d'extension définis dans l'espace de nommmage
  82. 82. 82Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les points d'extension † Exemple 1 : récupérer un point d'extension par son identifiant ... Button example3Button = new Button(parent, SWT.FLAT); example3Button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); IExtensionPoint extPoint = extensionRegistry.getExtensionPoint(" eclipse.extension.calculator.binaryoperator"); System.out.println(extPoint.getLabel()); } }); example3Button.setText("Point Extension binaryoperator"); RegistryQueryView.java du projet Calculator Récupère un point d'extension à partir de son identifiant unique Vue RegistryQueryView
  83. 83. 83Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : récupérer les points d'extension † Exemple 2 : récupérer tous les points d'extension du registre ... Button example4Button = new Button(parent, SWT.FLAT); example4Button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); IExtensionPoint[] extPoint = extensionRegistry.getExtensionPoints(); for (IExtensionPoint current : extPoint) { System.out.println(current.getUniqueIdentifier()); } } }); example4Button.setText("Points Extension"); Récupère tous les points d'extension du registre d'extension RegistryQueryView.java du projet Calculator Vue RegistryQueryView
  84. 84. 84Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IExtension † L'interface IExtension décrit un objet extension dont les principales méthodes † String getLabel() : le nom donné à l'extension (valeur donnée à l'attribut name de l'élément extension) † String getExtensionPointUniqueIdentifier() : identifiant unique du point d'extension pour lequel l'extension contribue † String getNamespaceIdentifier() : l'espace de nommage de l'extension (exemple : eclipse.extension.binaryoperator) † String getSimpleIdentifier() : l'identifiant simple (exemple : plusId) † String getUniqueIdentifier() : l'identifiant unique (exemple : eclipse.extension.binaryoperator.plusId) † IConfigurationElement[] getConfigurationElements() : retourne les éléments de configuration déclarés dans le fichier plugin.xml (IConfigurationElement est détaillée dans la suite)
  85. 85. 85Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IExtensionPoint † L'interface IExtensionPoint décrit un objet extension dont les principales méthodes † String getLabel() : le nom donné à l'extension (valeur donnée à l'attribut name de l'élément meta.schema) † String getNamespaceIdentifier() : l'espace de nommage de l'extension (exemple : eclipse.extension.binaryoperator) † String getSimpleIdentifier() : l'identifiant simple (exemple : plusId) † String getUniqueIdentifier() : l'identifiant unique (exemple : eclipse.extension.binaryoperator.plusId) † String getSchemaReference() : le chemin et le nom du fichier de description (exemple : schema/eclipse.extension…binaryoperator.exsd)
  86. 86. 86Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IExtensionPoint † L'interface IExtensionPoint décrit un objet extension dont les principales méthodes (suite) … † IConfigurationElement[] getConfigurationElements() : retourne les éléments de configuration de toutes les extensions qui contribuent au point d'extension courant † IExtension getExtension(String extensionId) : retourne une extension à partir de son identifiant unique et contribuant au point d'extension † IExtension[] getExtensions() : retourne toutes les extensions contribuant au point d'extension courant
  87. 87. 87Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IConfigurationElement † Un élément de configuration décrit le contenu d'un élément d'une extension (un accès aux différentes valeurs) † Ces informations de configuration sont issues du contenu placé dans le fichier plugin.xml † A noter qu'une extension n'est pas forcément associée à un seul élément de configuration † Pour une extension donnée contribuant au point d'extension org.eclipse.ui.views plusieurs vues peuvent être définies
  88. 88. 88Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IConfigurationElement † Exemple : création de plusieurs vues à partir d'une extension † Identifiant du point d'extension : org.eclipse.ui.views † Identifiant de l'extension : calculatorViewId plugin.xml du projet Calculator Onglet Extension La valeur de l'identifiant unique d'une extension n'est pas obligatoire, cette valeur est généralement omise Cette extension définit deux éléments de configuration représentés par Calculator et RegistryQueryView
  89. 89. 89Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IConfigurationElement † Un élément de configuration est hiérarchique, il peut contenir également des sous éléments de configuration plugin.xml du projet Calculator Onglet Extension L'élément de configuration Calculator défini un sous élément de configuration représenté par description
  90. 90. 90Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IConfigurationElement † Un élément de configuration est définit par l'interface IConfigurationElement dont les principales méthodes sont † String getAttribute(String name) : retourne la valeur contenu par l'attribut désigné par name † String[] getAttributeNames() : liste l'ensemble des attributs d'un élément de configuration † IConfigurationElement[] getChildren() : retourne l'ensemble des sous éléments définis par l'élément de configuration courant † Object getParent() : retourne le parent de cet élément (IExtension ou IConfigurationElement) † IExtension getDeclaringExtension() : retourne l'extension associé à l'élément de configuration † Object createExecutableExtension(String propertyName) : création d'un objet pour un attribut de type Class
  91. 91. 91Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IConfigurationElement † Exemple : lister l'ensemble des attributs d'un élément de configuration ... Button exemple5Button = new Button(parent, SWT.FLAT); exemple5Button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); IExtensionPoint extPoint = extensionRegistry.getExtensionPoint(" eclipse.extension.calculator.binaryoperator"); IConfigurationElement[] configurationElements = extPoint.getConfigurationElements(); for (IConfigurationElement current : configurationElements) { String[] attributeNames = current.getAttributeNames(); for (String currentAttributeName : attributeNames) { System.out.println("Attribut : " + currentAttributeName +" / Valeur : "+ current.getAttribute(currentAttributeName)); } } } }); exemple5Button.setText("Attributs/Valeurs"); RegistryQueryView.java du projet Calculator
  92. 92. 92Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : IConfigurationElement † Exemple : création d'un objet de type IBinaryOperator ... compute.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int selectionIndex = myCombo.getSelectionIndex(); if (selectionIndex != -1) { Double leftDouble = Double.parseDouble(leftInput.getText()); Double rightDouble = Double.parseDouble(rightInput.getText()); try { IBinaryOperator binaryOperator = (IBinaryOperator) (contributions[selectionIndex] .createExecutableExtension("class")); Double resultDouble = binaryOperator.compute(leftDouble, rightDouble); resultText.setText(resultDouble.toString()); } catch (CoreException e1) { e1.printStackTrace(); } } } }); CalculatorView.java du projet Calculator A partir de l'attribut class construction d'un objet binaryOperator Appel de la méthode compute
  93. 93. 93Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaronPlatform : créer de nouvelles extensions dynamiquement † Pour l'instant, nous avons étudié la création des extensions et des points d'extension de manière statique via PDE † Définition des points d'extension dans un schéma XML † Description du schéma dans le fichier plugin.xml † Définition des extensions dans le fichier plugin.xml † La plateforme Eclipse fournit des mécanismes permettant de créer programmatiquement de nouvelles extensions et points d'extension † A noter que ces mécanismes sont en cours d'évolution et l'utilisation d'API internes est à éviter … † Dans la suite, nous étudions † Des exemples pour ajouter du contenu dans le registre d'extension † Des solutions pour limiter l'utilisation d'API internes
  94. 94. 94Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addExtension † Une première solution consiste à utiliser l'API Interne ExtensionRegistry via la méthode (non recommandé) † boolean addExtension(String id, IContributor contributor, boolean persist, String label, String extPointId, ConfigurationElementDescription confs, Object userToken) † id : identifier de l'extension (peut être vide mais pas null) † contributor : contributeur de l'extension † persist : si encore présent au redémarrage d'Eclipse † label : nom de l'extension (peut être vide mais pas null) † extPointId : identifiant de l'extension † confs : éléments qui décrivent la configuration de l'extension † userToken : objet utilisé pour vérifier les permissions d'écriture
  95. 95. 95Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addExtension † Un objet ConfigurationElementDescription permet de décrire le contenu d'une extension † ConfigurationElementDescription(String name, ConfigurationElementAttribute[] attributes, String value, ConfigurationElementDescription[] children) † name : nom de l'élément de configuration † attributes : liste les attributs de cet élément de configuration † value : valeur à stocker † children : sous éléments de configuration † Un objet ConfigurationElementAttribute décrit un attribut et représenté par un couple clé / valeur † ConfigurationElementAttribute(String name, String value) † name : nom de l'attribut † value : valeur de l'attribut
  96. 96. 96Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addExtension † Le paramètre userToken doit également être récupéré à partir de la classe interne ExtensionRegistry via la méthode † Object getTemporaryUserToken() † Pour pallier à l'utilisation de cette classe interne, une solution proposée consiste à † Utiliser une valeur null au paramètre userToken de la méthode addExtension † La propriété eclipse.registry.nulltoken doit valoir true (indiqué lors du lancement de la configuration d'exécution)
  97. 97. 97Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addExtension † Exemple : création dynamique d'une extension de type views ExtensionRegistry reg = (ExtensionRegistry)Platform.getExtensionRegistry(); Bundle bundle = Activator.getDefault().getBundle(); IContributor contributor = ContributorFactoryOSGi.createContributor(bundle); ConfigurationElementAttribute[] conf = new ConfigurationElementAttribute[6]; conf[0] = new ConfigurationElementAttribute("id", "genericViewId" +sequenceId); conf[1] = new ConfigurationElementAttribute("name", "GenericView" + sequenceId); conf[2] = new ConfigurationElementAttribute("class", "eclipse.extension.dynamicextensionexamples.views.GenericView"); conf[3] = new ConfigurationElementAttribute("category", "eclipse.extension.DynamicExtensionExamples"); conf[4] = new ConfigurationElementAttribute("restorable", "true"); conf[5] = new ConfigurationElementAttribute("allowMultiple", "true"); ... Méthode createFromAddExtension CreateExtensionView.java du projet DynamicExtensionExamples Récupération de l'implémentation interne du registre d'extension Définition d'un élément de configuration pour une extension de type View RAPPEL : La liste des attributs à placer dans l'élément de configuration doit respecter le schéma du point d'extension org.eclipse.ui.views
  98. 98. 98Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addExtension † Exemple (suite) : création dynamique d'une extension ... String extensionPointId = "org.eclipse.ui.views"; ConfigurationElementDescription configurationElements = newConfigurationElementDescription("view", conf, null, null); Object token = reg.getTemporaryUserToken(); reg.addExtension("",contributor,false,"",extensionPointId,configurationElements, token); sequenceId++; Méthode createFromAddExtension CreateExtensionView.java du projet DynamicExtensionExamples Récupération de l'objet userToken Identifiant de l'extension vide (NE DOIT PAS ÊTRE NULL) Nom de l'extension vide (NE DOIT PAS ÊTRE NULL) Identifiant du point d'extension
  99. 99. 99Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addExtension † Exemple : création dynamique d'une extension de type views avec le paramètre userToken à null ... String extensionPointId = "org.eclipse.ui.views"; ConfigurationElementDescription configurationElements = newConfigurationElementDescription("view", conf, null, null); reg.addExtension("",contributor,false,"",extensionPointId,configurationElements, null); sequenceId++; Méthode createFromAddExtensionWithoutToken CreateExtensionView.java du projet DynamicExtensionExamples userToken est null
  100. 100. 100Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addContribution † La solution précédente fondée sur addExtension nécessite un couplage très fort avec des API Internes † La seconde solution consiste à utiliser la méthode addContribution définie dans l'interface IExtensionRegistry † boolean addContribution(InputStream is, IContributor cont, boolean persist, String name, ResourceBundle rb, Object userToken) † is : flux sur un contenu XML qui peut contenir des points d'extension et des extensions (syntaxe identique à plugin.xml) † cont : contributeur de l'extension † persist : si encore présent au démarrage † name : nom de la contribution † rb : ressource bundle utilisé pour la traduction † userToken : objet utilisé pour vérifier les permissions d'écriture
  101. 101. 101Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addContribution † Exemple : création dynamique d'une extension de type views à partir d'une chaîne de caractères IExtensionRegistry registry = RegistryFactory.getRegistry( ); Bundle bundle = Activator.getDefault().getBundle(); IContributor contributor = ContributorFactoryOSGi.createContributor(bundle); String extension = "<plugin><extension point="org.eclipse.ui.views">" + " <view category="eclipse.extension.DynamicExtensionExamples"" + " class="eclipse.extension.dynamicextensionexamples.views.GenericView"" + " icon="icons/sample.gif"" + " id="genericViewId" + sequenceId + """ + " name="GenericView" + sequenceId + "">" + " </view></extension></plugin>"; InputStream is = new ByteArrayInputStream(extension.getBytes()); registry.addContribution(is, contributor, false, null, null, null); sequenceId++; Méthode createFromAddContributionWithXMLString CreateExtensionView.java du projet DynamicExtensionExamples Le flux XML est préparé dans une chaîne de caractères userToken est null nécessite de modifier le paramètre nulltoken Aucune utilisation d'API Interne
  102. 102. 102Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addContribution † Exemple : création dynamique d'une extension de type views à partir d'un fichier XML IExtensionRegistry registry = RegistryFactory.getRegistry( ); Bundle bundle = Activator.getDefault().getBundle(); IContributor contributor = ContributorFactoryOSGi.createContributor(bundle); try { InputStream is = FileLocator.openStream(bundle,new Path("newextension.xml"),true); registry.addContribution(is, contributor, false, null, null, null); } catch (IOException e) { e.printStackTrace(); } Méthode createFromAddContributionWithXMLFile CreateExtensionView.java du projet DynamicExtensionExamples Le flux XML est contenu dans un fichier Aucune utilisation d'API Interne
  103. 103. 103Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron <plugin> <extension point="org.eclipse.ui.views"> <view category="eclipse.extension.DynamicExtensionExamples" class="eclipse.extension.dynamicextensionexamples.views.GenericView" icon="icons/sample.gif" id="genericViewId" name="GenericView"> </view> </extension> </plugin> Platform : extensions dynamiques - addContribution † Exemple (suite) : création dynamique d'une extension de type views à partir d'un fichier XML Fichier newextension.xml contenant la description d'une extension de type views newextension.xml du projet DynamicExtensionExamples
  104. 104. 104Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : extensions dynamiques - addContribution † Exemple : création dynamique d'un point d'extension de type binaryoperator à partir d'un fichier XML IExtensionRegistry registry = RegistryFactory.getRegistry(); Bundle bundle = Activator.getDefault().getBundle(); IContributor contributor = ContributorFactoryOSGi.createContributor(bundle); String extensionPoint = "<plugin><extension-point" + " id="eclipse.extension.dynamicextension.test"" + " name="DynamicExtensionPoint"" + " schema="schema/eclipse.extension.dynamicextension.test.exsd"/></plugin>"; InputStream is = new ByteArrayInputStream(extensionPoint.getBytes()); registry.addContribution(is, contributor, false, null, null, null); Aucune utilisation d'API InterneMéthode createFromAddContributionExtensionPoint CreateExtensionView.java du projet DynamicExtensionExamples
  105. 105. 105Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : avertir les changements du registre † Le registre d'extensions fournit des mécanismes d'écouteurs qui permettent de notifier lorsque de nouvelles extensions ou points d'extension sont ajoutés † L'interface IExtensionRegistry fournit les méthodes suivantes † void addListener(IRegistryEventListener listener) : ajoute un écouteur sur les changements du registre d'extension † void addListener(IRegistryEventListener listener, String extPointId) : filtre l'écoute sur les extensions contribuant à extPointId † L'interface IRegistryEventListener fournit des méthodes pour gérer les changements † void added(Iextension[] exts) : nouvelles extensions † void added(IExtensionPoint[] extPoints) : nouveaux points d'extension † …
  106. 106. 106Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Platform : avertir les changements du registre † Exemple : écouter les changements du registre d'extensions public Activator() { Platform.getExtensionRegistry().addListener(new IRegistryEventListener() { public void added(IExtension[] extensions) { System.out.println("extension added : "); for (IExtension currentExtension : extensions) { IConfigurationElement[] configurationElements = currentExtension.getConfigurationElements(); for (IConfigurationElement configurationElement : configurationElements) { System.out.println(" - " + configurationElement.getAttribute("id")); } } } public void added(IExtensionPoint[] extensionPoints) { System.out.println("extension point added : "); for (IExtensionPoint currentExtensionPoint : extensionPoints) { System.out.println(" - " + currentExtensionPoint.getUniqueIdentifier()); } } public void removed(IExtension[] exts) { } public void removed(IExtensionPoint[] extPoints) { } } Activator.java du projet DynamicExtensionExamples A chaque création de nouvelles extensions, le registre d'extensions notifie les écouteurs
  107. 107. 107Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Bilan † Nous avons étudié … † Une définition détaillée du mécanisme d'extensions † La création d'extensions (View et Preference) via l'outil PDE † Une description détaillée des points d'extension et de Schema XML † La création de nouveaux points d'extensions † L'interrogation des extensions et points d'extension via le registre d'extensions † La création dynamique d'extensions et de points d'extension † Prochaine étape : Conception avancée de plug-ins † Compréhension du Workbench Eclipse (View, Editor, Action, Perspective, Activity, UI Forms, …) † Description générale des principaux points d'extension
  108. 108. 108Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Glossaire Eclipse † Bundle ou plug-in : un bundle est un composant qui possède un cycle de vie et qui expose et importe des services. Sous Eclipse le composant est appelé plug-in † Extension : l’extension est la réponse apportée à un point d’extension Il doit respecter un schéma imposé par le point d’extension † IHM : acronyme qui a une signification différente selon s’il est singulier ou pas : au singulier, il signifie le domaine de l’Interaction Homme- Machine, au pluriel, il signifie les Interfaces Homme-Machine † LazyLoading : qui désigne la politique de chargement d’un plug-in. Le plug-in est chargé dans le conteneur OSGi quand il doit être utilisé † MANIFEST.MF : fichier de configuration qui décrit le fonctionnement d’une archive Jar. La spécification OSGi enrichie sa description en ajoutant des descriptions générales (nom, auteur, version) et des descriptions de dépendances avec les autres plug-ins
  109. 109. 109Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Glossaire Eclipse † PDE : Plug-in Development Environment est un ensemble d’outils fournit par l’environnement Eclipse pour faciliter le développement des plug-ins † perspective : regroupement cohérent de vues (views) et d’actions spécifiques à une tâche de l’utilisateur (coder du Java, débuguer, …) † plugin.xml : un fichier de configuration au format XML qui décrit les extensions et les points d’extension utilisés et fournis par un plug-in † point d’extension : un point d’extension décrit un contrat qui stipule la manière dont des interfaces et des classes d’un plug-in doivent être utilisées par d’autres plug-ins. Le contrat est décrit au travers un schéma XML † product : configuration utilisée pour la génération d’une version exécutable de l’application Eclipse (les plug-ins dépendants, les arguments pour l’exécution de l’application, les icônes, le splashscreen)
  110. 110. 110Extensions - M. Baron - Page keulkeul.blogspot.com@mickaelbaron Glossaire Eclipse † RCP : Rich Client Platform est une application autonome basée sur le noyau Eclipse. Tous les aspects liés à l’environnement de développement ont été supprimés † view : un élément graphique qui permet d’afficher une IHM. Une View est disponible par l’intermédiaire d’une perspective † workspace : correspond à un espace de travail dans lequel l’applica- tion Eclipse peut déposer les fichiers qui ont été manipulés Glossaire complété dans la suite des partie de ce chapitre

×