introduction à la conception de plug-ins

119
Développement de clients riches : Plateforme Eclipse Mickaël BARON - 2008 (Rev. Avril 2009) mailto:[email protected] ou mailto:[email protected] Chapitre 3 : Conception de plug Chapitre 3 : Conception de plug - - ins ins Introduction à la conception de plug-ins

Upload: mickael-baron

Post on 25-Dec-2014

4.301 views

Category:

Technology


0 download

DESCRIPTION

Ce support de cours est une introduction à la conception de plug-ins avec la plateforme Eclipse. Nous étudions les aspects suivants : introduction à OSGi, développement par l'exemple d'un plug-in simple, la description des fichiers MANIFEST.MF, plugin.xml et build.properties et enfin la description des classes Activator et Platform.

TRANSCRIPT

Page 1: Introduction à la conception de plug-ins

Développement de clients riches : Plateforme Eclipse

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

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

Introduction à la conception de plug-ins

Page 2: Introduction à la conception de plug-ins

2Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Creative Commons

Contrat Paternité

Partage des Conditions Initiales à l'Identique

2.0 France

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

Licence

Page 3: Introduction à la conception de plug-ins

3Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Organisation du cours sur la conception de plug-ins Eclipse

� OSGi et Eclipse : généralités sur OSGi

� Tutoriel de conception : création d’un plug-in

� Fichiers de configuration : paramétrer un plug-in

� Activator : information sur le plug-in

� Platform : information sur l’environnement

Tous les exemples du cours sont disponibles directement à l’adresse

mbaron.developpez.com/eclipse/introplugin

Page 4: Introduction à la conception de plug-ins

4Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comConception de plug-in Eclipse : généralités

� Ce support de cours s’intéresse uniquement aux aspects liés à la conception de plug-ins Eclipse

� La conception d’applications Eclipse RCP sera vue dans une autre partie de ce chapitre et nous étudierons � La classe Application

� Perpsective, View, Editor

� Product pour générer une application Eclipse RCP

� Pour simplifier, la différence entre plug-in et Eclipse RCP est qu’une application Eclipse RCP est une version stand-aloned’un plug-in

� A l’inverse, un plug-in ne peut être exécuté seul, il faut lui associer obligatoirement une application Eclipse

� Un glossaire de tous les acronymes et concepts est proposéà la fin de ce support de cours

Page 5: Introduction à la conception de plug-ins

5Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Conception de plug-in Eclipse : 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/introplugin

� Des bulles d’aide tout au long du cours

� Logiciels utilisés

� Eclipse 3.3 Europa

� Pré-requis

� Connaissance de Java

� Principes de base concernant la boite à outils SWT

� Remerciements

� Developpez.com : Néo Kimz, Jawher Moussa, Baptiste Witch

� Benjamin Cabé

Ceci est une alerte

Ceci est une astuce

Page 6: Introduction à la conception de plug-ins

6Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Introduction à la conception de plug-ins : ressources …

� Des articles sur le sujet OSGi et Eclipse

� www.ibm.com/developerworks/library/os-ecl-osgi

� t-templier.developpez.com/tutoriel/java/osgi/osgi1

� www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html?page=1

� neilbartlett.name/blog/osgibook

� Des articles sur une introduction à la conception de plug-ins

� www.eclipsetotale.com/articles/Developpement_de_plugins_Eclipse_partie1.html

� wiki.improve.fr/wiki/moni/articles/thirdpartylib

� www.ibm.com/developerworks/library/os-eclipse-plugindev1

� Des livres

� Eclipse – Building Commercial-Quality Plug-ins, 2004 - ISBN : 0-321-22847-2

� Eclipse – Rich Client Platform, 2005 – ISBN : 0-321-33461-2

Page 7: Introduction à la conception de plug-ins

7Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comOSGi : Open Service Gateway Initiative

� La plateforme Eclipse repose en partie sur la spécification

OSGi qui est l’acronyme de Open Service Gateway Initiative

� La spécification peut être trouvée à l’adresse suivante

� www.osgi.org/Specifications/HomePage

� Pour synthétiser, la spécification OSGi tente d’adresser deux

types de problématiques

� Programmation orientée composant

� Architecture orientée service (composants exposent et importent des

services)

Page 8: Introduction à la conception de plug-ins

8Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comOSGi : Open Service Gateway Initiative

� Dans l’architecture OSGi le concept de composant est mis

en œuvre par l’intermédiaire de Bundles

� Gestion des bundles (module)

� Gestion des différents chargeurs de classes

� Gestion des versions des dépendances

� Un chargeur de classes par bundle

� Cycle de vie des bundles (life cycle)

� Cycle de vie du composant lors de son entrée dans le conteneur OSGi

� Cycle de vie du composant lors de son utilisation

� Services exposés par les bundles (service)

� Gestion des services définis dans des interfaces Java

Page 9: Introduction à la conception de plug-ins

9Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comOSGi : Open Service Gateway Initiative

� Différentes implémentations de la spécification OSGi

� OSCAR : oscar.objectweb.org

� Felix : felix.apache.org

� KnopflerFish 2 : www.knopflerflish.org

� Eclipse (celle que nous allons étudier)

� Pour une vue d’ensemble de toutes les implémentations

OSGi : www.osgi.org/Markets/HomePage

Page 10: Introduction à la conception de plug-ins

10Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comOSGi : Open Service Gateway Initiative

� Un bundle est décrit dans un fichier Jar

� Les informations de déploiement sont indiquées dans le

fichier MANIFEST.MF (informations spécifiques à OSGi)

� Interactions entre Bundles

� Mise à disposition de packages (préciser dans MANIFEST.MF quels

sont les packages à exporter)

� Importation de packages (quels sont les packages issus d’autres

bundles à utiliser)

Page 11: Introduction à la conception de plug-ins

11Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

OSGi et Eclipse

� Dans l’implémentation fournie par Eclipse, un bundle corres-

pond à un plug-in

� Eclipse a adopté la spécification OSGi depuis la version 3.0

� Eclipse ne repose pas complètement sur la spécification

OSGi pour effectuer l’interaction entre les plug-ins

� La notion de registres d’extension qui existe depuis le début

de la plateforme permet également de communiquer entre

plug-ins

� Dans la suite du cours nous montrons comment les registres

d’extension et les services OSGi sont utilisés

� Une comparaison peut être trouvée à l’adresse suivante

� www.eclipsezone.com/articles/extensions-vs-services/

Page 12: Introduction à la conception de plug-ins

12Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comConception du plug-in « plug-hype »

� Nous décrivons dans cette partie la conception d’un plug-in

via l’environnement Eclipse

� La démarche est de présenter chaque écran de l’assistant

fourni avec Eclipse pour construire ce plug-in

� Nous survolerons également les fichiers générés sachant

qu’ils seront tous détaillés tout au long de ce chapitre

� Nous montrerons également les différentes possibilités

offertes par la plateforme Eclipse pour tester ce plug-in

� Le plug-in présenté a comme objectif d’afficher une vue

contenant un TableViewer et un label qui affiche « Ceci est

un plug-hype ! »

� Pré-requis : un environnement Eclipse avec le module PDE

installé (Plugin Development Environment)

Page 13: Introduction à la conception de plug-ins

13Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel « plug-hype » : Select a wizard

Sélectionner l’assistant de création de projet

de plug-in

� Sélectionner à partir du menu Eclipse l’action File -> New ->

Project pour ouvrir l’assistant de création de projet

Le groupe « Plug-in Development » fournit

un ensemble d’assistants lié à la

conception de plug-in

Rien n’interdit le développement de plug-in « à la mano », cependant ça

peut être fastidieux …

Page 14: Introduction à la conception de plug-ins

14Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel « plug-hype » : Plug-in Project

Saisir un nom de projet lié au

plug-in à créer

Possibilité de modifier l’emplacement des fichiers du plug-in (par défaut celui du workspace courant)

Choisir le nom des répertoires sources

et binaires

Choix de la plateforme cible …

Soit le développement d’un plug-in Eclipse (en choisissant la version de la distribution)

Soit le développement d’un bundle OSGi (en choisissant le type d’implémentation OSGi)

Page 15: Introduction à la conception de plug-ins

15Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel « plug-hype » : Plug-in Content

� Cette page permet de paramétrer le plug-in en cours de

développement

Définition d’un ID qui permettra d’identifier ce plug-in parmi les autres

Précise le numéro de version qui

pourra être utilisépour le versioninglors d’une mise à

jour

Nom du plug-in

Nom de fournisseur

Précise si un Activatordoit être généré ou pas

Nom de l’Activator

Précise si le plug-in propose ou pas une

IHM

Précise si le plug-in est autonome ou pas

Page 16: Introduction à la conception de plug-ins

16Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel « plug-hype » : Select Template

� Des templates de génération sont disponibles selon les

options fournies précédemment

Utiliser ou pas les templates de création

Des templatesspécifiques qui embarquent des

IHM

Une aide contextuelle qui fournie des

informations sur le template et les

extensions utilisées

Cette option permet de sélectionner

