$30 off During Our Annual Pro Sale. View Details »

Eclipse : extensions et points d'extensions

Eclipse : extensions et points d'extensions

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.

Mickael BARON

December 27, 2012
Tweet

More Decks by Mickael BARON

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 4
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Organisation du cours sur les extensions et les points
    d’extension
    † Extensions et points d’extension : généralités
    † Extension : définition
    † Point d’extension : définition et Schema XML
    † Platform : gestion du registre des extensions
    Tous les exemples du cours
    sont disponibles directement à l’adresse
    mickael-baron.fr/eclipse/intro-extensions

    View Slide

  5. 5
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et Points d’extension : généralités
    † Ce support de cours s’intéresse uniquement aux fondements
    des extensions et des points d’extensions
    † Le détail des principaux points d’extension de la plateforme
    Eclipse sera examiné dans le prochaine partie de ce chapitre
    où nous étudierons les points d’extension relatifs à
    † Vue, Editor, Perspective
    † Action
    † Activities, Themes, …
    † Un glossaire de tous les nouveaux acronymes et concepts
    est proposé à la fin de ce support de cours

    View Slide

  6. 6
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et Points d’extension : déroulement du cours
    † Pédagogie du cours
    † Présentation des concepts
    † Illustration avec de nombreux exemples qui sont disponibles à
    l’adresse mickael-baron.fr/eclipse/intro-extensions
    † Des bulles d’aide tout au long du cours
    † Logiciels utilisés
    † Eclipse 3.4 Ganymede
    † Pré-requis
    † Connaissance de Java, XML et XML Schema
    † Principes de base concernant la boite à outils SWT
    † Principes de base liés à la conception de plug-ins
    † Remerciements
    † Developpez.com : Jawher Moussa
    † …
    Ceci est une alerte
    Ceci est une astuce

    View Slide

  7. 7
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et Points d’extension : ressources …
    † Des articles sur la notion d’extension et point d’extensions
    † www.eclipsetotale.com/articles/Developpement_de_plugins_Eclipse_partie2.html
    † www-128.ibm.com/developerworks/opensource/library/os-ecl-dynext
    † www.ibm.com/developerworks/xml/library/x-wxxm29.html
    † www.vogella.de/articles/EclipseExtensionPoint/article.html
    † Des supports de cours concernant XML Schema
    † Site W3C : www.w3.org/XML/Schema
    † W3Schools : www.w3schools.com/schema
    † Schema XML : mickael-baron.fr/divers/schemaxml
    † Des livres
    † Eclipse – Building Commercial-Quality Plug-ins, 2004 - ISBN : 0-321-22847-2
    † Eclipse – Rich Client Platform, 2005 – ISBN : 0-321-33461-2

    View Slide

  8. 8
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et points d’extension : généralités
    † Le framework de la plateforme Eclipse fournit un socle à
    base de plug-ins extensibles
    † Plug-in pour créer des vues (View)
    † Plug-in pour créer des pages de préférences (PreferencePages)
    † Plug-in pour créer un éditeur (Editor)
    † Plug-in pour créer une perspective (Perspective), …
    † Les plug-ins extensibles du socle permettent à de nouveaux
    plug-ins de les étendre et devenir à leur tour extensible
    † Une application Eclipse est donc basée sur un ensemble de
    plug-ins du framework de la plateforme et de plug-ins
    développés pour les besoins spécifiques

    View Slide

  9. 9
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et points d’extension : généralités
    † Un point d’extension est un mécanisme propre à Eclipse
    permettant la connexion entre plug-ins
    † Un point d’extension décrit un contrat entre le plug-in
    émetteur du contrat et ses plug-ins clients
    † Ce contrat est défini au travers d’un XML Schema (fichier au
    format .exsd)
    † La grammaire définie par le schéma XML doit être respectée
    par les plug-ins souhaitant se brancher au plug-in qui définit
    le point d'extension
    † Généralement le point d'extension stipule la manière dont
    des interfaces et/ou des classes doivent être utilisées par
    d’autres plug-ins
    † Le fichier plugin.xml permet de déclarer les noms des fichiers
    schémas XML utilisés par un plug-in

    View Slide

  10. 10
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et points d’extension : généralités
    † L’extension est la réponse apportée à un point d’extensions
    † Les plug-ins qui souhaitent se brancher à un point
    d’extensions déclare ainsi une extension
    † Pour tout point d’extension exploité par un plug-in une
    extension est obligatoirement réalisée
    † Un même point d’extension peut être connecté à plusieurs
    extensions
    † Un plug-in peut définir des extensions connectées à des
    points d’extension que ce même plug-in a définis
    † L’extension devra par conséquent respecter le schéma XML
    imposé par le point d’extensions
    † Le fichier plugin.xml permet la description des extensions
    d’un plug-in client

    View Slide

  11. 11
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et points d’extension : généralités
    Plug-in A
    Trois fichiers schéma XML définissent
    respectivement la grammaire des
    trois points d’extensions
    Ext 1
    Ext 2
    Le Plug-in B définit trois points
    d’extension dont deux sont
    connectés à des extensions
    Plug-in B
    Point 1
    Point 2
    Point 3
    point1.exsd point2.exsd point3.exsd
    plugin.xml
    Un point d’extension
    peut être branché à
    plusieurs extensions
    Le fichier plugin.xml
    spécifie trois points
    d’extension et leur
    fichier respectif
    Le Plug-in A définit deux
    extensions branchées à
    deux points d’extension
    du plug-in B
    Ce point d’extension est
    défini mais pas branché à
    une extension
    Une extension ne peut
    exister sans point
    d’extension associé
    plugin.xml
    Le fichier plugin.xml
    contient la définition
    des extensions créées
    par le plug-in A

    View Slide

  12. 12
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et points d’extension : généralités
    † Dans le précédent cours lié à la conception de plug-ins nous
    avons vu que des plug-ins pouvaient collaborer sans passer
    par les points d’extensions
    † Un plug-in peut simplement importer des classes d’un autre
    plug-in en utilisant la balise require-bundle définie dans le
    fichier de configuration MANIFEST.MF
    † En utilisant l’importation, les services offerts sont ceux qui
    ont été développés. Dés lors, les services ne seront
    disponibles qu’à la suite d’une compilation
    † En utilisant les points d’extensions, les services sont spécifiés
    via les schémas XML et sont disponibles avant même qu’ils
    soient développés

    View Slide

  13. 13
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extensions et points d’extension : généralités
    † La plateforme Eclipse fournit un registre d’extensions qui
    permet d’interroger les extensions disponibles à l’exécution
    † Le registre d’extensions est accessible via une API
    † Au travers de cette API, il est possible de déclencher des
    services exposés par les points d’extensions
    † La classe Platform (vue précédemment pour les Logs, …)
    fournit des méthodes pour accéder au registre d’extensions
    † Dans la suite, nous présentons les méthodes de Platform
    pour accéder aux extensions et nous donnons des exemples
    représentatifs de leur utilisation

    View Slide

  14. 14
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension : définition et création
    † Dans cette partie, nous étudions la création d’extension à
    partir de points d’extension définis par le framework Eclipse
    † La création d’une vue, qui est sans doute le point d’extension le plus
    utilisé lors de la création d’une application Eclipse
    † La création de page de préférence (exemple déjà illustré dans le
    partie JFace (Composants additionnels avec JFace)
    † L’objectif de cette partie est d’insister sur
    † La création des extensions à partir de l’outil PDE (Plugin Development
    Environment)
    † Le respect des grammaires des points d’extension définies dans des
    XML Schema
    † L’implémentation de certaines classes (si présentes) exigée par la
    grammaire du point d’extensions

    View Slide

  15. 15
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    † Sélectionner à partir du menu Eclipse l’action File -> New ->
    Project pour l’assistant de création de plug-in (Plug-in
    Project)
    Décocher cette option de
    façon à ce que ce plug-in
    ne crée pas
    automatiquement une vue
    Projet ViewExample

    View Slide

  16. 16
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    La liste des
    extensions est
    actuellement
    vide, nous
    allons dans la
    suite ajouter
    une extension
    † Sélectionner l’onglet Extensions à partir de l’outil PDE lors de
    l’édition du fichier plugin.xml
    ACTION : Utiliser le
    bouton « add » pour
    ajouter de nouvelles
    extensions
    L’onglet Extensions est
    utilisé pour gérer toutes les
    extensions d’un plug-in

    View Slide

  17. 17
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Cet assistant permet de
    choisir les points
    d’extension de manière à
    créer une nouvelle
    extension
    Liste tous les points
    d’extension dont les
    plug-ins associés
    sont visibles depuis
    le plug-in en cours
    de développement
    (classpath et projet
    Eclipse en cours)

    View Slide

  18. 18
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    L’onglet Extension
    Wizards permet de choisir
    des squelettes prêts à
    l’emploi de création
    d’extension
    Liste l’ensemble des
    assistants de création
    d’extension
    Si un squelette de
    création est
    sélectionné, une
    description est donnée

    View Slide

  19. 19
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Ce champ de texte permet
    d’effectuer une sélection
    en appliquant un filtre
    Exemple : *.ui donne tous
    les points d’extension qui
    contiennent le package ui
    En décochant cette
    option les points
    d’extension dont les
    plug-ins ne sont pas
    précisés dans les
    dépendances seront
    également visibles
    † Sélectionner le point d’extension org.eclipse.ui.views
    Une description est
    donnée lorsqu’un
    point d’extension est
    sélectionné
    S’il existe des
    squelettes prêts à
    l’emploi de création
    d’extension, ils sont
    affichés dans cette liste

    View Slide

  20. 20
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Ce lien permet d’ouvrir la
    description du point
    d’extension sélectionné
    Description du
    contrat (défini
    dans un
    XML Schema)
    relatif au point
    d’extension Views

    View Slide

  21. 21
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Le plug-in qui définit le point
    d’extension est ajouté dans la
    liste des dépendances s’il n’est
    pas présent initialement
    Le plug-in
    org.eclipse.ui
    est ajouté
    comme
    dépendance
    puisqu’il définit
    un point
    d’extension qui
    est utilisé
    Onglet
    Dependencies

    View Slide

  22. 22
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    L’extension relative
    au point d’extension
    org.eclipse.ui.views
    a été créée
    Possibilité d’avoir un
    aperçu détaillé du contrat
    du point d’extension
    sélectionné
    Onglet
    Extensions

    View Slide

  23. 23
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Pour ajouter des éléments
    à l’extension en cours,
    afficher le menu popup
    (bouton droit de la souris)
    † Ajouter un élément view à l’extension
    L’outil PDE fournit une aide
    pour respecter le contrat
    imposé par le point
    d’extensions
    Le contrat définit que trois
    éléments facultatifs sont
    autorisés
    Dans la suite, nous
    présenterons
    rapidement le format
    XML Schema

    View Slide

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

    View Slide

  25. 25
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Les attributs de l’élément
    view sont également
    décrits dans le contrat du
    point d’extension Views
    Les attributs suivis du
    caractère * doit être
    obligatoirement renseignés
    Une description détaillée
    de tous les champs permet
    de les exploiter facilement
    Les commentaires
    sont très importants.
    Ils permettent de
    comprendre l’utilité
    des éléments et des
    attributs

    View Slide

  26. 26
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Id unique qui représente
    l’identifiant de la vue
    Nom donné à la vue qui
    sera affiché à l’utilisateur
    Une classe qui doit
    implémenter IViewPart ou
    hériter ViewPart
    Id des catégories utilisées
    pour référencer les vues
    Nom de l’image associée à
    la vue
    Une description détaillée du
    point d’extension views sera
    étudiée dans la prochaine
    partie de ce chapitre
    En cliquant sur le lien class, l’assistant
    de création de classe est utilisé si la
    classe n’existe pas

    View Slide

  27. 27
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    L’assistant configure
    automatiquement les
    champs
    La classe doit hériter
    obligatoirement de
    ViewPart
    Préciser le nom de la
    classe

    View Slide

  28. 28
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    package eclipse.extension.viewexample;
    public class SampleView extends ViewPart {
    public SampleView() {
    // TODO Auto-generated constructor stub
    }
    @Override
    public void createPartControl(Composite parent) {
    Label myLabel = new Label(parent, SWT.NONE);
    myLabel.setText("Hello World in a new View");
    }
    @Override
    public void setFocus() {
    // TODO Auto-generated method stub
    }
    }
    SampleView.java du
    Projet viewExample
    ViewPart est une
    classe abstraite
    A utiliser pour
    construire
    l’interface
    utilisateur de la
    vue (utiliser les
    compétences vues
    dans le précédent
    chapitre)
    Préciser le
    composant qui
    prendra le focus
    lors de l’affichage
    de la vue
    † Implémenter le code spécifique à la vue (utilisation des
    boîtes à outils SWT et JFace)

    View Slide

  29. 29
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    Onglet
    plugin.xml
    Toutes les informations liées
    aux extensions sont stockées
    dans le fichier plugin.xml
    plugin.xml du projet
    viewExample
    Une extension est
    associée
    obligatoirement à un
    point d’extensions

    View Slide

  30. 30
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension View : définition et création
    La vue est disponible
    dans la liste
    Une nouvelle vue est venue
    étendre les fonctionnalités
    d’une application Eclipse

    View Slide

  31. 31
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    † Dans le précédent chapitre, nous avions étudié la mise en
    place d’un gestionnaire de préférences en utilisant l’API
    Preference
    † Nous devions définir de manière programmatique
    † Le conteneur de pages de préférences
    † Les pages et leur agencement interne via des objets FieldEditor
    † Agencement entre les pages (PreferenceNode)
    † Dans une application Eclipse, il n’existe qu’un seul conteneur
    de pages de préférences
    † L’intérêt d’utiliser les points d’extension est de pouvoir
    étendre ce conteneur de pages de préférences d’une
    application Eclipse
    † La construction de chaque page restera à la charge du
    développeur. Cette étape reste identique à celle présentée
    dans le chapitre précédent

    View Slide

  32. 32
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    † Sélectionner à partir du menu Eclipse l’action File -> New ->
    Project pour l’assistant de création de plug-in (Plug-in
    Project)
    Décocher cette option de
    façon à ce que ce plug-in
    ne crée pas
    automatiquement un vue
    Projet
    PreferenceExamples

    View Slide

  33. 33
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    † Choisir le point d’extension org.eclipse.ui.preferencePages
    Le point d’extension
    preferencePages
    propose un squelette
    prêt à l’emploi
    Une description du
    point d’extension
    preferencePages est
    donnée

    View Slide

  34. 34
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    † Ajouter un élément page à l’extension preferencePage
    Pour ajouter des éléments à l’extension
    preferencePage, afficher le menu popup
    (bouton droit de la souris)
    L’outil PDE fournit une aide
    pour respecter le contrat
    imposé par le point
    d'extension preferencePage
    Le contrat définit qu’un
    élément facultatif est
    autorisé

    View Slide

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

    View Slide

  36. 36
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    Id unique qui représente
    l’identifiant de la page
    Nom donné à la page qui
    sera affiché à l’utilisateur
    Une classe qui doit implémenter
    IWorkbenchPreferencePage
    Id de la page « parent » utilisé pour
    agence les pages entre elles
    Une description
    détaillée du point
    d'extension
    preferencePage sera
    étudiée dans la
    prochaine partie de
    ce chapitre

    View Slide

  37. 37
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    † Définir que Page Two est fille de Page One
    L’identifiant de Page One
    L’identifiant de Page One est
    utilisé pour indiquer à Page Two
    qu’il s’agit d’une sous page

    View Slide

  38. 38
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    La classe doit hériter
    un sous type de
    PreferencePage
    Préciser le
    nom de la
    classe
    La classe doit implémenter
    l’interface
    IWorkbenchPreferencePage

    View Slide

  39. 39
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    public class PreferenceFieldEditorPageTwo extends FieldEditorPreferencePage implements
    IWorkbenchPreferencePage {
    private static final String FONT_PROPERTIES = "pageTwo.font";
    private static final String RADIO_PROPERTIES = "pageTwo.radio";
    private static final String PATH_PROPERTIES = "pageTwo.path";
    private static final String SCALE_PROPERTIES = "pageTwo.scale";
    public PreferenceFieldEditorPageTwo() { super("Page Deux", GRID); }
    protected void createFieldEditors() {
    FontFieldEditor ffe = new FontFieldEditor(FONT_PROPERTIES, "Police",
    getFieldEditorParent());
    addField(ffe);
    final String[][] strings = new String[][] {{ "Première Valeur", "tag1"}, ...};
    RadioGroupFieldEditor rfe = new RadioGroupFieldEditor(RADIO_PROPERTIES,
    "RadioGroup", 2, strings, getFieldEditorParent(), true);
    addField(rfe);
    PathEditor pe = new PathEditor(PATH_PROPERTIES, "Path:", "Choisir des chemins",
    getFieldEditorParent());
    addField(pe);
    ScaleFieldEditor sfe = new ScaleFieldEditor(SCALE_PROPERTIES, "Echelle",
    getFieldEditorParent(), 0, 100, 1, 10);
    addField(sfe);
    }
    public void init(IWorkbench workbench) { }
    }
    † Implémenter le code spécifique à la page de préférence
    Il s’agit du même
    code que celui
    présenté dans le
    précédent chapitre
    (Composants
    Aditionnels avec
    JFace)
    Cette méthode est appelée à
    l’instanciation de cette classe

    View Slide

  40. 40
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    Onglet
    plugin.xml
    La description de l’extension
    qui vient d’être créée
    Description
    de l’élément
    Page One
    Description
    de l’élément
    Page Two

    View Slide

  41. 41
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Tutoriel extension Preference : définition et création
    Ouvrir l’éditeur de préférence
    Les fonctionnalités de
    l’application Eclipse ont été
    étendues en ajoutant deux
    pages de préférences

    View Slide

  42. 42
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Extension : définition et création
    † Toutes les informations de création d’une extension sont
    stockées dans le fichier plugin.xml





    name CDATA #REQUIRED
    id CDATA #REQUIRED
    schema CDATA #IMPLIED
    >

    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

    View Slide

  43. 43
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : définition et création
    † Précédemment nous avons montré l’utilisation de points
    d’extension fournis par le framework Eclipse
    † Nous présentons dans cette partie que tout plug-in autre
    que ceux du framework peut créer ses propres points
    d’extension
    † Pour rappel, un point d’extension est défini par une
    grammaire au format XML Schema
    † Il y autant de fichiers XML Schema qu’il y a de points
    d’extension définis dans le plug-in
    † Un plug-in expose ses points d’extension aux autres plug-ins
    si les fichiers XML Schema associés sont précisés dans le
    fichier plugin.xml

    View Slide

  44. 44
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Localisation du schéma XML
    † Le plug-in org.eclipse.ui définit de nombreux points d’exten-
    sion comme Views et PreferencePages
    Pour chaque point d’extension est
    défini le XML Schema servant à
    décrire sa grammaire
    plugin.xml du projet
    org.eclipse.ui
    Ce plug-in
    définit
    également un
    ensemble
    d’extension
    connecté à des
    points
    d’extension que
    ce même
    plug-in a
    définis

    View Slide

  45. 45
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Localisation du schéma XML
    † La grammaire d’un point d’extension est accessible soit au
    niveau de l’outil PDE lors de la création d’une extension …
    plugin.xml du projet
    PreferenceExamples
    Ouvre une description pré-
    formatée de la grammaire
    du point d’extension
    Ouvre une description du
    fichier Schema XML

    View Slide

  46. 46
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Localisation du schéma XML
    † Ou soit au niveau du plug-in qui définit le point d’extension
    plugin.xml du projet
    org.eclipse.ui
    Les fichiers au format Schema
    XML du plug-in org.eclipse.ui
    sont localisés dans le fichier
    org.eclipse.ui.source_3.x.x.jar
    dans le répertoire schema
    Accés aux
    informations du
    points d’extension
    sélectionnés

    View Slide

  47. 47
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Localisation du schéma XML
    Contenu du fichier
    org.eclipse.ui.source_3.x.x.jar
    Par convention,
    les fichiers
    Schema XML
    sont localisés
    dans le répertoire
    schema du
    plug-in

    View Slide

  48. 48
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Description du schéma XML
    preferencePages.exsd du
    projet org.eclipse.ui
    L’onglet Source de l’outil
    PDE permet l’édition à la
    « mano » du schema
    XML de description des
    points d’extension
    Le schema XML d’un
    point d’extension est à
    première vue très
    verbeux et toutes
    modifications dans ce
    mode de visualisation en
    dévient difficiles …
    † Visualisation du Schema XML en mode Source

    View Slide

  49. 49
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Description du schéma XML
    † Visualisation du Schema XML en mode Définition
    L’onglet Definition de l’outil PDE pour
    l’édition à base de formulaire du
    Schema XML d’un point d’extension
    Ce mode de
    représentation
    facilite l’édition
    d’un Schema XML
    d’un point
    d’extension
    Même si cet outil facilite la
    construction du Schema XML du
    point d’extension, il demande de
    la part du concepteur des
    connaissances en Schema XML
    Des outils pour spécifier
    facilement des indicateurs
    d’ordre entre éléments

    View Slide

  50. 50
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Description du schéma XML
    † Description du Schema XML en mode Définition (bis)
    L'élément extension est l'élément racine
    preferencePages.exsd du
    projet org.eclipse.ui
    L'élément extension est de type
    complexe et contient des sous
    éléments page (0 ou plusieurs) et
    trois attributs (point, id et name)
    Un élément page contient quatre
    attributs (identifiant de la page, le nom
    de la page, la classe implémentant le
    comportement de la page et
    l'emplacement de la page)
    Un élément page de type complexe
    contient également des sous éléments
    de type keywordReference

    View Slide

  51. 51
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Description du schéma XML






















    ...

    † Description du Schema XML en mode Source (bis)
    Extrait de preferencePages.exsd
    du projet org.eclipse.ui
    extension contient des sous
    éléments page (0 ou plusieurs) et
    trois attributs (point, id et name)
    page contient quatre attributs

    View Slide

  52. 52
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Description du schéma XML

    point="org.eclipse.ui.preferencePages">
    class="eclipse.extension.preferenceexamples.PreferenceFieldEditorPageOne"
    id="eclipse.extension.preferenceexamples.pageOneId"
    name="Page One">

    category="eclipse.extension.preferenceexamples.pageOneId"
    class="eclipse.extension.preferenceexamples.PreferenceFieldEditorPageTwo"
    id="eclipse.extension.preferenceexamples.pageTwoId"
    name="Page Two">



    † 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

    View Slide

  53. 53
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Conventions à respecter
    † Lors de la définition du Schema XML d'un nouveau point
    d'extension, veuillez assurer la présence de l'élément
    extension et de ces trois attributs (point, id, name)
    † L'élément extension est utilisé comme élément racine lors
    de la création d'une extension
    † Toute la structure d'un point d'extension dépend des sous
    éléments de l'élément extension










    Sous éléments structurant le point
    d'extension

    View Slide

  54. 54
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Exemple
    † Dans la suite du cours, nous présentons la création des
    points d'extension via l'exemple de la calculatrice
    † Il s'agit d'une calculatrice extensible où chaque opérateur
    est défini au travers d'une extension
    † Un point d'extension est défini par type d'opérateur
    (opérateurs binaires, unaires, fonctions de calculs, …)
    † Pour simplifier l'exemple, limitons nous à l'usage des
    opérateurs binaires en définissant deux opérateurs plus et
    moins
    † Un plug-in Calculator décrit le point d'extension opérateur
    binaire et deux plug-ins définissent respectivement les
    opérateurs plus et moins
    † Le plug-in Calculator définit également le dialogue homme
    machine de la calculatrice

    View Slide

  55. 55
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Exemple
    Plus
    plusId
    Calculator
    BinaryOperator
    BinaryOperator
    † Description détaillée de l'exemple
    Minus
    minusId
    plugin.xml
    Le plug-in Plus définit
    une extension plusId
    basée sur le point
    BinaryOperator
    Un fichier schéma XML définit
    la grammaire du point
    d'extension BinaryOperator
    Le fichier plugin.xml
    spécifie un point
    d'extension et son
    fichier respectif
    binaryoperator.exsd
    Le plug-in Minus
    définit une extension
    minusId basée sur le
    point BinaryOperator
    Plug-in défini par le projet
    binaryOperator.minus
    Plug-in défini par le projet
    binaryOperator.plus
    Fichier classe Plus
    implémentant
    l'opérateur minus

    View Slide

  56. 56
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Exemple
    † Description détaillée du point d'extension
    L'élément binaryOperator
    définit trois attributs
    Utilisé pour stocker
    l'identifiant de
    l'opérateur
    Utilisé pour désigner
    le nom de l'opérateur
    Utilisé pour définir l'interface qui
    implémentera le comportement
    de l'opérateur
    Un élément binaryOperator
    doit au moins être présent
    une fois
    L'élément extension est le
    l'élément racine et doit
    être présent
    Veuillez assurer que
    l'élément extension est
    défini et qu'il contient
    les attributs point, id et
    name

    View Slide

  57. 57
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d'extension : Création d'un point d'extension
    Onglet Extension Points
    Action Add permet d'ajouter
    une nouvelle déclaration
    d'un point d'extension au
    fichier plugin.xml
    † Sélectionner l’onglet Extension Points à partir de l’outil PDE
    lors de l’édition du fichier plugin.xml
    plugin.xml du projet
    Calculator

    View Slide

  58. 58
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d'extension : Création d'un point d'extension
    † Editer les informations pour la création d'un nouveau point
    d'extension
    Identifiant du point d'extension
    utilisé lors de la création d'une
    extension (attribut point de
    l'élément extension)
    Nom du point d'extension
    (attribut name)
    Schema XML qui décrit
    le point d'extension
    (attribut schema)

    View Slide

  59. 59
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d'extension : Création d'un point d'extension
    Onglet plugin.xml
    plugin.xml du projet
    Calculator
    † Les informations concernant la création d'un nouveau point
    d'extension ont été sauvegardées dans le fichier plugin.xml
    Pour chaque point d'extension
    les trois attributs id, name et
    schema sont sauvegardés

    View Slide

  60. 60
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d'extension : Création d'un point d'extension
    † Les informations concernant la création d'un nouveau point
    d'extension apparaissent dans l'outil PDE
    Onglet Extension Points
    plugin.xml du projet
    Calculator
    Le point
    d'extension
    binaryOperator est
    disponible dans la
    liste des points
    d'extension du
    plug-in
    Calculator
    conformément au
    contenu du fichier
    plugin.xml

    View Slide

  61. 61
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création d'un point d'extension
    binaryoperator.exsd du
    projet Calculator
    Différentes actions pour
    créer des éléments, des
    attributs et des indicateurs
    d'ordre
    Onglet Definition

    View Slide

  62. 62
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création des éléments
    † Création de l'élément binaryOperator
    Une description de
    l'élément peut être
    donnée
    L'élément
    binaryOperator a été
    ajouté au Schema
    XML
    binaryoperator.exsd du
    projet Calculator

    View Slide

  63. 63
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création des attributs
    † Un élément peut contenir des attributs dont les types sont
    restreints à
    † boolean : un attribut contenant la valeur true ou false
    † string : un attribut contenant un nom
    † java : une référence à un objet Java
    † ressource : une référence à un fichier ressource (image par exemple)
    † identifier : un identifiant du conteneur Eclipse
    † Selon le type de l'attribut choisi, différentes options sont
    disponibles dans les interfaces de PDE

    View Slide

  64. 64
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création des attributs
    Attribut de type
    resource
    Attribut de type
    boolean
    Attribut de type
    string
    Restriction sur le
    contenu de la chaîne de
    caractères au travers
    d'une énumération
    Contenu de la
    chaîne de
    caractères peut
    être traduite

    View Slide

  65. 65
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création des attributs
    Attribut de type
    java
    Possibilité de
    préciser une classe à
    étendre et / ou une
    interface à
    implémenter
    Attribut de type
    identifier
    Précise un nom
    d'identifiant du
    conteneur Eclipse

    View Slide

  66. 66
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création des attributs
    † Création des attributs de l'élément binaryOperator
    Onglet Definition
    Trois attributs ont
    été définis
    L'interface
    IBinaryOperator devra
    être implémentée
    L'attribut
    class est de
    type java
    binaryoperator.exsd du
    projet Calculator

    View Slide

  67. 67
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Création des attributs
    † Création de l'interface IBinaryOperator
    package eclipse.extension.calculator.binaryoperator;
    public interface IBinaryOperator {
    Double compute(Double left, Double right);
    }
    IBinaryOperator du
    projet Calculator
    Toute extension créée devra
    implémenter cette interface
    La méthode compute permet
    de faire des opérations sur un
    membre de gauche et un
    membre de droite

    View Slide

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

    View Slide

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

    View Slide

  70. 70
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Extensions liées à BinaryOperator
    † Extension minusId (implémentation de IBinaryOperator)
    package eclipse.extension.binaryoperator.minus;
    import eclipse.extension.calculator.binaryoperator.IBinaryOperator;
    public class Minus implements IBinaryOperator {
    public Minus() {
    }
    public Double compute(Double left, Double right) {
    double leftValue = left.doubleValue();
    double rightValue = right.doubleValue();
    double doubleResult = leftValue - rightValue;
    return doubleResult;
    }
    }
    Minus.java du projet Minus
    Impose que le plugin Minus à une
    dépendance vers le plugin Calculator
    Interface à implémenter
    (respect du contrat)
    L'implémentation définit le
    comportement de
    l'opérateur moins

    View Slide

  71. 71
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Extensions liées à BinaryOperator
    † Extension plusId (définition des attributs)
    plugin.xml du projet
    Plus
    Onglet Extension
    L'attribut class impose la
    création d'une class Plus qui
    implémente IBinaryOperator
    Un seul projet aurait pu être
    utilisé pour définir plusieurs
    extensions du point
    d'extension binaryoperator

    View Slide

  72. 72
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Extensions liées à BinaryOperator
    † Extension plusId (implémentation de IBinaryOperator)
    package eclipse.extension.binaryoperator.plus;
    import eclipse.extension.calculator.binaryoperator.IBinaryOperator;
    public class Plus implements IBinaryOperator {
    public Plus() {
    }
    public Double compute(Double left, Double right) {
    double leftValue = left.doubleValue();
    double rightValue = right.doubleValue();
    double doubleResult = leftValue + rightValue;
    return doubleResult;
    }
    }
    Plus.java du projet Plus
    Impose que le plugin Plus à une
    dépendance vers le plugin Calculator
    Interface à implémenter
    (respect du contrat)
    L'implémentation définit le
    comportement de
    l'opérateur moins

    View Slide

  73. 73
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Traitement des extensions
    † Bilan actuel de l'exemple Calculatrice
    † Le plug-in Calculator décrit le point d'extension binaryoperator
    † Les plug-ins Minus et Plus définissent respectivement les extensions
    plusId et minusId (création de deux classes)
    † Reste à faire …
    † Fournir une interface utilisateur qui permettra de saisir les nombres à
    calculer et l'opérateur de calcul. Le résultat du calcul sera affiché
    (utilisation d'une extension View)
    † Choisir une implémentation de l'interface IBinaryOperator et faire
    appel à la méthode compute (utilisation des extensions minusId et
    plusId)

    View Slide

  74. 74
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Traitement des extensions
    † Interface utilisateur de l'exemple Calculatrice
    Choix de l'opérateur
    Membre de gauche
    Membre de droite
    Demande du calcul :
    23 - 3
    Affichage du résultat
    du calcul 23 - 3 = 20 CalculatorView.java du
    projet Calculator

    View Slide

  75. 75
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Traitement des extensions
    † Le nombre d'opérateurs contenu dans le composant Combo
    dépend du nombre d'extensions binaryoperator définit à
    l'exécution du plugin Calculator
    Deux extensions
    binaryoperator ont été
    prises en compte
    Ici, une seule extension
    binaryoperator a été
    prise en compte

    View Slide

  76. 76
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Point d’extension : Traitement des extensions
    † Comme chaque extension binaryoperator est définie dans un
    plugin spécifique, il suffit d'ajouter ou pas ces plugins dans
    l'environnement d'exécution du plugin Calculator
    Environnement d'exécution
    du projet Calculator
    Seule l'extension minusId
    (du plugin minus) est prise
    en compte

    View Slide

  77. 77
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : gestion du registre des extensions
    † Le registre des extensions permet de connaître pour un point
    d'extension les extensions qui existent
    † Le registre des extensions est accessible par programmation
    via une API fournit par le plateforme Eclipse
    † Au travers du registre d'extensions il est possible d'accéder
    au contenu d'une extension
    † Connaître son identifiant unique
    † Connaître les valeurs de chaque attribut
    † Instancier une classe décrite par un attribut de l'extension
    † Le registre des extensions permet également de créer dyna-
    miquement des extensions
    † Exemple : création d'une extension View de manière programmatique
    † Registre des extensions est accessible via la classe Platform
    † static IExtensionRegistry getExtensionRegistry()

    View Slide

  78. 78
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les extensions
    † L'interface IExtensionRegistry fournit une API permettant
    d'interroger les extensions à partir de leur identifiant ou d'un
    espace de nommage
    † IExtension getExtension(String extId) : récupère une extension par
    son identifiant unique
    † IExtension getExtension(String extPointId, String extId) : récupère
    une extension par l'id du point d'extension et via l'id de l'extension
    † IExtension[] getExtensions(String namespace) : récupère toutes les
    extensions déclarées dans l'espace de nommage donné

    View Slide

  79. 79
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les extensions
    † Pour rappel, l'identifiant unique d'une extension est donnée
    par l'intermédiaire de l'attribut id de l'élément extension
    † La valeur est optionnelle et par défaut elle vaut null
    plugin.xml du projet
    Calculator
    Onglet Extension
    L'identifiant de cette extension est
    eclipse.extension.Calculator.calculatorViewId
    Si aucun espace de nommage est
    utilisé pour définir l'identifiant de
    l'extension, c'est l'identifiant du
    plugin qui est utilisé comme
    espace de nommage

    View Slide

  80. 80
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les extensions
    † Exemple 1 : récupérer une extension par son identifiant
    ...
    Button example1Button = new Button(parent, SWT.FLAT);
    example1Button.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
    IExtension extension = extensionRegistry.getExtension(
    "eclipse.extension.binaryoperator.minusId");
    System.out.println(extension.getLabel());
    }
    });
    example1Button.setText("Extension MinusID");
    RegistryQueryView.java du
    projet Calculator
    Vue RegistryQueryView
    Récupère une extension à partir de
    son identifiant unique

    View Slide

  81. 81
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les extensions
    † Exemple 2 : récupérer toutes les extensions d'un namespace
    ...
    Button example2Button = new Button(parent, SWT.FLAT);
    example2Button.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
    IExtension[] extensions =
    extensionRegistry.getExtensions("eclipse.extension.binaryoperator");
    for (IExtension current : extensions) {
    System.out.println(current.getLabel());
    }
    }
    });
    example2Button.setText("Extensions");
    RegistryQueryView.java du
    projet Calculator
    Vue RegistryQueryView
    Récupère toutes les extensions à
    partir de l'espace de nommage
    eclipse.extension.binaryoperator
    Espace de nommage

    View Slide

  82. 82
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les points d'extension
    † L'interface IExtensionRegistry fournit une API permettant
    d'interroger les extensions et les points d'extension à partir
    de leur identifiant ou d'un espace de nommage
    † IExtensionPoint getExtensionPoint(String extPointId) : récupère le
    point d'extension à partir de son identifiant
    † IExtensionPoint getExtensionPoint(String nspace, String extPointId) :
    récupère le point d'extension à partir de son espace de nommage et
    de son identifier)
    † IExtensionPoint[] getExtensionPoints() : récupère tous les points
    d'extension du registre
    † IExtensionPoint[] getExtensionPoints(String namespace) : retourne
    tous les points d'extension définis dans l'espace de nommmage

    View Slide

  83. 83
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les points d'extension
    † Exemple 1 : récupérer un point d'extension par son identifiant
    ...
    Button example3Button = new Button(parent, SWT.FLAT);
    example3Button.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
    IExtensionPoint extPoint = extensionRegistry.getExtensionPoint("
    eclipse.extension.calculator.binaryoperator");
    System.out.println(extPoint.getLabel());
    }
    });
    example3Button.setText("Point Extension binaryoperator");
    RegistryQueryView.java du
    projet Calculator
    Récupère un point
    d'extension à partir de son
    identifiant unique
    Vue RegistryQueryView

    View Slide

  84. 84
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : récupérer les points d'extension
    † Exemple 2 : récupérer tous les points d'extension du registre
    ...
    Button example4Button = new Button(parent, SWT.FLAT);
    example4Button.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
    IExtensionPoint[] extPoint = extensionRegistry.getExtensionPoints();
    for (IExtensionPoint current : extPoint) {
    System.out.println(current.getUniqueIdentifier());
    }
    }
    });
    example4Button.setText("Points Extension");
    Récupère tous les points
    d'extension du registre d'extension
    RegistryQueryView.java du
    projet Calculator
    Vue RegistryQueryView

    View Slide

  85. 85
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IExtension
    † L'interface IExtension décrit un objet extension dont les
    principales méthodes
    † String getLabel() : le nom donné à l'extension (valeur donnée à
    l'attribut name de l'élément extension)
    † String getExtensionPointUniqueIdentifier() : identifiant unique du point
    d'extension pour lequel l'extension contribue
    † String getNamespaceIdentifier() : l'espace de nommage de l'extension
    (exemple : eclipse.extension.binaryoperator)
    † String getSimpleIdentifier() : l'identifiant simple (exemple : plusId)
    † String getUniqueIdentifier() : l'identifiant unique (exemple :
    eclipse.extension.binaryoperator.plusId)
    † IConfigurationElement[] getConfigurationElements() : retourne les
    éléments de configuration déclarés dans le fichier plugin.xml
    (IConfigurationElement est détaillée dans la suite)

    View Slide

  86. 86
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IExtensionPoint
    † L'interface IExtensionPoint décrit un objet extension dont les
    principales méthodes
    † String getLabel() : le nom donné à l'extension (valeur donnée à
    l'attribut name de l'élément meta.schema)
    † String getNamespaceIdentifier() : l'espace de nommage de l'extension
    (exemple : eclipse.extension.binaryoperator)
    † String getSimpleIdentifier() : l'identifiant simple (exemple : plusId)
    † String getUniqueIdentifier() : l'identifiant unique (exemple :
    eclipse.extension.binaryoperator.plusId)
    † String getSchemaReference() : le chemin et le nom du fichier de
    description (exemple : schema/eclipse.extension…binaryoperator.exsd)

    View Slide

  87. 87
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IExtensionPoint
    † L'interface IExtensionPoint décrit un objet extension dont les
    principales méthodes (suite) …
    † IConfigurationElement[] getConfigurationElements() : retourne les
    éléments de configuration de toutes les extensions qui contribuent au
    point d'extension courant
    † IExtension getExtension(String extensionId) : retourne une extension
    à partir de son identifiant unique et contribuant au point d'extension
    † IExtension[] getExtensions() : retourne toutes les extensions
    contribuant au point d'extension courant

    View Slide

  88. 88
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IConfigurationElement
    † Un élément de configuration décrit le contenu d'un élément
    d'une extension (un accès aux différentes valeurs)
    † Ces informations de configuration sont issues du contenu
    placé dans le fichier plugin.xml
    † A noter qu'une extension n'est pas forcément associée à un
    seul élément de configuration
    † Pour une extension donnée contribuant au point d'extension
    org.eclipse.ui.views plusieurs vues peuvent être définies

    View Slide

  89. 89
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IConfigurationElement
    † Exemple : création de plusieurs vues à partir d'une extension
    † Identifiant du point d'extension : org.eclipse.ui.views
    † Identifiant de l'extension : calculatorViewId
    plugin.xml du projet
    Calculator
    Onglet Extension
    La valeur de l'identifiant
    unique d'une extension
    n'est pas obligatoire, cette
    valeur est généralement
    omise
    Cette extension
    définit deux
    éléments de
    configuration
    représentés par
    Calculator et
    RegistryQueryView

    View Slide

  90. 90
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IConfigurationElement
    † Un élément de configuration est hiérarchique, il peut contenir
    également des sous éléments de configuration
    plugin.xml du projet
    Calculator
    Onglet Extension
    L'élément de
    configuration
    Calculator défini un
    sous élément de
    configuration
    représenté par
    description

    View Slide

  91. 91
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IConfigurationElement
    † Un élément de configuration est définit par l'interface
    IConfigurationElement dont les principales méthodes sont
    † String getAttribute(String name) : retourne la valeur contenu par
    l'attribut désigné par name
    † String[] getAttributeNames() : liste l'ensemble des attributs d'un
    élément de configuration
    † IConfigurationElement[] getChildren() : retourne l'ensemble des sous
    éléments définis par l'élément de configuration courant
    † Object getParent() : retourne le parent de cet élément (IExtension ou
    IConfigurationElement)
    † IExtension getDeclaringExtension() : retourne l'extension associé à
    l'élément de configuration
    † Object createExecutableExtension(String propertyName) : création
    d'un objet pour un attribut de type Class

    View Slide

  92. 92
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IConfigurationElement
    † Exemple : lister l'ensemble des attributs d'un élément de
    configuration
    ...
    Button exemple5Button = new Button(parent, SWT.FLAT);
    exemple5Button.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
    IExtensionPoint extPoint = extensionRegistry.getExtensionPoint("
    eclipse.extension.calculator.binaryoperator");
    IConfigurationElement[] configurationElements =
    extPoint.getConfigurationElements();
    for (IConfigurationElement current : configurationElements) {
    String[] attributeNames = current.getAttributeNames();
    for (String currentAttributeName : attributeNames) {
    System.out.println("Attribut : " + currentAttributeName
    +" / Valeur : "+ current.getAttribute(currentAttributeName));
    }
    }
    }
    });
    exemple5Button.setText("Attributs/Valeurs");
    RegistryQueryView.java du
    projet Calculator

    View Slide

  93. 93
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : IConfigurationElement
    † Exemple : création d'un objet de type IBinaryOperator
    ...
    compute.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    int selectionIndex = myCombo.getSelectionIndex();
    if (selectionIndex != -1) {
    Double leftDouble = Double.parseDouble(leftInput.getText());
    Double rightDouble = Double.parseDouble(rightInput.getText());
    try {
    IBinaryOperator binaryOperator = (IBinaryOperator)
    (contributions[selectionIndex]
    .createExecutableExtension("class"));
    Double resultDouble = binaryOperator.compute(leftDouble,
    rightDouble);
    resultText.setText(resultDouble.toString());
    } catch (CoreException e1) {
    e1.printStackTrace();
    }
    }
    }
    });
    CalculatorView.java du
    projet Calculator
    A partir de
    l'attribut class
    construction d'un
    objet
    binaryOperator
    Appel de la
    méthode compute

    View Slide

  94. 94
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : créer de nouvelles extensions dynamiquement
    † Pour l'instant, nous avons étudié la création des extensions
    et des points d'extension de manière statique via PDE
    † Définition des points d'extension dans un schéma XML
    † Description du schéma dans le fichier plugin.xml
    † Définition des extensions dans le fichier plugin.xml
    † La plateforme Eclipse fournit des mécanismes permettant de
    créer programmatiquement de nouvelles extensions et points
    d'extension
    † A noter que ces mécanismes sont en cours d'évolution et
    l'utilisation d'API internes est à éviter …
    † Dans la suite, nous étudions
    † Des exemples pour ajouter du contenu dans le registre d'extension
    † Des solutions pour limiter l'utilisation d'API internes

    View Slide

  95. 95
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addExtension
    † Une première solution consiste à utiliser l'API Interne
    ExtensionRegistry via la méthode (non recommandé)
    † boolean addExtension(String id, IContributor contributor,
    boolean persist, String label, String extPointId,
    ConfigurationElementDescription confs, Object userToken)
    † id : identifier de l'extension (peut être vide mais pas null)
    † contributor : contributeur de l'extension
    † persist : si encore présent au redémarrage d'Eclipse
    † label : nom de l'extension (peut être vide mais pas null)
    † extPointId : identifiant de l'extension
    † confs : éléments qui décrivent la configuration de l'extension
    † userToken : objet utilisé pour vérifier les permissions d'écriture

    View Slide

  96. 96
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addExtension
    † Un objet ConfigurationElementDescription permet de décrire
    le contenu d'une extension
    † ConfigurationElementDescription(String name,
    ConfigurationElementAttribute[] attributes, String value,
    ConfigurationElementDescription[] children)
    † name : nom de l'élément de configuration
    † attributes : liste les attributs de cet élément de configuration
    † value : valeur à stocker
    † children : sous éléments de configuration
    † Un objet ConfigurationElementAttribute décrit un attribut et
    représenté par un couple clé / valeur
    † ConfigurationElementAttribute(String name, String value)
    † name : nom de l'attribut
    † value : valeur de l'attribut

    View Slide

  97. 97
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addExtension
    † Le paramètre userToken doit également être récupéré à
    partir de la classe interne ExtensionRegistry via la méthode
    † Object getTemporaryUserToken()
    † Pour pallier à l'utilisation de cette classe interne, une solution
    proposée consiste à
    † Utiliser une valeur null au paramètre userToken de la méthode
    addExtension
    † La propriété eclipse.registry.nulltoken doit valoir true (indiqué lors du
    lancement de la configuration d'exécution)

    View Slide

  98. 98
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addExtension
    † Exemple : création dynamique d'une extension de type views
    ExtensionRegistry reg = (ExtensionRegistry)Platform.getExtensionRegistry();
    Bundle bundle = Activator.getDefault().getBundle();
    IContributor contributor = ContributorFactoryOSGi.createContributor(bundle);
    ConfigurationElementAttribute[] conf = new ConfigurationElementAttribute[6];
    conf[0] = new ConfigurationElementAttribute("id", "genericViewId" +sequenceId);
    conf[1] = new ConfigurationElementAttribute("name", "GenericView" + sequenceId);
    conf[2] = new ConfigurationElementAttribute("class",
    "eclipse.extension.dynamicextensionexamples.views.GenericView");
    conf[3] = new ConfigurationElementAttribute("category",
    "eclipse.extension.DynamicExtensionExamples");
    conf[4] = new ConfigurationElementAttribute("restorable", "true");
    conf[5] = new ConfigurationElementAttribute("allowMultiple", "true");
    ...
    Méthode createFromAddExtension
    CreateExtensionView.java du projet
    DynamicExtensionExamples
    Récupération de
    l'implémentation interne du
    registre d'extension
    Définition d'un élément de
    configuration pour une
    extension de type View
    RAPPEL : La liste des attributs à placer
    dans l'élément de configuration doit
    respecter le schéma du point d'extension
    org.eclipse.ui.views

    View Slide

  99. 99
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addExtension
    † Exemple (suite) : création dynamique d'une extension
    ...
    String extensionPointId = "org.eclipse.ui.views";
    ConfigurationElementDescription configurationElements =
    newConfigurationElementDescription("view", conf, null, null);
    Object token = reg.getTemporaryUserToken();
    reg.addExtension("",contributor,false,"",extensionPointId,configurationElements,
    token);
    sequenceId++;
    Méthode createFromAddExtension
    CreateExtensionView.java du projet
    DynamicExtensionExamples
    Récupération de l'objet userToken
    Identifiant de
    l'extension vide (NE
    DOIT PAS ÊTRE NULL)
    Nom de l'extension
    vide (NE DOIT PAS
    ÊTRE NULL)
    Identifiant du point
    d'extension

    View Slide

  100. 100
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addExtension
    † Exemple : création dynamique d'une extension de type views
    avec le paramètre userToken à null
    ...
    String extensionPointId = "org.eclipse.ui.views";
    ConfigurationElementDescription configurationElements =
    newConfigurationElementDescription("view", conf, null, null);
    reg.addExtension("",contributor,false,"",extensionPointId,configurationElements,
    null);
    sequenceId++;
    Méthode
    createFromAddExtensionWithoutToken
    CreateExtensionView.java du projet
    DynamicExtensionExamples
    userToken est null

    View Slide

  101. 101
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addContribution
    † La solution précédente fondée sur addExtension nécessite un
    couplage très fort avec des API Internes
    † La seconde solution consiste à utiliser la méthode
    addContribution définie dans l'interface IExtensionRegistry
    † boolean addContribution(InputStream is, IContributor cont, boolean
    persist, String name, ResourceBundle rb, Object userToken)
    † is : flux sur un contenu XML qui peut contenir des points
    d'extension et des extensions (syntaxe identique à plugin.xml)
    † cont : contributeur de l'extension
    † persist : si encore présent au démarrage
    † name : nom de la contribution
    † rb : ressource bundle utilisé pour la traduction
    † userToken : objet utilisé pour vérifier les permissions d'écriture

    View Slide

  102. 102
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addContribution
    † Exemple : création dynamique d'une extension de type views
    à partir d'une chaîne de caractères
    IExtensionRegistry registry = RegistryFactory.getRegistry( );
    Bundle bundle = Activator.getDefault().getBundle();
    IContributor contributor = ContributorFactoryOSGi.createContributor(bundle);
    String extension = "" +
    " " class=\"eclipse.extension.dynamicextensionexamples.views.GenericView\"" +
    " icon=\"icons/sample.gif\"" +
    " id=\"genericViewId" + sequenceId + "\"" +
    " name=\"GenericView" + sequenceId + "\">" +
    " ";
    InputStream is = new ByteArrayInputStream(extension.getBytes());
    registry.addContribution(is, contributor, false, null, null, null);
    sequenceId++;
    Méthode createFromAddContributionWithXMLString
    CreateExtensionView.java du projet
    DynamicExtensionExamples
    Le flux XML est préparé dans
    une chaîne de caractères
    userToken est null nécessite de
    modifier le paramètre nulltoken
    Aucune utilisation
    d'API Interne

    View Slide

  103. 103
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addContribution
    † Exemple : création dynamique d'une extension de type views
    à partir d'un fichier XML
    IExtensionRegistry registry = RegistryFactory.getRegistry( );
    Bundle bundle = Activator.getDefault().getBundle();
    IContributor contributor = ContributorFactoryOSGi.createContributor(bundle);
    try {
    InputStream is = FileLocator.openStream(bundle,new
    Path("newextension.xml"),true);
    registry.addContribution(is, contributor, false, null, null, null);
    } catch (IOException e) {
    e.printStackTrace();
    }
    Méthode createFromAddContributionWithXMLFile
    CreateExtensionView.java du projet
    DynamicExtensionExamples
    Le flux XML est contenu dans
    un fichier
    Aucune utilisation
    d'API Interne

    View Slide

  104. 104
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron


    class="eclipse.extension.dynamicextensionexamples.views.GenericView"
    icon="icons/sample.gif"
    id="genericViewId"
    name="GenericView">



    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

    View Slide

  105. 105
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : extensions dynamiques - addContribution
    † Exemple : création dynamique d'un point d'extension de type
    binaryoperator à partir d'un fichier XML
    IExtensionRegistry registry = RegistryFactory.getRegistry();
    Bundle bundle = Activator.getDefault().getBundle();
    IContributor contributor = ContributorFactoryOSGi.createContributor(bundle);
    String extensionPoint = "" id=\"eclipse.extension.dynamicextension.test\"" +
    " name=\"DynamicExtensionPoint\"" +
    " schema=\"schema/eclipse.extension.dynamicextension.test.exsd\"/>";
    InputStream is = new ByteArrayInputStream(extensionPoint.getBytes());
    registry.addContribution(is, contributor, false, null, null, null);
    Aucune utilisation
    d'API Interne
    Méthode createFromAddContributionExtensionPoint
    CreateExtensionView.java du projet
    DynamicExtensionExamples

    View Slide

  106. 106
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : avertir les changements du registre
    † Le registre d'extensions fournit des mécanismes d'écouteurs
    qui permettent de notifier lorsque de nouvelles extensions ou
    points d'extension sont ajoutés
    † L'interface IExtensionRegistry fournit les méthodes suivantes
    † void addListener(IRegistryEventListener listener) : ajoute un écouteur
    sur les changements du registre d'extension
    † void addListener(IRegistryEventListener listener, String extPointId) :
    filtre l'écoute sur les extensions contribuant à extPointId
    † L'interface IRegistryEventListener fournit des méthodes pour
    gérer les changements
    † void added(Iextension[] exts) : nouvelles extensions
    † void added(IExtensionPoint[] extPoints) : nouveaux points d'extension
    † …

    View Slide

  107. 107
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Platform : avertir les changements du registre
    † Exemple : écouter les changements du registre d'extensions
    public Activator() {
    Platform.getExtensionRegistry().addListener(new IRegistryEventListener() {
    public void added(IExtension[] extensions) {
    System.out.println("extension added : ");
    for (IExtension currentExtension : extensions) {
    IConfigurationElement[] configurationElements =
    currentExtension.getConfigurationElements();
    for (IConfigurationElement configurationElement : configurationElements) {
    System.out.println(" - " + configurationElement.getAttribute("id"));
    }
    }
    }
    public void added(IExtensionPoint[] extensionPoints) {
    System.out.println("extension point added : ");
    for (IExtensionPoint currentExtensionPoint : extensionPoints) {
    System.out.println(" - " + currentExtensionPoint.getUniqueIdentifier());
    }
    }
    public void removed(IExtension[] exts) { }
    public void removed(IExtensionPoint[] extPoints) { }
    }
    Activator.java du projet
    DynamicExtensionExamples
    A chaque création de nouvelles
    extensions, le registre d'extensions
    notifie les écouteurs

    View Slide

  108. 108
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Bilan
    † Nous avons étudié …
    † Une définition détaillée du mécanisme d'extensions
    † La création d'extensions (View et Preference) via l'outil PDE
    † Une description détaillée des points d'extension et de Schema XML
    † La création de nouveaux points d'extensions
    † L'interrogation des extensions et points d'extension via le registre
    d'extensions
    † La création dynamique d'extensions et de points d'extension
    † Prochaine étape : Conception avancée de plug-ins
    † Compréhension du Workbench Eclipse (View, Editor, Action,
    Perspective, Activity, UI Forms, …)
    † Description générale des principaux points d'extension

    View Slide

  109. 109
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Glossaire Eclipse
    † Bundle ou plug-in : un bundle est un composant qui possède un
    cycle de vie et qui expose et importe des services. Sous Eclipse le
    composant est appelé plug-in
    † Extension : l’extension est la réponse apportée à un point d’extension
    Il doit respecter un schéma imposé par le point d’extension
    † IHM : acronyme qui a une signification différente selon s’il est singulier
    ou pas : au singulier, il signifie le domaine de l’Interaction Homme-
    Machine, au pluriel, il signifie les Interfaces Homme-Machine
    † LazyLoading : qui désigne la politique de chargement d’un plug-in.
    Le plug-in est chargé dans le conteneur OSGi quand il doit être utilisé
    † MANIFEST.MF : fichier de configuration qui décrit le fonctionnement
    d’une archive Jar. La spécification OSGi enrichie sa description en ajoutant
    des descriptions générales (nom, auteur, version) et des descriptions de
    dépendances avec les autres plug-ins

    View Slide

  110. 110
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Glossaire Eclipse
    † PDE : Plug-in Development Environment est un ensemble d’outils
    fournit par l’environnement Eclipse pour faciliter le développement des
    plug-ins
    † perspective : regroupement cohérent de vues (views) et d’actions
    spécifiques à une tâche de l’utilisateur (coder du Java, débuguer, …)
    † plugin.xml : un fichier de configuration au format XML qui décrit les
    extensions et les points d’extension utilisés et fournis par un plug-in
    † point d’extension : un point d’extension décrit un contrat qui
    stipule la manière dont des interfaces et des classes d’un plug-in doivent
    être utilisées par d’autres plug-ins. Le contrat est décrit au travers un
    schéma XML
    † product : configuration utilisée pour la génération d’une version
    exécutable de l’application Eclipse (les plug-ins dépendants, les
    arguments pour l’exécution de l’application, les icônes, le splashscreen)

    View Slide

  111. 111
    Extensions - M. Baron - Page
    mickael-baron.fr mickaelbaron
    Glossaire Eclipse
    † RCP : Rich Client Platform est une application autonome basée sur le
    noyau Eclipse. Tous les aspects liés à l’environnement de développement
    ont été supprimés
    † view : un élément graphique qui permet d’afficher une IHM. Une View
    est disponible par l’intermédiaire d’une perspective
    † workspace : correspond à un espace de travail dans lequel l’applica-
    tion Eclipse peut déposer les fichiers qui ont été manipulés
    Glossaire complété dans la suite des
    partie de ce chapitre

    View Slide