Slide 1

Slide 1 text

Développement de clients riches : Plateforme Eclipse Mickaël BARON - 2008 (Rev. Janvier 2009) mailto:[email protected] ou mailto:[email protected] mickael-baron.fr mickaelbaron Chapitre 3 : Conception de plug-ins Extensions et Points d’Extensions

Slide 2

Slide 2 text

2 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Creative Commons Contrat Paternité Partage des Conditions Initiales à l'Identique 2.0 France http://creativecommons.org/licenses/by-sa/2.0/fr Licence

Slide 3

Slide 3 text

3 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron 3 À propos de l’auteur … † Mickaël BARON † Ingénieur de Recherche au LIAS † https://www.lias-lab.fr † Equipe : Ingénierie des Données et des Modèles † Responsable des plateformes logicielles, « coach » technique † Ancien responsable Java de Developpez.com (2011-2021) † Communauté Francophone dédiée au développement informatique † https://java.developpez.com † 4 millions de visiteurs uniques et 12 millions de pages vues par mois † 750 00 membres, 2000 forums et jusqu'à 5000 messages par jour mickael-baron.fr mickaelbaron

Slide 4

Slide 4 text

4 Extensions - M. Baron - Page mickael-baron.fr 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 mickael-baron.fr/eclipse/intro-extensions

Slide 5

Slide 5 text

5 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 6

Slide 6 text

6 Extensions - M. Baron - Page mickael-baron.fr 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 mickael-baron.fr/eclipse/intro-extensions † 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

Slide 7

Slide 7 text

7 Extensions - M. Baron - Page mickael-baron.fr 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 : mickael-baron.fr/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

Slide 8

Slide 8 text

8 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 9

Slide 9 text

9 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 10

Slide 10 text

10 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 11

Slide 11 text

11 Extensions - M. Baron - Page mickael-baron.fr 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 Ext 1 Ext 2 Le Plug-in B définit trois points d’extension dont deux sont connectés à des extensions Plug-in B Point 1 Point 2 Point 3 point1.exsd point2.exsd point3.exsd plugin.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

Slide 12

Slide 12 text

12 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 13

Slide 13 text

13 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 14

Slide 14 text

14 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 15

Slide 15 text

15 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 16

Slide 16 text

16 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 17

Slide 17 text

17 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 18

Slide 18 text

18 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 19

Slide 19 text

19 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 20

Slide 20 text

20 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 21

Slide 21 text

21 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 22

Slide 22 text

22 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 23

Slide 23 text

23 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 24

Slide 24 text

24 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Tutoriel extension View : définition et création L’élément view est créé Différents attributs sont à renseigner Onglet Extensions

Slide 25

Slide 25 text

25 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 26

Slide 26 text

26 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 27

Slide 27 text

27 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 28

Slide 28 text

28 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 29

Slide 29 text

29 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 30

Slide 30 text

30 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 31

Slide 31 text

31 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 32

Slide 32 text

32 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 33

Slide 33 text

33 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 34

Slide 34 text

34 Extensions - M. Baron - Page mickael-baron.fr 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é

Slide 35

Slide 35 text

35 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Tutoriel extension Preference : définition et création L’élément page est créé Différents attributs sont à renseigner Onglet Extensions

Slide 36

Slide 36 text

36 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 37

Slide 37 text

37 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 38

Slide 38 text

38 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 39

Slide 39 text

39 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 40

Slide 40 text

40 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 41

Slide 41 text

41 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 42

Slide 42 text

42 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Extension : définition et création † Toutes les informations de création d’une extension sont stockées dans le fichier plugin.xml Les fragments seront étudiés dans la partie internationalisation Une extension est obligatoirement associée à un point d'extension plugin.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

Slide 43

Slide 43 text

43 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 44

Slide 44 text

44 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 45

Slide 45 text

45 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 46

Slide 46 text

46 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 47

Slide 47 text

47 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 48

Slide 48 text

48 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 49

