Définition d'un point d'extension

Lorsque vous voulez permettre à d'autres plug-in d'étendre ou de personnaliser les fonctions de votre plug-in, vous devez définir un point d'extension. En matière d'extensions, la première démarche pour cette définition consiste à ajouter des marques au fichier plugin.xml de votre plug-in. Voici un exemple :

   <?xml version="1.0" ?>
   <plugin
      name="Simple Extension Point Plugin" 
      id="org.eclipse.sample"
      version="1.0">
      <runtime>
         <library name="extpt.jar" />
      </runtime>
      <extension-point
         name="Sample Extension Point"
         id="sampleExtensionPoint"/>
   </plugin>

La procédure est donc assez simple. La structure des extensions se connectant à ce point d'extension n'est pas interprétée par la plateforme ; vous pouvez à la place suivre un schéma défini par le fournisseur du point d'extension. Une condition toutefois : les marques d'extension doivent être exprimées en XML valide. Une fois votre point d'extension défini, vous pouvez interroger le registre du plug-in de la plateforme au moment de l'exécution pour demander et traiter des extensions existantes. Pendant l'exécution, les extensions se présentent sous forme d'objets IExtension. Elles sont composées d'une arborescence d'objets IConfigurationElement, (un par élément dans les marques d'extension.) Le fragment de code suivant interroge le registre du plug-in pour rechercher des extensions associées au point d'extension défini auparavant.

   IPluginRegistry registry = Platform.getPluginRegistry();
   IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint");
   if (point != null) {
      IExtension[] extensions = point.getExtensions();
      System.out.println("Found " + extensions.length + " extensions");
   }

Dans des cas de figure simples, l'unique interaction entre un point d'extension et ses extensions est intégrée aux marques d'extension. L'extension peut fournir des données ou des paramètres de préférences directement dans le code XML des marques ; le plug-in du point d'extension lit et traite ensuite ces informations pour offrir un comportement personnalisé.

Interaction avec le code dans une extension

Dans le cas de points d'extension plus avancés, vous pouvez au moment de l'exécution interagir avec des objets définis par l'extension. Le principe est que le plug-in définissant le point d'extension ne connaît aucun nom de classe et de package. Il doit donc définie une interface pour décrire la structure de classes attendue. Il peut ensuite instancier les classes dans le plug-in de l'extension à l'aide de IExecutableExtension, et utiliser l'interface pour interagir avec l'objet au moment de l'exécution.

A titre d'exemple, le fragment de code suivant issu d'un fichier plugin.xml définit une extension s'intégrant dans le point d'extension exemple créé auparavant :

   <extension
      name="Sample Extension"
      id="myExtension"
      point="org.eclipse.sample.sampleExtensionPoint">
         <someObject>
            <run class="org.eclipse.examples.SomeClass"/>
         </someObject>
   </extension>

Cette extension comprend des marques pour une extension exécutable, y compris le nom de la classe à instancier. Cette classe doit correspondre à une interface définie par le plug-in à l'origine du point d'extension. Comme expliqué auparavant, les noms des balises dans cet exemple ("someObject" et "run") sont arbitraires. Ces balises seront déterminées par le schéma du point d'extension.

Pour cet exemple, imaginez que l'interface d'une extension exécutable se nomme ISomeInterface. Le fragment de code suivant dans le plug-in du point d'extension interrogera le registre du plug-in et instanciera toutes les extensions exécutables pour le point d'extension "sampleExtensionPoint" :

   IPluginRegistry registry = Platform.getPluginRegistry();
   IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint");
   IExtension[] extensions = point.getExtensions();
   for (int i = 0; i < extensions.length; i++) {
      IConfigurationElement[] elements = extensions[i].getConfigurationElements();
      for (int j = 0; j < elements.length; j++) {
         if ("someObject".equals(elements[j].getName())) {
            ISomeInterface object = (ISomeInterface)elements[j].createExecutableExtension("run");
            System.out.println("Found an executable extension: " + object);
         }
      }
   }

C'est tout ! Pour en savoir plus, consultez le javadoc du package org.eclipse.core.runtime ou observez le point d'extension défini dans le readme (reportez-vous au document Examples Guide pour des instructions d'installation.) Comme exemple parfait, observez les points d'extension définis par la plateforme Eclipse.

Copyright IBM Corporation and others 2000, 2003.