Upload
mickael-baron
View
1.973
Download
0
Tags:
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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é
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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()
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é
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
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
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
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
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
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
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)
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)
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
� …
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
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
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
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)
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