Met behulp van dynamische plugins is het mogelijk plugins in te voegen in en te verwijderen uit een Eclipse-instance die wordt uitgevoerd. Als opnieuw te gebruiken componenten die uit het geheugen kunnen worden verwijderd, bieden dynamische plugins een gemakkelijke manier om u te helpen bij het volgen van het komen en gaan van de plugins.
Het is mogelijk dat een dynamische plugin niet blijft gedurende de hele levensduur van de toepassing. Daarom is het essentieel dat u erop let dat wanneer de component wordt verwijderd, alles wordt opgeschoond. Wanneer de listeners ingang hebben tot de Workbench en de items geregistreerd zijn, blijven deze nadat afgesloten is zodat deze door de plugins moeten worden verwijderd.
De veronderstelling dat, bij het opstarten een leesbewerking door alle implementaties van het extensiepunt voldoende zou zijn voor de levensduur van de toepassing, is niet correct. Dit werkt niet. U moet controleren of de listener een ingang heeft, of dat er niets in cache is opgeslagen, zodat registerwijzigingen worden opgevangen. Het is belangrijk dat u beseft dat de items in de workbench niet per se statisch zijn. In feite zijn deze tijdelijk en kunnen zij op elk moment vertrekken. Als u een plugin schrijft voor een specifieke view, moet u eerst controleren of de view nog steeds aanwezig is.
Als pluginontwikkelaar moet u controleren of het voor de extensies die u gebruikt, is toegestaan op ieder moment te verschijnen of te verdwijnen. Wanneer deze extensies verdwijnen, moet u deze verdwijning erkennen door de interne structuren te verwijderen die de extensies vertegenwoordigen en de eventuele gebruikersinterface-artefacten die door de extensies worden aangedreven te wissen. Wanneer deze verschijnen, voorziet u de interne structuren van argumenten en maakt eventueel nieuwe gebruikersinterface-artefacten. Stel dat uw toepassing vanaf het register een leesbewerking uitvoert en een extensie heeft, u een record ervoor maakt en de locatie toewijst. Na afloop krijgt u de melding dat een opschoonactie vereist is. Bovendien wordt door de listener aangekondigd wanneer nieuwe items binnenkomen en dat deze worden gemaakt.
De org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker en de bijbehorende interfaces leveren een mechanisme waarmee pluginontwikkelaars op eenvoudige wijze het komen en gaan van de extensies kunnen volgen en de resources kunnen beheren die door deze acties worden gegenereerd.
In het volgende voorbeeld wordt verondersteld dat u een extensiepunt hebt in uw plugin met de naam widgets en dat u IExtensionTracker gebruikt. Intern hebt u WidgetDescriptors die de widgetextensies inpakken en een WidgetRegistry om deze te beheren.
public class WidgetRegistry implements IExtensionChangeHandler { public WidgetRegistry() { IExtensionTracker tracker = PlatformUI.getWorkbench() .getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("mijn.plugin.naamruimte", "widget");
IExtension[] extensions = point.getExtensions();
// eerste invulling
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) { // registerspecifieke logica } 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) { // registerspecifieke logica }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }
In dit voorbeeld worden door de Platform-gebruikersinterface op verschillende niveaus van de Workbench IExtensionTracker-instances geleverd. Als u objecten volgt die bestaan gedurende de levensduur van de workbench, moet u de tracker gebruiken die wordt geleverd door de IWorkbench.getExtensionTracker(). Als u objecten gebruikt die relevant zijn voor bepaalde workbenchvensters of -pagina's, moet u de trackers gebruiken die door IWorkbenchWindow.getExtensionTracker() of IWorkbenchPage.getExtensionTracker() worden geleverd. Een workbench volgt bijvoorbeeld viewdescriptors op Workbenchniveau maar volgt de huidige viewinstances op het niveau van de workbenchpagina. Uw afhandelingsroutines kunnen worden geregistreerd in relatie tot bepaalde extensiepunten via het leveren van een IFilter-instance aan IExtensionTracker.registerHandler(). Uw afhandelingsroutine wordt alleen aangeroepen als de extensies die overeenkomen met het IFilter-object worden toegevoegd of verwijderd.
Als een extensie de runtime ingaat, wordt deze methode aangeroepen. De afhandelingsroutine kan nu de nieuwe extensie opnemen in het bijbehorende model. De objecten die worden gemaakt op basis van de IExtension die aan deze interface is geleverd, moeten worden geregistreerd aan de hand van de tracker door middel van IExtensionTracker.registerObject(). Als een extensie de runtime verlaat, wordt deze methode aangeroepen. De objecten die eerder zijn geregistreerd als extensie, worden nu doorgegeven als argumenten. Uw afhandelingsroutine wist de objecten waar nodig en verwijdert deze. Het is verstandig de registratie van uw afhandelingsroutines ongedaan te maken, zodat uw registers geen gegevens lekken.