Dynamiske plugin-moduler gjør det mulig å sette inn og fjerne plugin-moduler i en Eclipse-forekomst som kjører. Dynamiske plugin-moduler er komponenter som kan fjernes og brukes på nytt og som på en enkel måte hjelper deg med å spore nye og utgående plugin-moduler.
En dynamisk plugin-modul varer kanskje ikke ut applikasjonens levetid, og derfor er det viktig at alt ryddes bort når komponenten fjernes. Lyttere som tilknyttes arbeidsbenken og elementer som registreres, blir ikke automatisk fjernet etter avslutning og må fjernes av plugin-modulene.
Antakelsen om at en gjennomlesing av alle implementeringene av utvidelsespunktet ved oppstart er tilstrekkelig for applikasjonens levetid, er feil. Det vil ikke fungere. Forsikre deg om at lytteren er tilknyttet eller at ingen ting bufres, slik at det lyttes etter registerendringer. Det er viktig å være klar over at elementer i arbeidsbenken ikke nødvendigvis er statiske, men derimot midlertidige og kan forsvinne når som helst. Hvis du skriver en plugin-modul for en bestemt visning, må du først forsikre deg om at visningen fortsatt er der.
Som plugin-utvikler må du forsikre deg om at utvidelsene du bruker, når som helst kan vises og bli borte. Når de blir borte, bekrefter du dette ved å rydde i den interne strukturen som representerer utvidelsene og fjerner eventuelle grensesnittartefakter som de driver. Når de vises, forsterker du den interne strukturen og oppretter eventuelt nye grensesnittartefakter. Anta at applikasjonen leser fra registeret og har en utvidelse, og opprett en post for den og tilordne en plassering. Når den er ferdig, får du beskjed om at det er på tide å rydde opp. I tillegg vil en lytter annonsere når nye elementer kommer inn og oppretter dem.
Grensesnittet org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker og tilknyttede grensesnitt inneholder en mekanisme som gjør det enkelt for utviklere av plugin-moduler å spore nye og utgående utvidelser og håndtere ressursene som genereres av slike handlinger.
I følgende eksempel forutsettes det at du har et utvidelsespunkt i plugin-modulen som heter widgeter, og at du bruker IExtensionTracker. Internt har du WidgetDescriptors som innkapsler widget-utvidelser og en WidgetRegistry som styrer dem.
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)
} }
I dette eksempelet inneholder plattformgrensesnittet ExtensionTracker-forekomster på ulike nivåer i arbeidsbenken. Hvis du sporer objekter som finnes i hele levetiden til arbeidsbenken, bruker du sporeren (tracker) fra IWorkbench.getExtensionTracker(). Hvis objektene er relevante for bestemte arbeidsbenkvinduer eller -sider, kan du bruke sporerene som oppgis av IWorkbenchWindow.getExtensionTracker() eller IWorkbenchPage.getExtensionTracker(). For eksempel sporer arbeidsbenken visningsdeskriptorer på arbeidsbenknivå, men faktiske visningsforekomster på sidenivå i arbeidsbenken. Behandlerene kan være registrert mot bestemte utvidelsespunkter gjennom å oppgi en IFilter-forekomst til IExtensionTracker.registerHandler(). Behandleren kalles bare når utvidelser som samsvarer med IFilter-objektet, legges til eller fjernes.
Når en utvidelse kommer inn i kjøretiden, kalles denne metoden. Behandleren har da mulighet til å innlemme den nye utvidelsen til den tilknyttede modellen. Objekter som er opprettet på bakgrunn av IExtension som er oppgitt i dette grensesnittet, må registreres mot sporeren via IExtensionTracker.registerObject(). Denne metoden kalles når en utvidelse forlater kjøretiden. Objekter som er registrert mot utvidelsen, overføres som argumenter. Behandleren kan deretter rydde opp og fjerne objektene ved behov. Det er lurt å avregistrere behandlerene slik at det ikke oppstår lekkasje i registrene.