Definizione di un punto di estensione

Se si desidera consentire ad altri plug-in di estendere o personalizzare la funzionalità del proprio plug-in, è necessario definire un punto di estensione. Come con le estensioni, il primo passo per definire un punto di estensione consiste nell'aggiungere dei tag al file plugin.xml del plug-in. Di seguito viene riportato un esempio:

   <?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>

Questo è tutto quello che occorre fare per definire il proprio punto di estensione. La struttura delle estensioni che si connettono a questo punto di estensione non viene interpretata dalla piattaforma, ma deve seguire uno schema definito dal fornitore di punti di estensione. L'unica restrizione consiste nel fatto che il tag di estensione deve essere un elemento XML valido. Una volta definito un punto di estensione, è possibile interrogare il registro dei plug-in della piattaforma durante il run-time per interrogare ed elaborare tutte le eventuali estensioni esistenti. Durante il run-time, le estensioni vengono presentate come oggetti IExtension. Le estensioni a loro volta sono costituite da una struttura di oggetti IConfigurationElement, uno per ciascun elemento del tag di estensione. Il seguente frammento di codice interroga il registro dei plug-in per individuare eventuali estensioni associate al punto di estensione definito in precedenza.

   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");
   }

Nei casi più semplici, l'unica interazione tra un punto di estensione e le sue estensioni è contenuta nel tag di estensione. L'estensione può fornire alcuni dati o impostazioni delle preferenze direttamente all'interno dell'XML del tag di estensione e il plug-in del punto di estensione quindi legge ed elabora tali informazioni per offrire un comportamento personalizzato.

Interazione con il codice in un'estensione

Con punti di estensione più avanzati, è possibile interagire durante il run-time con gli oggetti definiti dall'estensione. In questo caso il problema è che il plug-in che definisce il punto di estensione non ha informazioni sui nomi delle classi e dei pacchetti dell'estensione e deve definire un'interfaccia per descrivere la struttura di classi prevista. Dopodiché, può creare istanze delle classi nel plug-in dell'estensione utilizzando un IExecutableExtension, e utilizzare l'interfaccia per interagire con l'oggetto durante il run-time.

Per eseguire il concetto con un esempio, il frammento che segue tratto da un fileplugin.xml definisce un'estensione che si aggancia al punto di estensione di esempio descritto in precedenza:

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

Questa estensione include il tag per un'estensione eseguibile che include il nome della classe di cui si deve creare l'istanza. La classe deve essere conforme a un'interfaccia definita dal plug-in che ha definito il punto di estensione. Come è stato detto in precedenza, i nomi dei tag di questo esempio ("someObject" e "run") sono arbitrari. I tag saranno definiti dallo schema del punto di estensione.

Per questo esempio, l'interfaccia dell'estensione eseguibile si chiamerà ISomeInterface. Il frammento di codice che segue nel plug-in del punto di estensione eseguirà una query nel registro del plug-in ed eseguirà l'istanza di tutte le estensioni eseguibili per il punto di estensione "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);
         }
      }
   }

Non occorre altro. Per ulteriori informazioni, ricercare nella javadoc il pacchetto org.eclipse.core.runtime o esaminare il punto di estensione definito nello strumento readme (per istruzioni di installazione, vedere Guida agli esempi). L'esempio migliore è quello dei punti di estensione definiti dalla piattaforma Eclipse stessa.

Copyright IBM Corporation e altri 2000, 2003.