Slide 49 text

49 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 50

Slide 50 text

50 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 51

Slide 51 text

51 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Point d’extension : Description du schéma XML ... † 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

Slide 52

Slide 52 text

52 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Point d’extension : Description du schéma XML † 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

Slide 53

Slide 53 text

53 Extensions - M. Baron - Page mickael-baron.fr 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 Sous éléments structurant le point d'extension

Slide 54

Slide 54 text

54 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 55

Slide 55 text

55 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 56

Slide 56 text

56 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 57

Slide 57 text

57 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 58

Slide 58 text

58 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 59

Slide 59 text

59 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 60

Slide 60 text

60 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 61

Slide 61 text

61 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 62

Slide 62 text

62 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 63

Slide 63 text

63 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 64

Slide 64 text

64 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 65

Slide 65 text

65 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 66

Slide 66 text

66 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 67

Slide 67 text

67 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 68

Slide 68 text

68 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Point d’extension : Indicateur d'ordre † Ajouter une séquence sur l'élément extension binaryoperator.exsd du projet Calculator Onglet Definition Deux types d'indicateur d'ordre autorisés : choice et sequence Possibilité de définir le nombre d'occurrence

Slide 69

Slide 69 text

69 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Point d’extension : Extensions liées à BinaryOperator † Extension minusId (définition des attributs) plugin.xml du projet Minus Onglet Extension L'attribut class impose la création d'une class Minus qui implémente IBinaryOperator

Slide 70

Slide 70 text

70 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 71

Slide 71 text

71 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 72

Slide 72 text

72 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 73

Slide 73 text

73 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 74

Slide 74 text

74 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 75

Slide 75 text

75 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 76

Slide 76 text

76 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 77

Slide 77 text

77 Extensions - M. Baron - Page mickael-baron.fr 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()

Slide 78

Slide 78 text

78 Extensions - M. Baron - Page mickael-baron.fr 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é

Slide 79

Slide 79 text

79 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 80

Slide 80 text

80 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 81

Slide 81 text

81 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 82

Slide 82 text

82 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 83

Slide 83 text

83 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 84

Slide 84 text

84 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 85

Slide 85 text

85 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 86

Slide 86 text

86 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 87

Slide 87 text

87 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 88

Slide 88 text

88 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 89

Slide 89 text

89 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 90

Slide 90 text

90 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 91

Slide 91 text

91 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 92

Slide 92 text

92 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 93

Slide 93 text

93 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 94

Slide 94 text

94 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron Platform : 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

Slide 95

Slide 95 text

95 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 96

Slide 96 text

96 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 97

Slide 97 text

97 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 98

Slide 98 text

98 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 99

Slide 99 text

99 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 100

Slide 100 text

100 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 101

Slide 101 text

101 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 102

Slide 102 text

102 Extensions - M. Baron - Page mickael-baron.fr 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 = "" + " " + " "; 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

Slide 103

Slide 103 text

103 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 104

Slide 104 text

104 Extensions - M. Baron - Page mickael-baron.fr mickaelbaron 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

Slide 105

Slide 105 text

105 Extensions - M. Baron - Page mickael-baron.fr 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 = ""; InputStream is = new ByteArrayInputStream(extensionPoint.getBytes()); registry.addContribution(is, contributor, false, null, null, null); Aucune utilisation d'API Interne Méthode createFromAddContributionExtensionPoint CreateExtensionView.java du projet DynamicExtensionExamples

Slide 106

Slide 106 text

106 Extensions - M. Baron - Page mickael-baron.fr 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 † …

Slide 107

Slide 107 text

107 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 108

Slide 108 text

108 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 109

Slide 109 text

109 Extensions - M. Baron - Page mickael-baron.fr 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

Slide 110

Slide 110 text

110 Extensions - M. Baron - Page mickael-baron.fr 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)

Slide 111

Slide 111 text

111 Extensions - M. Baron - Page mickael-baron.fr 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