Mikaël Marche
Ce chapitre présente l'architecture à plugins de Salomé TMF suivant le framework JPF.
Cette initialisation est effectuée par la méthode "startJPF" de la classe JPFManager se trouvant dans le package org.objectweb.salome_tmf.plugins. Afin d'initialiser les paramètres nécessaires à JFP, un fichier "properties" est utilisé. Ce fichier est nommé "CfgPlugins.properties" et se trouve dans le sous répertoire "plugins" du répertoire d'installation de Salomé TMF. Il contient le nom du répertoire qui abrite les plugins, la liste des plugins présents ainsi que d'autres paramètres utilisés par le système de trace (log4j).
Une fois ces paramètres initialisés, on crée une table de hachage qui contient autant d'éléments que de plugins, chaque élément ayant la forme suivante :
// Pamameters for PluginManager StringTokenizer PluginsFolders = new StringTokenizer( props.getProperty(PARAM_PLUGINS_FOLDERS), ",", false); Map pluginLocations = new HashMap(); for (; PluginsFolders.hasMoreTokens();) { String currentPlgFolder = appliRoot + PluginsFolders.nextToken().trim(); StringTokenizer PluginsList = new StringTokenizer( props.getProperty(PARAM_PLUGINS_LIST), ",", false); for (; PluginsList.hasMoreTokens();) { String currentPlg = currentPlgFolder + "/" + PluginsList.nextToken().trim(); try { pluginLocations.put(new URL(currentPlg + "/plugin.xml"), new URL(currentPlg)); } catch(Exception e) { e.printStackTrace(); } } } // New instance of PluginManager PluginManager pluginManager = PluginManager.createStandardManager(pluginLocations);
<plugin id="core" version="0.0.1" class="org.objectweb.salome_tmf.plugins.core.CorePlugin">
Cette entête spécifie l'identificateur du plugin, sa version ainsi que sa classe principale. La deuxième partie du fichier manifest est sous la forme suivante :
<runtime> <library id="core" path="core/core.jar" type="code"> <export prefix="*"/> </library> </runtime>Cette partie spécifie que le plugin utilise une librairie (core.jar) qui se trouve dans le répertoire "core" (lui-même se trouvant dans le répertoire qui contient les plugins), et que cette librairie est du type "code". Il est également précisé dans cette partie que toutes les classes et packages (*) de ce plugin sont visibles pour les autres plugins qui peuvent par conséquent les utiliser.
La troisième et dernière partie de ce fichier est celle qui est la plus intéressante car elle offre à l'application la possibilité d'être extensible. Il s'agit de la définition des points d'extension du plugin core, c'est-à-dire la manière avec laquelle d'autres plugins peuvent étendre celui-ci. Il n'y pas de restriction sur le nombre de points d'extension pour un plugin.
Cette partie se présente ainsi :
<extension-point id="Common"> <parameter-def id="class"/> <parameter-def id="name"/> <parameter-def id="description" multiplicity="none-or-one"/> </extension-point>Ici, un point d'extension nommé "Common" est défini. Il est également précisé que tout plugin qui est extension de ce point doit valoriser trois paramètres :
Comme pour les points d'extension, il n'y a pas de restriction sur le nombre de paramètres que l'on peut associer à un point d'extension.
Ensuite, pour chaque point d'extension, une méthode implémentée dans la classe principale du plugin core (org.objectweb.salome_tmf.plugins.core.CorePlugin) permet de récupérer ce point d'extension sous forme d'un objet de type "ExtensionPoint". Voici le code qui effectue ces tâches (source : méthode "startJPF" de la classe org.objectweb.salome_tmf.plugins.JPFManager) :
// Running the "core" plugin Plugin corePlugin = pluginManager.getPlugin("core"); if (corePlugin == null) { throw new Exception("can't get plug-in core"); } // Extension points initialization ExtensionPoint Common = (ExtensionPoint)corePlugin.getClass().getMethod ( "getCommonExtPoint", new Class[] {}).invoke(corePlugin, new Object[] {});
L'architecture à plugins de Salomé TMF propose ce point d'extension dans le but de fournir une interface générique qui peut être utilisée par la plupart des plugins (sauf dans le cas de plugins spécifiques; plugins pour l'exécution automatique des tests par exemple).
Cette interface est divisée en deux parties. La première a pour objet les fonctionnalités du plugin qui seront mises dans les menus "Outils" pour les suites de test, les campagnes de test et la gestion de données. La capture d'écran en Figure 2.1 montre un exemple de fonctionnalités de plugins dans un de ces trois menus.
La deuxième partie de l'interface Common concerne le reste des composants graphiques de Salomé TMF utilisés par le plugin. En effet, le plugin doit spécifier les composants Salomé qu'il utilise ou dans lesquels il rajoute des fonctionnalités, et dans le dernier cas il doit implémenter la manière avec laquelle ses fonctionnalités doivent être intégrées à Salomé.
Salomé TMF propose une multitude de ses composants graphiques exploitables par des plugins, c'est l'objet de la section 2.3.3.
A chacun de ces composants est associée une constante 2.1.Ainsi, le plugin fournit à l'application Salomé TMF la liste des constantes correspondant aux composants graphiques utilisés, et dans Salomé TMF on active le plugin dans ces objets graphiques selon leur type (statique ou dynamique) via les fonctions : activatePluginInStaticComponent() et activatePluginInDynamicComponent().
![]() ![]() |
![]() ![]() |
![]() ![]() |
Afin d'illustrer le développement d'un plugin de type Common par un exemple, nous allons détailler le développement du plugin "Bugzilla", plugin ayant pour but d'offrir des fonctionnalités de gestion de bug dans Salomé TMF en utilisant le bugtracker Bugzilla2.16.
~ <?xml version="1.0" ?> <!DOCTYPE plugin PUBLIC "-//JPF//Manifest 0.2" "http://jpf.sourceforge.net/plugin_0_2.dtd"> <plugin id="bugzilla" version="0.0.1" class="salomeTMF_plug.bugzilla.BugzillaPlugin"> <requires> <import plugin-id="core"/> </requires> <runtime> <library id="Bugzilla" path="bugzilla/bugzilla.jar" type="code"/> </runtime> <extension plugin-id="core" point-id="Common" id="bugzilla.Common"> <parameter id="class" value="salomeTMF_plug.bugzilla.BugzillaPlugin"/> <parameter id="name" value="Bugzilla"/> <parameter id="description" value="Plugin Bugzilla"/> </extension> </pluginLa première partie du fichier (après l'entête) précise le nom du plugin, sa version et la classe principale qui étend la classe Plugin.
Ensuite, dans la balise "requires", le plugin déclare le ou les plugins dont la présence est nécessaire pour son activation. Ici, il s'agit du plugin core, puisque le pluing Bugzilla utilise le point d'extension Common.
Dans la balise "runtime", le plugin déclare la liste des librairies utilisées, ainsi que leurs types.
La dernière partie du fichier (balise "extension") précise les informations relatives aux points d'extensions utilisés : plugin fournissant le point d'extension, nom du point d'extension, ainsi que les paramètres spécifiques au point d'extension.
Les fonctions principales de cette classe se composent en deux parties :
~ public Vector getUsedUIComponents() { Vector uiComponentsUsed = new Vector(); uiComponentsUsed.add(0,UICompCst.MANUAL_EXECUTION_BUTTONS_PANEL); uiComponentsUsed.add(1,UICompCst.ATTACHMENTS_BUTTONS_PANEL); [?] return uiComponentsUsed; }
~ public void activatePluginInStaticComponent(Integer uiCompCst) { if (uiCompCst == UICompCst.DATA_MANAGEMENT_ENV_TABLE) { environmentTable = (JTable)SalomeTMF.getUIComponent(uiCompCst); return; } if (uiCompCst == [?]) { [?] } [?] }
This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.71)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 1 -no_navigation -dir ../.././src/docs/html/fr/ -no_footnode fr/developer/dev_plug-ins.tex
The translation was initiated by on 2006-05-19