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

Extensions et Points d'Extensions

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Extensions et Points d'Extensions

Développement de clients riches : Plateforme Eclipse

Mickaël BARON - 2008 (Rev. Janvier 2009) mailto:[email protected] ou mailto:[email protected]

Chapitre 3 : Conception de plugChapitre 3 : Conception de plug--insins

Extensions et Points d’Extensions

Page 2: Extensions et Points d'Extensions

2Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Creative Commons

Contrat Paternité

Partage des Conditions Initiales à l'Identique

2.0 France

http://creativecommons.org/licenses/by-sa/2.0/fr

Licence

Page 3: Extensions et Points d'Extensions

3Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 4: Extensions et Points d'Extensions

4Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 5: Extensions et Points d'Extensions

5Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 6: Extensions et Points d'Extensions

6Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 7: Extensions et Points d'Extensions

7Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 8: Extensions et Points d'Extensions

8Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 9: Extensions et Points d'Extensions

9Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 10: Extensions et Points d'Extensions

10Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 BPoint 1

Point 2

Point 3

point1.exsd point2.exsd point3.exsdplugin.xml

Un point d’extension peut être branché àplusieurs extensions

Le fichier plugin.xmlspé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

Page 11: Extensions et Points d'Extensions

11Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 serontdisponibles 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

Page 12: Extensions et Points d'Extensions

12Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 13: Extensions et Points d'Extensions

13Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel 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 DevelopmentEnvironment)

� 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

Page 14: Extensions et Points d'Extensions

14Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 15: Extensions et Points d'Extensions

15Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 16: Extensions et Points d'Extensions

16Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 17: Extensions et Points d'Extensions

17Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 18: Extensions et Points d'Extensions

18Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 19: Extensions et Points d'Extensions

19Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 20: Extensions et Points d'Extensions

20Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.uiest ajoutécomme

dépendance puisqu’il définit un point

d’extension qui est utilisé

Onglet Dependencies

Page 21: Extensions et Points d'Extensions

21Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel extension View : définition et création

L’extension relative au point d’extension org.eclipse.ui.viewsa été créée

Possibilité d’avoir un aperçu détaillé du contrat du point d’extension

sélectionné

Onglet Extensions

Page 22: Extensions et Points d'Extensions

22Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 23: Extensions et Points d'Extensions

23Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel extension View : définition et création

L’élément viewest créé

Différents attributs sont àrenseigner

Onglet Extensions

Page 24: Extensions et Points d'Extensions

24Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 25: Extensions et Points d'Extensions

25Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 26: Extensions et Points d'Extensions

26Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 27: Extensions et Points d'Extensions

27Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel extension View : définition et création

package eclipse.extension.viewexample;

public class SampleView extends ViewPart {

public SampleView() {// TODO Auto-generated constructor stub

}

@Overridepublic void createPartControl(Composite parent) {

Label myLabel = new Label(parent, SWT.NONE);myLabel.setText("Hello World in a new View");

}

@Overridepublic 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)

Page 28: Extensions et Points d'Extensions

28Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 29: Extensions et Points d'Extensions

29Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 30: Extensions et Points d'Extensions

30Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 31: Extensions et Points d'Extensions

31Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 32: Extensions et Points d'Extensions

32Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 33: Extensions et Points d'Extensions

33Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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é

Page 34: Extensions et Points d'Extensions

34Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel extension Preference : définition et création

L’élément page est créé

Différents attributs sont àrenseigner

Onglet Extensions

Page 35: Extensions et Points d'Extensions

35Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 36: Extensions et Points d'Extensions

36Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 Twoqu’il s’agit d’une sous page

Page 37: Extensions et Points d'Extensions

37Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 38: Extensions et Points d'Extensions

38Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel extension Preference : définition et création

