Dynaamisten lisäosien avulla Eclipsen käynnissä olevaan ilmentymään voi lisätä tai siitä voi poistaa lisäosia. Dynaamiset lisäosat ovat uudelleen käytettäviä komponentteja, jotka voi poistaa, minkä ansiosta niillä on helppo jäljittää lisäosien lisäyksiä ja poistoja.
Dynaaminen lisäosa ei välttämättä säily sellaisenaan voimassa koko sovelluksen käyttöaikaa. On siis erittäin tärkeää varmistaa, että kaikki puhdistetaan komponentin poistuessa. Kun kuuntelutoimintoja kiinnitetään työympäristöön ja alkioita rekisteröidään, ne säilyvät työympäristössä sulkemisen jälkeenkin. Kyseisten lisäosien on tiedettävä, että niiden täytyy suorittaa puhdistus.
Oletus, että kaikkien laajennuspisteen toteutusten läpiluku aloituksen yhteydessä riittää koko sovelluksen käyttöajaksi, on väärä. On varmistettava, että kuuntelutoiminto on kiinnittynyt tai että mitään ei missään vaiheessa ladata välimuistiin. Näin rekisterin muutoksia kuunnellaan. On tärkeää ymmärtää, että työympäristön alkiot eivät ole välttämättä staattisia vaan itse asiassa väliaikaisia ja että ne voivat poistua milloin tahansa. Jos kirjoitat lisäosaa tietylle näkymälle, varmista ensin, että näkymä on yhä olemassa.
Lisäosia kehitettäessä on varmistettava, että käytettävien laajennusten sallitaan ilmaantua ja poistua missä kohdassa tahansa. Kun laajennukset poistuvat, niiden poistumiseen tulee reagoida puhdistamalla niitä mahdollisesti edustavat sisäiset rakenteet ja poistaa niiden mahdollisesti ajamat käyttöliittymän artefaktit. Niiden ilmaantuessa tulee lisätä sisäisiä rakenteita ja mahdollisesti luoda uusia käyttöliittymän artefakteja. Jos sovellus, jolla on laajennus, lukee rekisteriä, sille luodaan tietue ja määritetään sen sijainti. Sen päättyessä annetaan ilmoitus, että puhdistus on pakollinen. Lisäksi kuuntelutoiminto ilmoittaa uusien alkioiden sisääntulosta ja luo uudet alkiot.
Rajapinta org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker ja siihen liitetyt rajapinnat toimittavat mekanismin, jonka avulla lisäosakehittäjät voivat helposti jäljittää laajennusten lisäyksiä ja poistoja ja hallita kyseisten toimintojen luomia resursseja.
Seuraavassa esimerkissä oletetaan, että lisäosassa on laajennuspiste nimeltään widgets ja että siinä käytetään rajapintaa IExtensionTracker. Sisäisesti oletetaan olevan WidgetDescriptor-luokkia, jotka sisältävät widget-laajennuksia, ja WidgetRegistry-luokka, joka ohjaa niitä.
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();
// alkujoukko
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) { // rekisterikohtaista logiikkaa } 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) { // rekisterikohtaista logiikkaa }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }
Kyseisessä esimerkissä ympäristön käyttöliittymä toimittaa IExtensionTracker-ilmentymiä eri työympäristön tasoilla. Jos jäljität kohteita, jotka ovat voimassa koko työympäristön käyttöajan, sinun tulee käyttää IWorkbench.getExtensionTracker()-metodin toimittamaa jäljitysohjelmaa. Jos kohteet liittyvät tiettyihin työympäristön ikkunoihin tai sivuihin, sinun tulee käyttää metodin IWorkbenchWindow.getExtensionTracker() tai IWorkbenchPage.getExtensionTracker() toimittamia jäljitysohjelmia. Työympäristö jäljittää näkymäkuvaajia työympäristön tasolla, mutta todellisia näkymän ilmentymiä työympäristön sivun tasolla. Omat käsittelytoiminnot voidaan rekisteröidä tietyille laajennuspisteille toimittamalla rajapinta IFilter ilmentymämetodille IExtensionTracker.registerHandler(). Käsittelytoiminto kutsutaan vain, kun IFilter-objektia vastaavia laajennuksia lisätään tai poistetaan.
Kun laajennus siirtyy ajonaikaiseen ympäristöön, kyseinen metodi kutsutaan. Käsittelytoiminnolla on tuolloin tilaisuus lisätä uusi laajennus siihen liitettyyn malliin. Kaikki kyseiseen rajapintaan toimitetun IExtension-rajapinnan perusteella luodut objektit tulee rekisteröidä jäljitysohjelmaan metodin IExtensionTracker.registerObject() kautta. Kun laajennus poistuu ajonaikaisesta ympäristöstä, kyseinen metodi kutsutaan. Kyseiseen laajennukseen aiemmin rekisteröidyt objektit välitetään argumentteina. Tämän jälkeen käsittelytoiminto voi suorittaa puhdistuksen ja poistaa objektit tarvittaessa. Hyvän käytännön mukaista on poistaa käsittelytoimintojen rekisteröinti, jotta rekisterit eivät vuoda.