Dynamické moduly plug-in umožňují vkládání a odebírání modulů plug-in do/ze spuštěných instancí Eclipse. Jako znovupoužitelná komponenta s možností uvolnit se poskytují dynamické moduly plug-in snadný způsob, jak vám pomohou sledovat příchod a chování modulů plug-in.
Dynamický modul plug-in nepřetrvává celou dobu činnosti aplikace, a proto je zapotřebí při likvidaci komponenty zajistit úklid veškerých součástí. Pokud jsou listenery zapojeny do pracovní plochy a jsou registrovány položky, které jsou uchovány i po vypnutí, tyto moduly plug-in musejí být schopny úklidu.
Začátečnický předpoklad, že přečtení všech implementací bodu rozšíření postačí k provozování aplikace, je chybný - takto to bohužel nefunguje. Musíte zajistit zapojení listeneru nebo vyprázdnění mezipamětí tak, aby mohly být sledovány změny registru. Mějte na zřeteli, že položky v pracovní ploše nemusejí být statické, ve skutečnosti jsou vždy pouze dočasné a nemusejí se zobrazovat neustále. Pokud píšete modul plug-in pro určitý pohled, nejprve se ujistěte, zda je tento pohled skutečně ještě na daném místě.
Jako vývojář modulů plug-in musíte zajistit, aby veškerá rozšíření bylo možné kdykoli zapínat a vypínat. Poté co zmizí, byste měli potvrdit jejich zmizení vyčištěním příslušných vnitřních struktur rozšíření a artefaktů uživatelského rozhraní používaných odebíranými prvky. Po jejich zobrazení byste měli rozšířit své vnitřní struktury a podle potřeby vytvořit nové artefakty uživatelského rozhraní. Předpokládejme, že vaše aplikace čte z registru a že má určité rozšíření; vytvoříte její záznam a přiřadíte jí umístění. Po použití byste měli být upozorněni na požadovaný úklid. Kromě tohoto listener rozpoznává moment vytvoření nových položek a vytváří je.
org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker a přidružená rozhraní poskytují mechanizmus, díky němuž mohou vývojáři modulů plug-in snadno sledovat vznikání a zanikání rozšíření a spravovat prostředky generované takovýmito činnostmi.
Následující příklad předpokládá, že máte ve svém modulu plug-in bod rozšíření s názvem widgets a že používáte IExtensionTracker. Interně máte WidgetDescriptors, který zapouzdřuje rozšíření widget a WidgetRegistry za účelem jejich správy.
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();
// úvodní naplnění
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) { // logika obsluhy registru } 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) { // logika obsluhy registru }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }
V tomto příkladu uživatelské rozhraní platformy poskytuje instance IExtensionTracker na různých úrovních pracovní plochy. Pokud sledujete objekty přetrvávající po celou dobu aktivity pracovní plochy, můžete použít sledovač poskytovaný metodou IWorkbench.getExtensionTracker(). Pokud vaše objekty příslušejí k určitým oknům nebo stránkám pracovní plochy, měli byste použít sledovače poskytované metodou IWorkbenchWindow.getExtensionTracker() nebo IWorkbenchPage.getExtensionTracker(). Pracovní plocha například sleduje popisovače pohledů na úrovni pracovní plochy, avšak instance aktuálního pohledu sleduje na úrovni stránky pracovní plochy. Vaše popisovače mohou být registrovány v konkrétních bodech rozšíření poskytnutím instance IFilter metodě IExtensionTracker.registerHandler(). Váš popisovač bude volán pouze při přidávání nebo odebírání rozšíření, která odpovídají objektu IFilter.
K volání této metody dochází při vstupu rozšíření do zpracování. Váš popisovač má v takovém momentu příležitost zahrnout nové rozšíření do svého přidruženého modelu. Všechny objekty vytvořené na základěIExtension a poskytnuté tomuto rozhraní by měly být registrovány sledovačem s použitím IExtensionTracker.registerObject(). K volání této metody dochází poté, co rozšíření opustí zpracování. Veškeré objekty registrované rozšířením budou předány jako argumenty. Váš popisovač poté může vyčistit a zlikvidovat objekty dle potřeby. Je dobrým zvykem rušit registraci svých popisovačů tak, aby záznamy zbytečně neobsazovaly paměť.