Dynamische Plug-ins

Dynamische Plug-ins bieten die Möglichkeit, Plug-ins in einer laufenden Instanz von Eclipse einzufügen und zu entfernen. Als eine wieder verwendbare Komponente mit der Möglichkeit, entfernt zu werden, stellen dynamische Plug-ins eine einfache Methode dar, um Ihnen das Kommen und Gehen von Plug-ins zu verfolgen.

Ein dynamisches Plug-in muss nicht als solches für die gesamte Dauer der Anwendung erhalten bleiben und es ist wichtig sicherzustellen, dass beim Verschwinden der Komponente alles bereinigt wird. Wenn Listener-Funktionen an die Workbench angebunden werden und Elemente registriert werden, so verbleiben sie dort nach dem Abschalten, und diese Plug-ins müssen wissen, dass sie bereinigt werden müssen.

Die Annahme, dass beim Start eine Überprüfung aller Implementierungen des Erweiterungspunkts ausreichend für die Funktion der Anwendung ist, ist falsch, da dies nicht funktioniert. Sie müssen sicherstellen, dass entweder die Listener-Funktion angebunden ist oder dass nie etwas eingelöst wird, so dass Änderungen in der Registrierungsdatenbank überwacht werden. Es ist wichtig zu verstehen, dass Elemente in der Workbench nicht unbedingt statisch sind; tatsächlich sind sie flüchtig und können jederzeit verschwinden. Wenn Sie ein Plug-in für eine bestimmte Ansicht schreiben, vergewissern Sie sich zuerst, dass diese Ansicht noch vorhanden ist.

Als Plug-in-Entwickler müssen Sie sicherstellen, dass alle Erweiterungen, die sie vielleicht anwenden, an jedem Punkt erscheinen und verschwinden können. Wenn Sie verschwinden, sollten Sie ihr Verschwinden dadurch bestätigen, dass Sie alle internen Strukturen, die die Erweiterungen darstellen, bereinigen und alle Benutzerschnittstellen-Artefakte, die sie steuern, entfernen. Wenn sie erscheinen, sollten Sie ihre internen Strukturen erweitern und möglicherweise neue Benutzerschnittstellen-Artefakte erstellen. Nehmen wir an, dass Ihre Anwendung aus der Registrierungsdatenbank liest und eine Erweiterung hat, Sie einen Eintrag dafür erstellen und ihr eine Position zuordnen. Nach der Beendigung würden Sie benachrichtigt, dass eine Bereinigung erforderlich ist. Weiterhin kündigt eine Listener-Funktion an, wenn neue Elemente hereinkommen und sie erstellen.

Die 'org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker' und zugehörigen Schnittstellen stellen einen Mechanismus zur Verfügung, durch den Plug-in-Entwickler einfach das Kommen und Gehen von Erweiterungen nachfverfolgen und die durch solche Aktionen generierten Ressourcen verwalten können.

Das folgende Beispiel geht davon aus, dass Sie einen Erweiterungspunkt in ihrem Plug-in namens 'widget' haben und dass Sie 'IExtensionTracker' verwenden. Intern haben Sie WidgetDescriptors (Deskriptoren für Fensterobjekte), die Fensterobjekterweiterungen einbinden und eine Fensterobjekt-Registry, um sie zu verwalten.



	public class WidgetRegistry implements IExtensionChangeHandler {

	
	
	  public WidgetRegistry() {
		
		IExtensionTracker tracker = PlatformUI.getWorkbench()
	
  	.getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("my.plugin.namespace", "widget");
IExtension[] extensions = point.getExtensions();
// initial population
for (int i = 0; i < extensions.length; i++) { addExtension(tracker, extensions[i]);
} tracker
.registerHandler(this, tracker
.createExtensionPointFilter(point)); } public void addExtension(IExtensionTracker tracker, IExtension extension){ WidgetDescriptor descriptor = new WidgetDescriptor(extension); tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG); addToInternalStructure(descriptor) } private void addToInternalStructure(WidgetDescriptor descriptor) { // registry specific logic } public void removeExtension(IExtension extension, Object[] objects) { for (int i = 0; i < objects.length; i++) { WidgetDescriptor descriptor = (WidgetDescriptor) objects[i];
removeFromInternalStructure(descriptor);
}
} private void removeFromInternalStructure(WidgetDescriptor descriptor) { // registry specific logic }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }

In diesem Beispiel stellt die Plattform-Benutzerschnittstelle 'IExtensionTracker'-Exemplare auf verschiedenen Ebenen der Workbench zur Verfügung. Wenn Sie Objekte überwachen, die für die Lebensdauer der Workbench vorhanden sind, sollten Sie die durch 'IWorkbench.getExtensionTracker()' zur Verfügung gesteltle Protokollfunktion verwenden. Wenn Ihre Objekte für bestimmte Workbench-Fenster oder -Seiten relevant sind, sollten Sie die Protokollfunktionen verwenden, die durch 'IWorkbenchWindow.getExtensionTracker()' oder 'IWorkbenchPage.getExtensionTracker()' zur Verfügung gestellt werden. Zum Beispiel überwacht die Workbench Deskriptoren für Ansichten auf der Workbench-Ebene aber tatsächliche Ansichtsexemplare auf der Workbench-Seiten-Ebene. Ihre Steuerroutinen können gegen bestimmte Erweiterungspunkte durch Bereitstellen eines IFilter-Exemplars für 'IExtensionTracker.registerHandler()' registriert werden. Ihre Steuerroutine wird nur aufgerufen, wenn Erweiterungen, die dem IFilter-Objekt entsprechen, hinzugefügt oder entfernt werden.

Wenn eine Erweiterung die Laufzeit eingibt, wird diese Methode aufgerufen. Ihre Steuerroutine hat dann die Möglichkeit, die neue Erweiterung in ihr zugeordnetes Modell zu integrieren. Alle Objekte, die auf Basis der dieser Schnittstelle zur Verfügung gestellten 'IExtension' erstellt worden sind, sollten gegen diese Protokollfunktion über 'IExtensionTracker.registerObject()' registriert werden. Wenn eine Erweiterung die Laufzeit verlässt, wird diese Methode aufgerufen. Alle zuvor gegen die Erweiterung registrierten Objekte werden als Argumente übermittelt. Ihre Steuerroutine kann dann bereinigen und die Objekte, wie erforderlich, entfernen. Es ist sinnvoll, die Registrierung Ihrer Steuerroutinen zurücknehmen, so dass Ihre Registries keine Fehlerstellen enthalten.