plusieurs templates de génération

Page 17: Introduction à la conception de plug-ins

17Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel « plug-hype » : Plug-in options

Le nom de la classepour la vue à créer

� Selon le type de plug-in des options supplémentaires sont à

renseigner

L’ID de la catégorie qui servira de

regroupement pour cette vue

Le nom de la catégorie qui servira de regroupement

Le nom de la vue

Page 18: Introduction à la conception de plug-ins

18Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTutoriel « plug-hype » : Plug-in options

� Différentes options liées à la vue peuvent être précisées

Ajout du support du double clique sur la vue

Ajout du support du tri dans le composant

TableViewer

Page 19: Introduction à la conception de plug-ins

19Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : vue rapide sur PDE

� L’outil PDE (Plugin Development Environment) fournit entre

autre une vue pour configurer les plug-ins

Certaines informations saisies

lors de l’assistant sont disponibles en

édition

Nous détaillerons chaque écran lors de la partie fichiers de configuration

La vue du PDE structure les informations à

manipuler par onglet

Toutes les modifications apportées dans la vue impactent les fichiers de configuration et vice et versa

Page 20: Introduction à la conception de plug-ins

20Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : répertoires et fichiers générés

� Un plug-in contient un ensemble de fichiers qui sont

positionnés suivant une logique commune

MANIFEST.MFInformations générales et dépendances entre plug-in

plugin.xmlInformations liées aux extensions et aux points d’extension

build.propertiesInformations liées au déploiement du plug-in

Activator.javaClasse qui gère le cycle

de vie du plug-in

PlugHype.javaLa classe qui définit la vue

du plug-in

Page 21: Introduction à la conception de plug-ins

21Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Un plug-in peut être vu comme une brique d’une application

et ne peut fonctionner seul

� Pour tester un plug-in, il faut l’associer à une application de

type Eclipse

� Une application Eclipse est un regroupement de plug-ins

dont le nombre varie selon les fonctionnalités désirées

� Dans notre exemple, le plug-in a tester fournit simplement

une vue dont les dépendances avec les autres plug-ins sont

limités

� De manière générale pour tester nos plug-ins nous

utiliserons une application Eclipse basée sur une version

minimale de l’IDE d’Eclipse (voir transparents suivants)

Page 22: Introduction à la conception de plug-ins

22Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Sélectionner à partir du menu Eclipse l’action Run -> Open Run Dialog …

� Ou à partir de la barre d’actions

Page 23: Introduction à la conception de plug-ins

23Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Cette page fournit un gestionnaire de configurations pour

des applications Eclipse

Création d’une nouvelle

configuration d’une application

Eclipse

Liste des différentes configurations d’exécution

Page 24: Introduction à la conception de plug-ins

24Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Cet onglet fournit des indications sur l’application Eclipse à

exécuterLe répertoire Workspace

indique où seront stockés les fichiers liés au contexte

d’exécution

L’option « Clear » permet d’effectuer un nettoyage au

niveau du Workspace

Choix de l’application àexécuter pour tester le plug-in « plug-hype ». Dans notre cas il s’agit d’une version allégée

de l’IDE Eclipse

L’option Run an applicationsera choisie quand nous

développerons des applications Eclipse RCP

Page 25: Introduction à la conception de plug-ins

25Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Cet onglet fournit des indications sur les plug-ins qui seront

utilisés lors de l’exécution de l’application Eclipse

Le plug-in « plug-hype » est

ajouté dans l’application Eclipse

Ce nœud fournit tous les plug-ins du

workspace

Ce nœud contient tous les plug-ins de

la plateforme Eclipse (ceux

installés dans le répertoire plugins)

Tous les plug-ins peuvent être ajoutés

automatiquement via l’action AddRequired Plug-ins

Seuls les plug-ins « vitaux » de la

version allégée de l’IDE d’Eclipse doivent

être ajoutés

Il ne reste plus qu’à lancer l’exécution

Page 26: Introduction à la conception de plug-ins

26Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Cet onglet autorise l’enregistrement du fichier de configura-

tion d’exécution

Sélectionner l’option « Shared file »

Choisir un répertoire oùsauvegarder le fichier de configuration d’exécution

Après validation un fichier de

configuration d’exécution est créé

Page 27: Introduction à la conception de plug-ins

27Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

� Fichier de configuration d’exécution contenant toutes les

informations pour exécuter une application Eclipse

Si un fichier de configuration d’exécution est présent, la

configuration est automatiquement présentée dans le gestionnaire de

configuration

Informations relatives à la configuration d’exécution

Page 28: Introduction à la conception de plug-ins

28Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Tutoriel « plug-hype » : exécuter dans Eclipse

Le regroupement SampleCategory contient la vue

Plug-Hype

Cette vue est fournie par le plug-in Plug-Hype

Version allégée de l’IDE d’Eclipse

L’ouverture de la fenêtre qui regroupe toutes les vues est

obtenue par l’action Window -> Show View -> Other …

Possibilité d’ajouter une vue dans un

regroupement déjàexistant

Page 29: Introduction à la conception de plug-ins

29Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comStructure d’un plug-in : généralités

� Dans la suite de cette partie, nous présentons la syntaxe

des fichiers de configuration d’un plug-in

� L’objectif est d’en ressortir les principales options utilisées

par un plug-in

� Cette présentation sera réalisée sur la base des fichiers de

configuration et des interfaces associées fournies par PDE

� Trois fichiers de configuration

� MANISFEST.MF : informations générales concernant le fonction-

nement d’un plug-in et les différentes dépendances entre plug-ins

� plugin.xml : informations liées aux extensions et points d’extension

utilisés et fournis par un plug-in

� build.properties : informations liées au déploiement du plug-in

Page 30: Introduction à la conception de plug-ins

30Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : répertoires et fichiers

� Un plug-in possède une hiérarchie de répertoires et de

fichiers

src

plugin.xml

Plug-in

bin

icons

META-INF

build.properties

MANIFEST.MF Les informations générales d’un plug-in et ses dépendances avec les autres plug-ins

Icônes et images exploitées par le plug-in

Byte codes du plug-in

Sources Java du plug-in

Informations liées aux extensions et points d’extension utilisées par ce plug-in

Informations liées au déploiement

Autres fichiers supplémentaires

Racine d’un plug-in

lib *.jarDes bibliothèques dans

des archives Jar

Page 31: Introduction à la conception de plug-ins

31Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comStructure d’un plug-in : MANIFEST.MF

� Le fichier de configuration MANIFEST.MF décrit le fonction-nement d’un plug-in dont la spécification est fournie en partie par OSGi

� informations générales (nom, auteur, version, …)

� informations de dépendances avec les autres plug-ins

� Ce fichier existe depuis longtemps dans le monde Java pour décrire une archive Jar

� Il est possible de mixer les informations liées à l’archive Jar avec les informations liées au plug-in sous la conditionque ces dernières soient placées en seconde position

� Nous présentons dans la suite les principales entrées utiles pour le développeur de plug-in Eclipse

� Une description détaillée de toutes les entrées est disponible dans la spécification OSGi framework core

Page 32: Introduction à la conception de plug-ins

32Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comStructure d’un plug-in : MANIFEST.MF

Partie spécifique à l’archive Jar

Partie spécifique aux informations du plug-in

MANIFEST.MF du projet plughype

Généralement l’édition se fait par les vues fournies par PDE. Toutefois certaines options ne sont pas éditables via les vues PDE

Des entrées définies par la spécification

OSGi

Si vous éditez directement le fichier MANIFEST.MF, ne laissez pas de ligne

vide entre les options et laissez toujours une ligne vide à la fin

Page 33: Introduction à la conception de plug-ins

33Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comMANIFEST.MF : informations générales

� Bundle-ManifestVersion : précise la spécification que doit

suivre ce plug-in (ex : 2 pour la version 4 d’OSGi)

� Bundle-Name : nom du plug-in désignant l’objectif du

plug-in (ex : Plughype Plug-in)

� Bundle-Vendor : nom de l’organisme ou auteur qui a

développé le plug-in (ex : Mickael BARON)

� Bundle-Description : description rapide de l’objectif de ce

plug-in (ex : ce plug-in décrit une vue qui affiche …)

� Bundle-Copyright : copyright de ce plug-in

� Bundle-RequiredExecutionEnvironment : liste des

environnement d’exécution (J2SE 1.3 par exemple) obliga-

toires pour utiliser ce plug-in (ex : JavaSE-1.6)

Page 34: Introduction à la conception de plug-ins

34Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comMANIFEST.MF : informations générales

� Bundle-SymbolicName : identifiant unique pouvant être

suivi de l’option singleton (booléen)

� singleton : si true une seule version de ce plug-in est réalisée, si false

plusieurs versions

� Ex : Bundle-SymbolicName: eclipse.plugin.plughype; singleton:=true

� Bundle-Activator : nom de la classe utilisée pour démarrer

et arrêter le plug-in (ex : eclipse.plugin.plughype.Activator)

� Bundle-Version : précise la version du plug-in construite à