public class PreferenceFieldEditorPageTwo extends FieldEditorPreferencePage implementsIWorkbenchPreferencePage {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_PROPER TIES, "Police",

getFieldEditorParent());addField(ffe);final String[][] strings = new String[][] {{ "Premi ère Valeur", "tag1"}, ...};RadioGroupFieldEditor rfe = new RadioGroupFieldEditor (RADIO_PROPERTIES,

"RadioGroup", 2, strings, getFieldEditorParent(), t rue);addField(rfe);PathEditor pe = new PathEditor(PATH_PROPERTIES, "Path :", "Choisir des chemins",

getFieldEditorParent());addField(pe);ScaleFieldEditor sfe = new ScaleFieldEditor(SCALE_PRO PERTIES, "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

Page 39: Extensions et Points d'Extensions

39Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 40: Extensions et Points d'Extensions

40Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 41: Extensions et Points d'Extensions

41Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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'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

Page 42: Extensions et Points d'Extensions

42Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 43: Extensions et Points d'Extensions

43Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 44: Extensions et Points d'Extensions

44Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 45: Extensions et Points d'Extensions

45Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 SchemaXML du plug-in org.eclipse.uisont 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

Page 46: Extensions et Points d'Extensions

46Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 47: Extensions et Points d'Extensions

47Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 schemaXML 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

Page 48: Extensions et Points d'Extensions

48Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 49: Extensions et Points d'Extensions

49Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 50: Extensions et Points d'Extensions

50Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Point d’extension : Description du schéma XML

<element name="extension "><complexType>

<sequence><element ref="page" minOccurs="0" maxOccurs="unbound ed"/>

</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.exsddu 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

Page 51: Extensions et Points d'Extensions

51Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 52: Extensions et Points d'Extensions

52Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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="unbound ed"/></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

Page 53: Extensions et Points d'Extensions

53Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 54: Extensions et Points d'Extensions

54Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 plusIdbasée sur le point BinaryOperator

Un fichier schéma XML définit la grammaire du point

d'extension BinaryOperator

Le fichier plugin.xmlspé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 Plusimplémentant l'opérateur minus

Page 55: Extensions et Points d'Extensions

55Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Point d’extension : Exemple

� Description détaillée du point d'extension

L'élément binaryOperatordé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 binaryOperatordoit au moins être présent

une fois

L'élément extension est le l'élément racine et doit

être présentVeuillez assurer que

l'élément extension est défini et qu'il contient les attributs point, id et

name

Page 56: Extensions et Points d'Extensions

56Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 57: Extensions et Points d'Extensions

57Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 58: Extensions et Points d'Extensions

58Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 59: Extensions et Points d'Extensions

59Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 Pointsplugin.xml du projet

Calculator

Le point d'extension

binaryOperator est disponible dans la liste des points d'extension du plug-in

Calculatorconformément au contenu du fichier plugin.xml

Page 60: Extensions et Points d'Extensions

60Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 61: Extensions et Points d'Extensions

61Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 62: Extensions et Points d'Extensions

62Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 63: Extensions et Points d'Extensions

63Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 64: Extensions et Points d'Extensions

64Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 65: Extensions et Points d'Extensions

65Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 66: Extensions et Points d'Extensions

66Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 67: Extensions et Points d'Extensions

67Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPoint 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

Page 68: Extensions et Points d'Extensions

68Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 69: Extensions et Points d'Extensions

69Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 70: Extensions et Points d'Extensions

70Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Point d’extension : Extensions liées à BinaryOperator

� Extension plusId (définition des attributs)

plugin.xml du projet Plus

Onglet ExtensionL'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

Page 71: Extensions et Points d'Extensions

71Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 72: Extensions et Points d'Extensions

72Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 73: Extensions et Points d'Extensions

73Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Point d’extension : Traitement des extensions

� Interface utilisateur de l'exemple Calculatrice

Choix de l'opérateur

Membre de gauche

Membre de droiteDemande du calcul :

23 - 3

Affichage du résultat du calcul 23 - 3 = 20 CalculatorView.java du

projet Calculator

Page 74: Extensions et Points d'Extensions

74Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 75: Extensions et Points d'Extensions

75Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 76: Extensions et Points d'Extensions

76Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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()

Page 77: Extensions et Points d'Extensions

77Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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é

Page 78: Extensions et Points d'Extensions

78Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 79: Extensions et Points d'Extensions

79Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.getEx tensionRegistry();IExtension extension = extensionRegistry.getExtensio n(

"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

Page 80: Extensions et Points d'Extensions

80Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.getEx tensionRegistry();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

Page 81: Extensions et Points d'Extensions

81Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPlatform : 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

Page 82: Extensions et Points d'Extensions

82Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPlatform : 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.getEx tensionRegistry();IExtensionPoint extPoint = extensionRegistry.getExten sionPoint("

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

Page 83: Extensions et Points d'Extensions

83Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.comPlatform : 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.getEx tensionRegistry();IExtensionPoint[] extPoint = extensionRegistry.getEx tensionPoints();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

Page 84: Extensions et Points d'Extensions

84Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 85: Extensions et Points d'Extensions

85Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 86: Extensions et Points d'Extensions

86Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 87: Extensions et Points d'Extensions

87Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 88: Extensions et Points d'Extensions

88Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 89: Extensions et Points d'Extensions

89Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 90: Extensions et Points d'Extensions

90Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 91: Extensions et Points d'Extensions

91Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 92: Extensions et Points d'Extensions

92Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 classconstruction d'un

objet binaryOperator

Appel de la méthode compute

Page 93: Extensions et Points d'Extensions

93Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 94: Extensions et Points d'Extensions

94Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 95: Extensions et Points d'Extensions

95Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 96: Extensions et Points d'Extensions

96Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 97: Extensions et Points d'Extensions

97Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 createFromAddExtensionCreateExtensionView.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

Page 98: Extensions et Points d'Extensions

98Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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,"",extensionP ointId,configurationElements, token);

sequenceId++;

Méthode createFromAddExtensionCreateExtensionView.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

Page 99: Extensions et Points d'Extensions

99Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : extensions dynamiques - addExtension

� Exemple : création dynamique d'une extension de type viewsavec 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 createFromAddExtensionWithoutTokenCreateExtensionView.java du projet DynamicExtensionExamples

userToken est null

Page 100: Extensions et Points d'Extensions

100Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 101: Extensions et Points d'Extensions

101Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.DynamicExtensio nExamples\"" + " class=\"eclipse.extension.dynamicextensionexample s.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, nu ll, null, null);sequenceId++;

Méthode createFromAddContributionWithXMLStringCreateExtensionView.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

Page 102: Extensions et Points d'Extensions

102Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 createFromAddContributionWithXMLFileCreateExtensionView.java du projet DynamicExtensionExamples

Le flux XML est contenu dans un fichier

Aucune utilisation d'API Interne

Page 103: Extensions et Points d'Extensions

103Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

<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

Page 104: Extensions et Points d'Extensions

104Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.dynamicextensio n.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

Page 105: Extensions et Points d'Extensions

105Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� …

Page 106: Extensions et Points d'Extensions

106Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 107: Extensions et Points d'Extensions

107Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 108: Extensions et Points d'Extensions

108Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 109: Extensions et Points d'Extensions

109Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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)

Page 110: Extensions et Points d'Extensions

110Extensions - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 Viewest 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