partir de trois numériques (major.minor.micro) et optionnel-

lement une chaîne pour la qualification (ex : 1.0.0.build=34)

� Eclipse-PlatformFilter : propre à Eclipse, information

permettant de contraindre l’utilisation d’un plug-in au niveau d’une plateforme cible (Windows, MAC OS X ou Linux)

Page 35: Introduction à la conception de plug-ins

35Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comMANIFEST.MF : informations générales

Bundle-SymbolicNameBundle-Version

Bundle-Name

� Vue du PDE relatif aux informations générales d’un plug-in

Bundle-Vendor

Bundle-Activator

Bundle-RequiredExecutationEnvironmentInformations générales placées dans l’onglet

Overview

Eclipse-PlatformFilter(information détaillée dans la partie Fragment & Feature)

Page 36: Introduction à la conception de plug-ins

36Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comMANIFEST.MF : informations générales

� Certaines informations d’un plug-in sont utilisées au niveau

de la vue qui affiche la liste complète des plug-ins

Boîte à propos accessible à partir de l’action About Eclipse SDK

Affiche quelques informations générales des plug-ins installées

Page 37: Introduction à la conception de plug-ins

37Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� Une application Eclipse est composée d’un ensemble de

plug-ins où chaque plug-in peut exploiter des classes

fournies par d’autres plug-ins

� Inversement un plug-in peut fournir des classes que d’autres

plug-ins pourront exploiter

� Le développement d’une application Eclipse est par

conséquent modulaire

� Un plug-in est réutilisable

� Le développement d’un plug-in est unitaire

� Nous présentons dans la suite les dépendances entre plug-in

via deux plug-ins

Page 38: Introduction à la conception de plug-ins

38Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� L’exemple présenté dans la suite est basé sur deux plug-ins

dont l’objectif est de sauvegarder et charger le contenu d’un

formulaire

� Le plug-in DependenciesExample fournit une vue avec

deux champs de texte

� Le plug-in ExportExample fournit un modèle de la vue et

exploite la librairie XStream pour sérialiser/désérialiser le

contenu du modèle

� Le plug-in ExportExample expose le package contenant les

classes servant à communiquer avec le modèle de la vue

� Le plug-in DependenciesExample à une relation de

dépendance avec ExportExample

Page 39: Introduction à la conception de plug-ins

39Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� Formalismes graphiques employés pour modéliser les inter-

connexions entre plug-ins

Nom du Plug-in

Les points d’extension fournis par le plug-in

Point 2

Point 1

Ext

1

Ext

2

Package Exp 2

Package Exp 1Package Imp 1

Package Imp 2

Les extensions associées à un autre

plug-in

Les packages, ou de manière plus fine les méthodes utilisées par

ce plug-in

Les extensions et les points d’extension seront détaillés dans la prochaine partie de ce chapitre

Le nom du plug-in

lib.jar

Singleton = true, …

Les packages, ou de manière plus fine les méthodes exportées

par ce plug-in

Différentes options utiles àla compréhension du

fonctionnement du plug-in

Page 40: Introduction à la conception de plug-ins

40Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� Schéma de dépendances de l’exemple

DependenciesExample

org.eclipse.ui

views

Persp

ective

ext.

……

org.eclipse.core.runtime

……

De nombreuses dépendances vers des plug-ins « bas niveaux »

ExportExampleLe plug-in

ExportExamplemet à disposition un package contenant

deux classes

Le plug-in core.runtime est le plug-in indispensable lors de toute création de nouveau plug-in

eclipse.plugin.exportexample

Le plug-in DependenciesExampleest associé à deux points d’extension fournis par le plug-in org.eclipse.ui

Le plug-in DependenciesExampledépend de trois plug-ins

xstream.jar

Package à exporter

Page 41: Introduction à la conception de plug-ins

41Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� Un plug-in doit inclure d’autres plug-ins à partir du moment

� les packages exportés par les autres plug-ins sont utilisés par ce

plug-in

� le plug-in définit des extensions à partir de points d’extension fournis

par les autres plug-ins

� Require-Bundle: liste des plug-ins à inclure. Les plug-ins

sont identifiés par leur nom symbolique (valeur définie par la

clé Bundle-SymbolicName)

� Exemple

Require-Bundle : org.eclipse.ui, org.eclipse.core.runtime,eclipse.plugin.ExportExample

MANIFEST.MF du projet DependenciesExample

Trois plug-ins sont requis pour les opérations du plug-in DependenciesExample

Page 42: Introduction à la conception de plug-ins

42Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� L’information Require-Bundle propose différentes options

� visibility

� si valeur private (par défaut), tous les packages exportés par le plug-in requis ne sont visibles qu’au niveau du plug-in qui effectue la dépendance�

� si valeur reexport, tous les packages exportés par le plug-in requis sont diffusés à tous les niveaux supérieurs

� Exemple : si le plug-in A requiert le plug-in B, et que le plug-in B

requiert le plug-in C dont la visibilité est reexport, alors le plug-in A

aura accès au contenu de C comme si A avait requis le plug-in C

� resolution

� si valeur mandatory (par défaut), le plug-in requis doit exister

� si valeur optional, le plug-in requis n’est pas utile au fonctionnement

du plug-in qui demande la dépendance

Page 43: Introduction à la conception de plug-ins

43Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

� bundle-version

� Cette option facultative permet de restreindre la dépendance d’un plug-in en fonction de son numéro de version

� La restriction peut s’effectuer soit par un numéro de version exacte soit par un intervalle entre une version minimum et maximum

� Syntaxe pour la définition d’un écart de version

� [min, max) : où min correspond à la version minimum et max la

version maximum

� [ = min est inclue dans l’écart, ( = min n’est pas inclue dans l’écart

� ] = max est inclue dans l’écart, ( = max n’est pas inclue dans l’écart

� Exemples

� [3.0.0, 3.1.0) nécessite un plug-in estampillé 3.0.x

� [3.3.0, 4.0.0) nécessite un plug-in estampillé 3.3.x

� 3.3.0 nécessite un plug-in estampillé 3.3.0

Page 44: Introduction à la conception de plug-ins

44Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations de dépendance

MANIFEST.MF du projet DependenciesExampleDépendances placées dans

l’onglet Dependencies

Liste des plug-ins requis

Ajouter une dépendance vers un plug-in

Supprimer une dépendance vers un plug-in déjà requis

Propriétés concernant la dépendance

Définition des contraintes (visibility, resolution et bundle-version)

Page 45: Introduction à la conception de plug-ins

45Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations d’exportation

� Export-Package : liste l’ensemble de packages qui seront

exportés par ce plug-in

� Les packages peuvent contenir les classes qui seront par

conséquent implicitement exportés

� Les sous packages ne sont pas exportés, il faut selon les besoins les ajouter dans la liste des packages à exporter

� Les principales options disponibles

� x-friends : spécifie les plug-ins autorisés à importer un package

donné

� Exemple Export-Package : eclipse.plugin.exportexample;

x-friends:="eclipse.plugin.DependenciesExample"

MANIFEST.MF du projet ExportExample

Le package exportexample est exporté et seul le plug-in DependenciesExample peut l’importer

Page 46: Introduction à la conception de plug-ins

46Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : informations d’exportation

Exportation de packages placée dans l’onglet Runtime

Le package eclipse.plugin.exportexample

est exporté

Possibilité de choisir les plug-ins

autorisés à utiliser le package exporté

Le plug-in DependenciesExampleest le seul plug-in àutiliser le package exportexample

Page 47: Introduction à la conception de plug-ins

47Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : exemple (dépendance + exportation)

� Exemple : plug-in ExportExample

Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: ExportExample Plug-inBundle-SymbolicName: eclipse.plugin.ExportExampleBundle-Version: 1.0.0Bundle-Activator: eclipse.plugin.exportexample.Acti vatorBundle-Vendor: Mickael BARONRequire-Bundle: org.eclipse.core.runtimeEclipse-LazyStart: trueExport-Package: eclipse.plugin.exportexample;versio n="1.0.0";

x-friends:="eclipse.plugin.DependenciesExample"Bundle-ClassPath: lib/xstream-1.3.jar, .

MANIFEST.MF du projet ExportExample

L’arborescence des fichiers et répertoires

du plug-in ExportExample

Seul le package eclipse.plugin.exportexample est public

Page 48: Introduction à la conception de plug-ins

48Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : exemple (dépendance + exportation)

� Exemple (suite) : plug-in ExportExamplepackage eclipse.plugin.exportexample;

public interface ISerializeName {String getName();

void setName(String pName);

String getDescription();

void setDescription(String pDescription);

void loadFromXML() throws FileNotFoundException;

void saveFromXML() throws FileNotFoundException;}

package eclipse.plugin.exportexample;

public class Activator extends Plugin {...

public ISerializeName getSerializeInstance() {return new SerializeName();

}}

ISerializeName.java du projet ExportExample

Activator.java du projet ExportExample

L’objet Activatorfournit une gestion du cycle de vie du plug-in

Cette interface fournit les services exposés

par le plug-in

Une méthode sert à créer une instance de ISerializeName ce qui permet de cacher l’implémentation

Page 49: Introduction à la conception de plug-ins

49Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : exemple (dépendance + exportation)

� Exemple (suite) : plug-in ExportExamplepackage eclipse.plugin.exportexample.internal

public class SerializeName implements ISerializeName {private String name = "";private String description = "";

public String getName() {return name;

}public void saveFromXML() throws FileNotFoundExceptio n {

XStream xstream = new XStream(new DomDriver()); FileOutputStream out = new FileOutputStream("serial. xml");xstream.toXML(this, out);

}public void loadFromXML() throws FileNotFoundExceptio n {

XStream xstream = new XStream(new DomDriver()); FileInputStream in = new FileInputStream("serial.xml ");SerializeName temp = (SerializeName)xstream.fromXML(i n);this.setName(temp.getName());this.setDescription(temp.getDescription());

}public void setName(String pName) {

this.name = pName; }public String getDescription() {

return description;}public void setDescription(String pDescription) {

this.description = pDescription;}

}

SerializeName.java du projet ExportExample

L’implémentation n’est pas public

La bibliothèque XStreampermet de sérialiser et dé-sérialiser le contenu de cet

objet

Page 50: Introduction à la conception de plug-ins

50Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : exemple (dépendance + exportation)

� Exemple : plug-in DependenciesExample

DependenciesView.java du projet DependenciesExample

L’action Sauvegarde appelle le service saveFromXML() du

plug-in ExportExample

L’action Chargement appelle le service loadFromXML() du

plug-in ExportExample

Un champ pour la saisie du Nom

Un champ pour la saisie de la description

Page 51: Introduction à la conception de plug-ins

51Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : exemple (dépendance + exportation)

� Exemple (suite) : plug-in DependenciesExamplepublic class DependenciesView extends ViewPart {

private ISerializeName currentSerializeFactory;

public DependenciesView() {currentSerializeFactory = Activator.getDefault().get SerializeInstance();

}

public void createPartControl(Composite parent) {...myLoadAction.addSelectionListener(new SelectionAdap ter() {

public void widgetSelected(SelectionEvent e) {try {

currentSerializeFactory.loadFromXML();} catch (FileNotFoundException e1) {

e1.printStackTrace();}myNameText.setText( currentSerializeFactory.getName() );myFillText.setText( currentSerializeFactory.getDescription() );

}});mySaveAction.addSelectionListener(new SelectionAdap ter() {

public void widgetSelected(SelectionEvent e) {...

}});

}

public void setFocus() {}

}

DependenciesView.java du projet DependenciesExample

Classe ViewPart permet de définir une vue par extension

Accès à l’instance ISerializeNamepar l’intermédiaire de la factory

fournie par le plug-in ExportExample

Page 52: Introduction à la conception de plug-ins

52Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

MANIFEST.MF : exemple (dépendance + exportation)

� Exemple (suite) : plug-in DependenciesExample

MANIFEST.MF du projet DependenciesExample

Le plug-in ExportExample est ajoutédans les dépendances de manière àintégrer la partie modèle dans l’IHM

Page 53: Introduction à la conception de plug-ins

53Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Dépendance vers une bibliothèque

� Certains plug-ins peuvent avoir besoin de s’appuyer sur des

bibliothèques tierces

� Plusieurs approches sont à envisager

1. Intégration de la bibliothèque dans le plug-in qui l’utilise

2. Transformation du JAR externe en plug-in qui deviendra ainsi un

containeur d’un plug-in

3. Création d’un plug-in qui regrouperait toutes les librairies tierces et

qui deviendra ainsi un repository de bibliothèques tierces

� Le choix de telle ou telle approche dépend de la fréquence

d’utilisation de la bibliothèque

� Nous présenterons chacune de ces approches via notre

exemple et la bibliothèque XStream

Page 54: Introduction à la conception de plug-ins

54Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comIntégration d’une librairie dans un plug-in

� Cette première approche permet d’intégrer les fichiers JAR

des bibliothèques directement dans le plug-in qui les utilise

� L’avantage de cette approche est de simplifier l’intégration

d’une bibliothèque

� En contrepartie, si la bibliothèque est utilisée dans plusieurs

plug-ins, il faudra dupliquer l’archive de la bibliothèque

� Le mode opérateur à réaliser est le suivant

� création d’un répertoire lib à la racine du plug-in

� copie des fichiers JAR dans le répertoire lib

� déclarer les fichiers JAR dans le classpath du plug-in

� L’entrée Bundle-ClassPath du fichier MANIFEST.MF est

utilisée pour renseigner toutes les librairies à ajouter dans le

classpath

Page 55: Introduction à la conception de plug-ins

55Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comIntégration d’une librairie dans un plug-in

Ajout de la bibliothèque XStream dans le classpath

du plug-in

La bibliothèque est automatiquement ajoutée

dans les propriétés du projet

L’entrée Bundle-ClassPath contient toutes les librairies à ajouter dans le classpath du plug-in ExportExample

N’oubliez de renseigner le répertoire courant « . » dans l’entrée Bundle-ClassPath

MANIFEST.MF du projet ExportExample

Page 56: Introduction à la conception de plug-ins

56Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� La deuxième approche consiste à placer dans un plug-in la librairie et d’exporter les packages nécessaires

� L’avantage est de considérer la librairie comme un plug-in et par conséquent si un plug-in a besoin d’utiliser la librairie, il dépendra directement du plug-in contenant la librairie

� En contrepartie, il peut être plus fastidieux de mettre à jour le contenu du plug-in « librairie » quand une nouvelle version de la librairie est disponible

� L’environnement de développement Eclipse fournit un Wizard permettant d’automatiser la transformation de la librairie en plug-in

� Le mode opérateur à réaliser est le suivant

� Utiliser l’assistant de transformation

� Ajouter la dépendance vers le plug-in librairie

Page 57: Introduction à la conception de plug-ins

57Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� Sélectionner à partir du menu Eclipse l’action File -> New ->

Other pour ouvrir la liste des assistants

Choisissez l’assistant Plug-in fromexisting JAR archives

Page 58: Introduction à la conception de plug-ins

58Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� Sélectionner les archives JAR à inclure dans le plug-in

Utiliser le bouton Add External …pour ajouter une archive JAR àpartir d’un chemin physique

Utiliser le bouton Add … pour ajouter une archive JAR déjà incluse

dans un plug-in

Page 59: Introduction à la conception de plug-ins

59Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� Saisir les informations pour créer le plug-in librairie

Le nom du plug-in correspond généralement au package utilisé

par la bibliothèque

En cochant cette option, les fichiers seront de la librairie sont extrait de

l’archive JAR

Page 60: Introduction à la conception de plug-ins

60Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

MANIFEST.MF du projet com.thoughworks.xstream

Tous les packages de la librairie sont automatiquement exportés,

possibilité d’intervenir manuellement pour en cacher

certains

� Les packages de la librairie sont exportés automatiquement

Page 61: Introduction à la conception de plug-ins

61Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� Au moment de l’exécution de l’action de désérialisation, un

exception est lancée

La classe SerializeName est introuvable

Page 62: Introduction à la conception de plug-ins

62Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� La librairie XStream a besoin de connaître le classpath de la

classe à désérialiser située dans le plug-in ExportExample

� Le plug-in ExportExample a déjà une dépendance vers le

plug-in librairie XStream

� Eclipse ne recommande pas les dépendances cycliques via le

mécanisme présenté précédemment

� Considérons pour la suite deux plug-ins A et B

� Si A a un dépendance vers B, B ne peut avoir de dépendance vers A

� Toutefois B a besoin d’accéder aux ressources (classes, images) de A

� Eclipse fournit un autre mécanisme permettant d’expliciter

cette dépendance en ajoutant des informations spécifiques à

la politique du classloading

Page 63: Introduction à la conception de plug-ins

63Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� Les informations à ajouter ne peuvent être réalisées via l’outil PDE, elles doivent être éditées directement dans le fichier MANIFEST.MF

� Dans le MANIFEST.MF du plug-in A préciser que le plug-in Bsouhaite accéder à ces ressources

� Eclipse-RegisterBuddy: eclipse.plugin.B

� Où eclipse.plugin.B désigne l’ID du plug-in B

� Dans le MANIFEST.MF du plug-in B préciser la politique du classloading

� Eclipse-BuddyPolicy: registred

� Dans le cas des plug-ins librairies, penser à ajouter systéma-tiquement la politique du classloading à registred

� A noter que le plug-in B a connaissance de tous les packages du plug-in A et pas uniquement ceux exportés

Page 64: Introduction à la conception de plug-ins

64Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comTransformation d’une librairie en plug-in

� Modification de la politique de chargement du classloading

du plug-in XStream MANIFEST.MF du projet com.thoughworks.xstream

MANIFEST.MF du projet ExportExample

Précise que le plug-in xstreamsouhaite accéder aux ressources du

plug-in ExportExample

Précise que le plug-in xstreampeut avoir accés à différents

classpath que le sien

Page 65: Introduction à la conception de plug-ins

65Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Plug-in repository de librairies

� La troisième approche consiste à intégrer dans un même plug-in toutes les librairies à utiliser

� Cela consiste à utiliser la deuxième approche est de multiplier le nombre de librairies à ajouter

� Toutes les librairies seront extraites des archives JAR

� Tous les packages seront automatiquement exportés par le plug-in

� Cette approche est à utiliser quand les librairies ont des intérêts communs et des fonctionnalités équivalents

� Essayer de regrouper logiquement les librairies quittes àcréer plusieurs plug-in repository

� Une solution est proposée par le projet Orbit qui permet d’automatiser la gestion des librairies www.eclipsecon/orbit

Page 66: Introduction à la conception de plug-ins

66Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : plugin.xml

� Le fichier plugin.xml permet la description des extensions et

des points d’extension d’un plug-in

� 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 d’un schéma XML

Nom du Plug-in

Les points d’extension fournis par le plug-in

Point 2

Point 1

Ext

1

Ext

2

……

Les extensions associées àun autre plug-in

Page 67: Introduction à la conception de plug-ins

67Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : plugin.xml

� L’extension est la réponse apportée à un point d’extension

� Pour tout point d’extension exploité par un plug-in une

extension est obligatoirement réalisée

� L’extension devra par conséquent respecter le schéma

imposé par le point d’extension

� La notion de registres d’extension est donc un autre moyen

pour communiquer entre plug-ins

La partie suivante présentera en détail la

notion de points d’extension et d’extension

Point d’extension défini par un plug-in

Extension qui respecte le schéma du point d’extension

Page 68: Introduction à la conception de plug-ins

68Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : plugin.xml

plugin.xml du projet DependenciesExample

Création des extensions via l’onglet Extensions

� Création des extensions via l’outil PDE

Un extension est réalisée via le point

d’extension org.eclipse.ui.views

Des informations sont à renseigner pour respecter le contrat fourni par

le point d’extension

Page 69: Introduction à la conception de plug-ins

69Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : plugin.xml

� Création des extensions directement via le fichier plugin.xml

Chaque extension doit respect le

schéma imposé par le point d’extension

Edition du fichier plugin.xml via l’onglet plugin.xml

plugin.xml du projet DependenciesExample

Page 70: Introduction à la conception de plug-ins

70Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : plugin.xml

� Création des points d’extension via l’outil PDE

Création des points d’extension via l’onglet Extensions Points

plugin.xml du projet DependenciesExample

Ce plug-in ne fournit pas de point d’extension

Page 71: Introduction à la conception de plug-ins

71Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comStructure d’un plug-in : build.properties

� Le mécanisme de Build du plug-in est dirigé par le fichier de

configuration build.properties formaté comme un fichier de

properties Java

� Ce fichier est généré par l’assistant de création de plug-ins et

contient toutes les informations sur la manière de compiler

les sources pour les transformer en JAR

� Les clés importantes du fichier

� source.<library> : liste les répertoires sources qui seront compilés

� output.<library> : liste les répertoires qui recevront le résultat de la

compilation

� bin.includes : liste les fichiers qui seront inclus dans la version

déployée du plug-in

Page 72: Introduction à la conception de plug-ins

72Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comStructure d’un plug-in : build.properties

Faites attention d’inclure (bin.includes) toutes les ressources nécessaire au bon fonctionnement

du plug-in (images, dll, …)

Pour chaque librairie du plug-in indiquer les répertoires sources

à compiler

Dans cet exemple seul les sources du plug-in sont compilés (noté « . »)

Pour chaque librairie du plug-in indiquer les répertoires qui recevront la compilation

Build.properties du projet ExportExample

Liste l’ensemble des fichiers qui seront inclus inclus dans

l’archive de déploiement du plug-in

� Exemple : build.properties du plug-in ExportExample

Page 73: Introduction à la conception de plug-ins

73Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comStructure d’un plug-in : build.properties

� Exemple (suite) : build.properties du plug-in ExportExample

bin.includes

sources..

Page 74: Introduction à la conception de plug-ins

74Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Déployer les plug-ins

� Quand le développement des plug-ins est terminé, les plug-ins peuvent être déployés

� De manière générale, pour chaque plug-in déployé, une archive JAR est générée

� Une fois les fichiers JAR générés, il suffit de copier les archives dans le répertoire plug-in de la version Eclipse qui doit accueillir ces nouveaux plug-ins

� La génération de la version à déployer s’appuie sur le fichier de configuration build.properties (voir précédemment)

� Dans le cas des applications Eclipse RCP (version standaloned’un plug-in), nous utiliserons la notion de product pour générer la version de déploiement

� L’environnement Eclipse fournit un assistant pour en générer une version « prête à l’emploi »

Page 75: Introduction à la conception de plug-ins

75Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Déployer les plug-ins

� Sélectionner à partir du menu Eclipse l’action File -> Export

pour ouvrir la liste des assistants liés à l’exportation

Choisir l’assistant Deployable plug-ins and

fragments

Page 76: Introduction à la conception de plug-ins

76Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Déployer les plug-ins

Choisir les plug-ins à déployer

Le résultat de la génération sera placé dans un répertoire

Le résultat de la génération sera placé dans une archive

Différentes options

Page 77: Introduction à la conception de plug-ins

77Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Déployer les plug-ins

Précise si les sources doivent être incluses

Précise si les packages doivent être archivés dans

des JAR

Remplace les chaînes « .qualifier »contenues dans build.properties par la valeur donnée du champ de texte

Génère également une tâche ANT relatif à cette

tâche d’exportation

Onglet Options

Onglet JAR Signing

Ensemble d’options pour signer un JAR

Un cours sur la signature des JARs est disponible à l’adresse mbaron.developpez.com/jws

Page 78: Introduction à la conception de plug-ins

78Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : Activator

� Un plug-in fournit une classe appelée Activator chargée de

� gérer le cycle de vie du plug-in lors de son utilisation

� gérer les ressources qui doivent être chargées au démarrage

du plug-in

� Un objet Activator est un sous type de la classe Plugin

� Le nom de la classe est définie par le fichier de configuration

MANIFEST.MF du plug-in au niveau de l’information

Bundle-Activator

� Un objet Activator n’est pas obligatoire, un objet de la

plateforme sera alors utilisé par défaut qui ignore les

requêtes liées au cycle de vie

� Dans la suite, nous étudierons les méthodes fournit par la

classe Plugin

Page 79: Introduction à la conception de plug-ins

79Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Le cycle de vie lors de l’utilisation du plug-in est géré par

� start(BundleContext context) throws Exception : déclenchée quand le

plug-in est chargé

� stop(BundleContext context) throws Exception : déclenchée quand le

plug-in est détruit

� La politique de chargement par défaut du plug-in est dite

Lazy-Loading, ce qui signifie que le plug-in est chargé quand

il doit être utilisé (utilisation d’un service par exemple)

� Si vous redéfinissez ces méthodes, rappeler obligatoirement

l’implémentation de la super classe

� Evitez également d’effectuer dans ces méthodes des traite-

ments couteux (mémoire et rapidité) qui pourraient ralentir

de le démarrage du plug-in

Page 80: Introduction à la conception de plug-ins

80Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Pour accéder facilement à l’instance d’un Activator utiliser le design pattern Singleton

� Le design pattern Singleton permet la création d’objets uniques dont il n’existe qu’une seule instance

� Principe général de mise en œuvre d’un Singleton

� A la création d’un « singleton » vérifier si il existe déjà une instance

� Si elle existe fournir l’instance, si elle n’existe pas création d’une instance

� Lors de la création de la classe Activator par l’outil PDE, une méthode static est générée automatiquement

� public static Activator getDefault() : retourne l’instance unique de l’objet Activator

� La mise en œuvre du singleton est obtenue par l’intermé-diaire de la méthode start appelée qu’une seule fois

Page 81: Introduction à la conception de plug-ins

81Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Nous présentons dans la suite un exemple qui permet de

montrer la politique de chargement via le « LazyLoading »

� Un nouveau plug-in appelé LazyLoadingExample fournit une

vue qui fait appel aux services fournit par ExportExample

� La vue de LazyLoadingExemple propose trois boutons

� Creation : demande une instance de type ISerializeName au plug-in

ExportExample. Il s’agit du premier appel à ExportExample, le plug-in est donc démarré

� Sauvegarde : demande de sauvegarde. Le bouton n’est activé que

si l’action Creation a été effectuée

� Chargement : demande de chargement. Le bouton n’est activé que

si l’action Creation a été effectuée

� Le plug-in ExportExample a été modifié pour notifier dans la

console le démarrage du plug-in

Page 82: Introduction à la conception de plug-ins

82Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Exemple : principe de LazyLoading d’un plug-in

Lors de l’appui sur le bouton Creation, le plug-in ExportExample est chargé, les boutons Sauvegarde et Chargementsont activés et le bouton Creation est

désactivé

Lors de l’appui sur le bouton Sauvegarde le sérialisation est réalisée

Page 83: Introduction à la conception de plug-ins

83Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Exemple (suite) : principe de LazyLoading d’un plug-in

package eclipse.plugin.exportexample;

public class Activator extends Plugin {...

public ISerializeName getSerializeInstance() {return new SerializeName();

}

public void start(BundleContext context) throws Except ion {super.start(context);plugin = this;System.out.println("Le Plug-In ExportExample est char gé");

}

public void stop(BundleContext context) throws Excepti on {plugin = null;super.stop(context);System.out.println("Le Plug-in ExportExample est arr été");

}

public static Activator getDefault() {return plugin

}}

Activator.java du projet ExportExample

Les méthodes start et stopont été décorées d’un

affichage vers la console pour avertir le démarrage

et l’arrêt du plug-in

Au moment du démarrage du plug-in (réalisé une seule fois) l’instance courante est

stockée

Méthode permettant d’accéder au singleton de l’objet Activator

Page 84: Introduction à la conception de plug-ins

84Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Exemple (suite) : principe de LazyLoading d’un plug-in package eclipse.plugin.lazyloadingexample;

public class LazyLoadingView extends ViewPart {public void createPartControl(Composite parent) {

...createButton.addSelectionListener(new SelectionAdap ter() {

public void widgetSelected(SelectionEvent e) {if (!isCreated) {

saveSerialization.setEnabled(true);loadSerialization.setEnabled(true);createButton.setEnabled(false);isCreated = true;currentSerializeFactory = Activator.getDefault().get SerializeInstance();

}}

});...saveSerialization.addSelectionListener(new Selectio nAdapter() {

public void widgetSelected(SelectionEvent e) {currentSerializeFactory.setName("LazyLoadingView");currentSerializeFactory.setDescription("This is a sa mple message");try {

currentSerializeFactory.saveFromXML();} catch (FileNotFoundException e1) { e1.printStackTr ace(); }

}});saveSerialization.setEnabled(false);

... // Suite dans le prochain transparent}

}

LazyLoadingView.java du projet LazyLoadingExample

Activation des boutons saveSerialization et

loadSerialization puis désactivation du bouton createButton

Utilisation de la classe Activatordu plug-in ExportExample qui

provoque le démarrage du plug-in ExportExample

Page 85: Introduction à la conception de plug-ins

85Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : cycle de vie

� Exemple (suite) : principe de LazyLoading d’un plug-in

package eclipse.plugin.lazyloadingexample;

public class LazyLoadingView extends ViewPart {public void createPartControl(Composite parent) {

... loadSerialization = new Button(parent, SWT.NONE);loadSerialization.addSelectionListener(new Selectio nAdapter() {

public void widgetSelected(SelectionEvent e) {try {

currentSerializeFactory.loadFromXML();} catch (FileNotFoundException e1) {

e1.printStackTrace();}System.out.println(currentSerializeFactory.toString ());

}});loadSerialization.setEnabled(false);

}}

A la construction les boutons saveSerialization et

loadSerialization sont désactivés

LazyLoadingView.java du projet LazyLoadingExample

Page 86: Introduction à la conception de plug-ins

86Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comActivator : informations sur le Bundle

� Possibilité d’accéder aux informations d’un objet Bundle (un plug-in du point de vue Eclipse)

� Bundle getBundle() : retourne le Bundle associé au plug-in

� Vous n’aurez généralement pas besoin d’utiliser directement les méthodes fournies par la classe Bundle

� Un objet Bundle fournit les informations suivantes

� long getBundleId() : identifiant unique attribué lors de l’installation dans le conteneur OSGi

� int getState() : état du Bundle (UNINSTALLED, INSTALLED, RESOLVED, STARTING, STOPPING, ACTIVE)

� String getSymbolicName() : nom symbolique du Bundle définit par l’entrée Bundle-SymbolicName

� Dictionary getHeaders() : informations de l’en-tête du MANIFEST

� Différentes méthodes qui pilotent le cycle de vie du Bundle (start, stop, uninstall, …)

Page 87: Introduction à la conception de plug-ins

87Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.comActivator : informations sur le Bundle

� Exemple : accéder aux informations du Bundle d’un plug-in

public class BundleExample extends ViewPart {

public void createPartControl(Composite parent) {...Button myBundleInformation = new Button(parent, SWT.N ONE);final Text myText = new Text(parent, SWT.WRAP);...

myBundleInformation.addSelectionListener(new Select ionAdapter() {public void widgetSelected(SelectionEvent e) {

Bundle bundle = Activator.getDefault().getBundle();long bundleId = bundle.getBundleId();String bundleState = "";switch (bundle.getState()) {

case Bundle.INSTALLED:bundleState = "INSTALLED";break;

...}String bundleSymbolicName = bundle.getSymbolicName() ;myText.append("Bundle ID : " + bundleId + "¥n");myText.append("Etat du bundle : " + bundleState + "¥ n");myText.append("Nom Symbolic : " + bundleSymbolicName + "¥n");

}});

}}

BundleExample.java du projet BundleExample

Page 88: Introduction à la conception de plug-ins

88Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Un Activator est également en charge de gérer implicitement

les préférences du plug-in associé

� Lors du démarrage du plug-in ces préférences sont chargées

� Lors de l’arrêt du plug-in ces préférences peuvent être sauvegardées

� Dans la seconde partie du cours JFace, une API pour les

préférences (IPreferenceStore) a été introduite

� Toutefois, la plateforme Eclipse préconise l’utilisation d’une

nouvelle API fondée sur les mêmes principes dans le cadre

du développement de plug-in

� Dans le cas du développement d’applications Java avec uniquement les APIs SWT/JFace l’utilisation de la classe IPreferenceStore est recommandée (réduction des dépendances)

Page 89: Introduction à la conception de plug-ins

89Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� La classe Preferences du package org.eclipse.core.runtime

fournit des méthodes semblables à celles fournit par

la classe IPreferenceStore

� boolean getBoolean(String name) … : des accesseurs sur des valeurs

de préférence par l’intermédiaire d’un nom

� boolean getDefaultBoolean(String name) … : des accesseurs sur les

valeurs par défaut au travers d’un nom

� void setValue(String name, boolean value) : des modifieurs sur les

valeurs au travers d’un nom et d’une valeur

� void setDefaultValue(String name, boolean value) : des modifieurs sur

les valeurs par défaut par l’intermédiaire d’un nom et d’une valeur

� store(OutputStream, String header) : sauvegarde explicite

� load(InputStream) : chargement explicite

Page 90: Introduction à la conception de plug-ins

90Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� La classe Activator de type Plugin fournit plusieurs méthodes

pour manipuler les préférences

� Preferences getPluginPreferences() : accesseur sur le gestionnaire de

préférences du plug-in

� savePluginPreferences() : sauvegarde des préférences

� Le chargement des préférences du plug-in est implicite, il est

assuré lors de l’appel à la méthode start() du plug-in

� La sauvegarde n’est pas automatique et la méthode

savePluginPreferences() doit être appelée

Page 91: Introduction à la conception de plug-ins

91Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Les préférences sont persistées dans un sous répertoire du répertoire workspace du contexte d’exécution

� workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/

� où workspace est le répertoire de travail d’une application Eclipse

� Le fichier de préférence est construit à partir du nom du

plug-in suivi de l’extension .prefs

� Exemple : eclipse.plugin.PreferenceExample.prefs pour un plug-in dont le nom est eclipse.plugin.PreferenceExample

� A noter que le répertoire org.eclipse.core.runtime est choisi

car il gère toutes les préférences de tous les plug-ins d’une application Eclipse

Si vous procédez à un « Clear » du workspace avant l’exécution de

l’application Eclipse, toutes les préférences seront supprimées

Page 92: Introduction à la conception de plug-ins

92Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Exemple : gestion des préférences dans un plug-in

Si le bouton Sauvegarde et Afficher est utilisé, Deux clés sont modifiées dans les préférences : NAME et

DESCRIPTION

Le fichier eclipse.plugin.PreferenceExample.prefs contient

les préférences pour le plug-in associé

Les valeurs sont disponibles pour le prochain chargement

Page 93: Introduction à la conception de plug-ins

93Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Exemple (suite) : gestion des préférences dans un plug-inpublic class PreferenceView extends ViewPart {

public void createPartControl(Composite parent) {... loadPreference.addSelectionListener(new SelectionAd apter() {

public void widgetSelected(SelectionEvent e) {loadPreferences();

}});savePreference.addSelectionListener(new SelectionAd apter() {

public void widgetSelected(SelectionEvent e) {Preferences preferences = Activator.getDefault().getP luginPreferences();preferences.setValue("NAME", "BARON Mickael");preferences.setValue("DESCRIPTION", "Ceci est une d escription donnée vers " +

Long.toString(System.currentTimeMillis()));Activator.getDefault().savePluginPreferences();loadPreferences();

}});

}

private void loadPreferences() {Preferences preferences = Activator.getDefault().getP luginPreferences();String name = preferences.getString("NAME");String description = preferences.getString("DESCRIP TION");displayPreferences.append(name + " ");displayPreferences.append(description);

}}

PreferenceView.java du projet PreferenceExample

Modifie les préférences et provoque une sauvegarde

Page 94: Introduction à la conception de plug-ins

94Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Dans le cas où le fichier de préférences n’existe pas, il peut

être intéressant de les initialiser avant utilisation

� La plateforme Eclipse fournit un point d’extension adapté àl’initialisation des préférences par défaut

� L’initialisation est donc obtenue via l’utilisation du point d’extension org.eclipse.core.runtime.preferences

� L’extension relative à ce point doit contribuer à détailler l’élément initializer

� L’élément initializer requiert l’utilisation d’une classe de type AbstractPreferenceInitializer

� Cette classe fournit une méthode pour initialiser

� void initializeDefaultPreferences() : appelée pour initialiser les préfé-rences par défaut

Page 95: Introduction à la conception de plug-ins

95Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Exemple : initialisation des préférences par défaut

plugin.xml du projet PreferenceExample

Pour ajouter une nouvelle extension à un point d’extension

Le cours suivant fournit des explications détaillées sur la manière de manipuler des extensions et des

points d’extension

Onglet Extensions pour définir des extensions

Page 96: Introduction à la conception de plug-ins

96Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Exemple (suite) : initialisation des préférences par défaut

Choisir le point d’extension org.eclipse.core.runtime.preferences

Une description du point d’extension est donnée pour expliquer son

objectif

Assistant disponible lors de l’ajout d’une nouvelle extension

Page 97: Introduction à la conception de plug-ins

97Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Exemple (suite) : initialisation des préférences par défaut

L’élément initializer requiert une classe de type

AbstractPreferenceInitializer

plugin.xml du projet PreferenceExampleOnglet Extensions pour

définir des extensions

Page 98: Introduction à la conception de plug-ins

98Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des préférences d’un plug-in

� Exemple (suite) : initialisation des préférences par défautpackage eclipse.plugin.preferenceexample;

public class PreferenceInitializer extends AbstractPreferenceInitializer {

public PreferenceInitializer() {}

public void initializeDefaultPreferences() {Preferences preferences = Activator.getDefault().getP luginPreferences();preferences.setDefault("NAME", "Default John");preferences.setDefault("DESCRIPTION", "Ceci est un nom par defaut");

}}

PreferenceInitializer.java du projet

PreferenceExample

Méthode à redéfinir dont le but est d’initialiser les préférences par défaut Cette classe fait partie de la

définition de l’extension

Dans le cas où le fichier de préférences n’existait, les préférences

par défaut sont chargées

Page 99: Introduction à la conception de plug-ins

99Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des Logs

� La classe Plugin fournit un mécanisme qui facilite l’accès à

un fichier de logs

� Le contenu des logs est localisé par défaut dans le fichier

.log placé dans le répertoire .metadata du workspace

� Si le répertoire workspace est à la racine du C, le fichier .log peut

être localisé dans c:\workspace\.metadata\.log

� Il s’agit d’un mécanisme propre à Eclipse et rien n’empêche

d’utiliser conjointement une librairie externe comme Log4j

� Plugin fournit la méthode

� ILog getLog() : accesseur sur l’interface permettant de gérer les logs

� L’interface ILog fournit entre autre une méthode

� void log(IStatus status) : l’objet Status est logué

Page 100: Introduction à la conception de plug-ins

100Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des Logs

� La notion d’objet IStatus a été définie dans le précédent

chapitre concernant les composants additionnels avec JFace

� Un objet IStatus est défini par les attributs suivants

� id du plugin : id du plugin associé à l’objet Status

� une sévérité (CANCEL, ERROR, INFO, OK, MESSAGE)

� code : code donné par le plugin

� un message : un message qui accompagne le status

� une exception : une exception liée au problème (peut être null)

� La classe Status est une implémentation par défaut

� Status(int severity, String pluginId, int code, String message,

Throwable exception)

Page 101: Introduction à la conception de plug-ins

101Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des Logs

� Exemple : utilisation du gestionnaire de Logs d’Eclipse

.log du workspace LogExample

LogView du projet LogExample

Lors de l’appui sur le bouton Action to log, un log est posté

dans le fichier .log

Page 102: Introduction à la conception de plug-ins

102Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des Logs

� Exemple (suite) : utilisation du gestionnaire de Logs d’Eclipse

public class Activator extends AbstractUIPlugin {...

public void start(BundleContext context) throws Except ion {super.start(context);plugin = this;this.getLog().log(new Status(IStatus.INFO, PLUGIN_I D, 0, "Le Plug-In LogExample vient de

demarrer", null));}

public void stop(BundleContext context) throws Excepti on {plugin = null;super.stop(context);this.getLog().log(new Status(IStatus.INFO, PLUGIN_I D, 0, "Le Plug-In LogExample vient de

s'arreter", null));}...

}

Activator.java du projet LogExample

Lors du démarrage du plug-in un log est posté

dans le fichier .log

Page 103: Introduction à la conception de plug-ins

103Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : gestion des Logs

� Exemple (suite) : utilisation du gestionnaire de Logs d’Eclipse

public class LogView extends ViewPart {

public LogView() {}

public void createPartControl(Composite parent) {parent.setLayout(new FillLayout());Button myCurrentButton = new Button(parent, SWT.FLAT) ;myCurrentButton.addSelectionListener(new SelectionA dapter() {

public void widgetSelected(SelectionEvent e) {Activator.getDefault().getLog().log(new Status(ISta tus.INFO, Activator.PLUGIN_ID,

0, "Action sur le Bouton a l'instant : " + System.c urrentTimeMillis(), null));}

});myCurrentButton.setText("Action to Log");

}

public void setFocus() {}

}

LogView.java du projet LogExample

Lors de l’appui sur le bouton « Action to log », un log est posté dans le fichier .log

Page 104: Introduction à la conception de plug-ins

104Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Activator : AbstractUIPlugin

� Dans le cas où le plug-in emploie des éléments de la couche

graphique, Activator hérite de la classe AbstractUIPlugin

� AbstractUIPlugin est une sous classe de la classe Plugin

(étudiée précédemment)

� Un objet AbstractUIPlugin fournit des fonctionnalités propres

à la gestion de ressources graphiques

� Registre pour les images

� Gestion des dialogues

� La classe AbstractUIPlugin fournit un second mécanisme de

gestion de préférences basé sur l’API JFace, préférez celle

fournie par la classe Plugin qui est plus récente

Page 105: Introduction à la conception de plug-ins

105Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

AbstractUIPlugin : ImageRegistry

� La classe AbstractUIPlugin fournit un registre pour la gestion efficaces des images

� Par défaut, l’objet ImageRegistry est initialisé au démarrage du plug-in, si besoin d’une nouvelle initialisation

� protected ImageRegistry createImageRegistry() : création d’un nou-veau registre d’images

� L’accès à un objet ImageRegistry est réalisé par

� public ImageRegistry getImageRegistry() : retourne le registre des images pour le plug-in donné

� La classe AbstractUIPlugin fournit également une méthode pour la création d’objets ImageDescriptor

� public static ImageDescriptor imageDescriptorFromPlugin(String pluginId, String imageFilePath) : création d’un ImageDescriptor

� Des informations sur ImageRegistry peuvent être trouvées dans la partie Composants additionnels avec JFace

Page 106: Introduction à la conception de plug-ins

106Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

AbstractUIPlugin : ImageRegistry

� Exemple : utilisation de l’ImageRegistry d’un plug-in

public class Activator extends AbstractUIPlugin {...public static final String SUPERSTAR = "SUPERSTAR";

public void start(BundleContext context) throws Except ion {super.start(context);plugin = this;

// Put the ImageDescriptors object into the current ima ges registry.ImageDescriptor superstarID = Activator.getImageDescr iptor("icons/superstar.jpg");this.getImageRegistry().put(SUPERSTAR, superstarID) ;

}

public static ImageDescriptor getImageDescriptor(Stri ng path) {return imageDescriptorFromPlugin(PLUGIN_ID, path);

}}

Activator.java du projet ImageRegistryExample

Méthode généré par l’assistant de création du plugin

Création d’un ImageDescriptor àpartir du chemin du plug-in

Ajout de l’ImageDescriptordans le registre d’images

Page 107: Introduction à la conception de plug-ins

107Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

AbstractUIPlugin : ImageRegistry

� Exemple (suite) : utilisation de l’ImageRegistry d’un plug-inpublic class ImageRegistryView extends ViewPart {

public void createPartControl(Composite parent) {parent.setLayout(new GridLayout(1, false));Label myImage = new Label(parent, SWT.NONE);GridData gd = new GridData(GridData.FILL_BOTH);myImage.setLayoutData(gd);

myImage.setImage(Activator.getDefault().getImageReg istry().get(Activator.SUPERSTAR));}

}

ImageRegistryView.java du projet ImageRegistryExample

Utilisation du registre d’images pour accéder à

une image

Page 108: Introduction à la conception de plug-ins

108Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Structure d’un plug-in : Platform

� La classe Platform est centrale à la plateforme d’exécution d’une application Eclipse

� Elle est donc transverse et fournit les caractéristiques principales liées aux plateformes

� Des registres des extensions

� Des logs

� Des informations relatives à l’environnement d’exécution

� Différentes autres informations, non étudiées dans ce cours

� Platform est une classe singleton et toutes les méthodes sont définies comme statiques

� Dans la suite, nous présentons les principales méthodes liées aux logs et aux informations de l’environnement d’exécution

� Concernant les registres des extensions, les méthodes seront étudiées dans la partie suivante

Page 109: Introduction à la conception de plug-ins

109Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : logs

� La classe Platform fournit une méthode pour s’abonner aux

envois de logs vers la plateforme Eclipse

� static void addLogListener(ILogListener listener) : abonnement aux

écouteurs de type ILogListener

� L’écouteur ILogListener fournit une méthode qui est déclen-

chée quand un log est envoyé vers la plateforme

� void logging(IStatus status, String plugin) : status contient les

informations transmises au log, plugin définit le nom du plug-in

émetteur du log

� Pour rappel, rien n’empêche d’utiliser conjointement une

librairie externe comme Log4j

Page 110: Introduction à la conception de plug-ins

110Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : logs

� Exemple : rediriger les Logs de la plateforme Eclipse

L’action « Creation d’un Log » poste un log vers la plateforme. L’écouteur ajouté à la

plateforme permet d’afficher le contenu du log

.log du workspacePlatformLogExample

Page 111: Introduction à la conception de plug-ins

111Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : logs

� Exemple (suite) : rediriger les Logs de la plateforme Eclipse

public class PlatformLog extends ViewPart {

public void createPartControl(Composite parent) {...Button myLogAction = new Button(parent, SWT.NONE);myLogAction.setText("Creation d'un Log");

final Text myText = new Text(parent, SWT.WRAP);

Platform.addLogListener(new ILogListener() {public void logging(IStatus status, String plugin) {

myText.append("Message envoyé : (" + status.getMessa ge() + ") par le plug-in : " + plugin);

}});

myLogAction.addSelectionListener(new SelectionAdapt er() {public void widgetSelected(SelectionEvent e) {

Activator.getDefault().getLog().log(new Status(IStatus.INFO, Activator.PLUGIN_ID, 0,"Action sur le Bouton a l'instant : " + System.curr entTimeMillis(), null));

}});

}}

PlatformLog.java du projet PlatformLogExample

Création d’un log

Abonnement à un écouteur de type ILogListener pour rediriger

le contenu des logs

Page 112: Introduction à la conception de plug-ins

112Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : informations de l’environnement d’exécution

� La classe Platform fournit des méthodes pour obtenir des informations sur la plateforme d’exécution

� String getNL() : locale en cours d’utilisation

� String getOS() : système d’exploitation utilisé

� String getOSArch() : l’architecture de la machine

� String getWS() : le type de version du système utilisé

� La classe Platform fournit également un ensemble de métho-des pour connaître les valeurs de certains chemins

� Location getUserLocation() : répertoire de travail de l’utilisateur

� Location getInstallLocation() : répertoire d’installation de l’application Eclipse en cours d’exécution

� Location getConfigurationLocation() : répertoire utilisé pour stocker la configuration d’exécution

� Location getInstanceLocation() : répertoire du workspace de l’application Eclipse en cours d’exécution

Page 113: Introduction à la conception de plug-ins

113Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : informations de l’environnement d’exécution

� Exemple : informations de l’environnement d’exécution

public class PlatformOS extends ViewPart {

public void createPartControl(Composite parent) {Button myOSInformation = new Button(parent, SWT.NONE) ;myOSInformation.setText("Informations sur l'OS");

final Text myText = new Text(parent, SWT.WRAP);

myOSInformation.addSelectionListener(new SelectionA dapter() {public void widgetSelected(SelectionEvent e) {

myText.append( Platform.getNL() + "\n");myText.append( Platform.getOS() + "\n");myText.append( Platform.getOSArch() + "\n");myText.append( Platform.getWS() + "\n");myText.append("Repertoire utilisateur : " +

Platform.getUserLocation() .getURL().toString());myText.append("Repertoire d'installation : " +

Platform.getInstallLocation() .getURL().toString());myText.append("Repertoire du workspace : " +

Platform.getInstanceLocation() .getURL().toString());}

});}

}

PlatformOS.java du projet PlatformOSExample

Affichage des informations liées à l’environnement

d’exécution

Page 114: Introduction à la conception de plug-ins

114Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : informations de l’environnement d’exécution

� La classe Platform fournit des méthodes pour obtenir les

arguments passées en paramètres lors de l’exécution de

une application Eclipse

� String[] getApplicationArgs() : retourne tous les arguments non

consommés par la plateforme Eclipse

� String[] getCommandLineArgs() : retourne tous les arguments même

ceux consommés par la plateforme Eclipse

� Un argument est désigné comme une chaîne de caractères

sans espace

� Exemple : -test option1=alpha (correspond à deux arguments)

� En général, si vous souhaitez ajouter des options spécifiques

à votre application Eclipse utiliser la méthode

getApplicationArgs()

Page 115: Introduction à la conception de plug-ins

115Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Platform : informations de l’environnement d’exécution

� Exemple : extraire les arguments passés en paramètres

public class PlatformCommandParams extends ViewPart {

public void createPartControl(Composite parent) {...Button myParameterAction = new Button(parent, SWT.NON E);myParameterAction.setText("Informations Parametre Co mmandes");final Text myText = new Text(parent, SWT.WRAP);

myParameterAction.addSelectionListener(new Selectio nAdapter() {public void widgetSelected(SelectionEvent e) {

String[] applicationArgs = Platform.getApplicationArgs() ;myText.append("Application Args" + "\n");for (int i = 0; i < applicationArgs.length; i++) {

myText.append(applicationArgs[i].toString() + "\n") ;}

myText.append("\n\n" + "CommandLine Args" + "\n");String[] commandArgs = Platform.getCommandLineArgs() ;for (int i = 0; i < commandArgs.length; i++) {

myText.append(commandArgs[i].toString() + "¥n");}

}});

}}

PlatformCommandParams.java du projet PlatformCommandParamsExample

Deux arguments ont été ajoutés-test et -name=BARON_MICKAEL

Page 116: Introduction à la conception de plug-ins

116Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Bilan …

� Nous avons étudié …

� Une introduction à OSGi

� Le développement par l’exemple d’un plug-in simple

� Le contenu des fichiers de configuration (MANIFEST.MF, plugin.xml,

build.properties)

� La description des classes Activator et Platform

� Nous n’avons pas étudiés, prochainement dans ce cours

� L’internationalisation des plug-ins

� Prochaine étape : Extensions et Points d’extension

� Etudier plus en détail la notion d’extensions et de points d’extension

� Définir un point d’extension via un schéma XSD

� Définir une extension et respecter le schéma

Page 117: Introduction à la conception de plug-ins

117Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Glossaire Eclipse

� Bundle ou plug-in : un bundle est un composant qui possède un

cycle de vie et qui expose et importe des services. Sous Eclipse le

composant est appelé plug-in

� Extension : l’extension est la réponse apportée à un point d’extension

Il doit respecter un schéma imposé par le point d’extension

� IHM : acronyme qui a une signification différente selon s’il est singulier

ou pas : au singulier, il signifie le domaine de l’Interaction Homme-

Machine, au pluriel, il signifie les Interfaces Homme-Machine

� LazyLoading : qui désigne la politique de chargement d’un plug-in.

Le plug-in est chargé dans le conteneur OSGi quand il doit être utilisé

� MANIFEST.MF : fichier de configuration qui décrit le fonctionnement

d’une archive Jar. La spécification OSGi enrichie sa description en ajoutant

des descriptions générales (nom, auteur, version) et des descriptions de

dépendances avec les autres plug-ins

Page 118: Introduction à la conception de plug-ins

118Intro. Conc. Plug-in - M. Baron - Page

keul

keul

.blo

gspo

t.com

Glossaire Eclipse

� PDE : Plug-in Development Environment est un ensemble d’outils

fournit par l’environnement Eclipse pour faciliter le développement des

plug-ins

� perspective : regroupement cohérent de vues (views) et d’actions

spécifiques à une tâche de l’utilisateur (coder du Java, débuguer, …)

� plugin.xml : un fichier de configuration au format XML qui décrit les

extensions et les points d’extension utilisés et fournis par un plug-in

� point d’extension : un point d’extension décrit un contrat qui stipule la manière dont des interfaces et des classes d’un plug-in doivent

être utilisées par d’autres plug-ins. Le contrat est décrit au travers un schéma XML

� product : configuration utilisée pour la génération d’une version exécutable de l’application Eclipse (les plug-ins dépendants, les

arguments pour l’exécution de l’application, les icônes, le splashscreen)

Page 119: Introduction à la conception de plug-ins

119Intro. Conc. Plug-in - 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 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