Dynamiske plugins stiller muligheden for at indsætte og fjerne plugins i en igangværende forekomst af Eclipse til rådighed. Dynamiske plugins, som er en genanvendelige komponent, hvis installation kan fjernes, stiller en nem måde til rådighed for sporing af de plugins, der tilføjes og dem, der slettes.
En dynamisk plugin eksisterer muligvis ikke lige så længe som programmet, men det er vigtigt at sikre sig, at alt ryddes op, når komponent forsvinder. Når lyttere er hægtet på arbejdsbænken, og elementer registreres, forbliver de der efter nedlukning, og disse plugins skal være opmærksomme på, at der skal ryddes op.
Den antagelse, at en gennemlæsning af alle implementeringerne af udvidelsespunkter ved start vil være nok for programmets levetid, er usand, da det vil ikke fungere. Du skal sikre dig, at lytteren er hægtet på, eller at ingenting caches, så der lyttes efter registreringsdatabaseændringer. Det er vigtigt at forstå, at elementerne på arbejdsbænken ikke nødvendigvis er statiske, de er faktisk midlertidige og kan forsvinde til enhver tid. Hvis du skriver en plugin til en bestemt oversigt, skal du først sikre dig, at oversigten stadig er der.
Som plugin-udvikler skal du sikre dig, at alle de udvidelser, du muligvis vil bruge, har tilladelse til at blive vist og forsvinde igen på et givet tidspunkt. Når de forsvinder, skal du acceptere det ved at rydde op i eventuelle interne strukturer, der repræsenterer udvidelserne, og fjerne eventuelle grænsefladeartefakter, som de udfører. Når de vises, skal du forhøje de interne strukturer og muligvis oprette nye grænsefladeartefakter. Antag, at programmet læser fra registreringsdatabasen og har en udvidelse. Du opretter en record til den og tildeler dens placering. Ved afslutning underrettes du om, at en oprydning er påkrævet. Desuden annoncerer en lytter, hvornår nye elementer er på vej ind og opretter dem.
org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker og tilknyttede grænsefalder stiller en mekanisme til rådighed, hvorved plugin-udviklere nemt kan spore udvidelserne dukken op og forsvinden og styre de ressourcer, der genereres ved sådanne funktioner.
I følgende eksempel antages det, at du har et udvidelsespunkt i din plugin, som hedder widgets, og at du bruger IExtensionTracker. Internt har du WidgetDescriptors, der indkapsler widget-udvidelser, 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();
// første udfyldning
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) { // registreringsdatabasespecifik logik } 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) { // registreringsdatabasespecifik logik }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }
I dette eksempel stiller platformens grænseflade IExtensionTracker-forekomster til rådighed på forskellige niveauer af arbejdsbænken. Hvis du sporer objekter, der lever lige så længe som arbejdsbænken, skal du bruge den tracker, som IWorkbench.getExtensionTracker() stiller til rådighed. Hvis objekterne er relevante for bestemte arbejdsbænkvinduer eller -sider, skal du bruge de trackere, som IWorkbenchWindow.getExtensionTracker() eller IWorkbenchPage.getExtensionTracker() stiller til rådighed. Arbejdsbænken sporer f.eks. oversigtsbeskrivelser på arbejdsbænkniveau, men sporer de faktiske oversigtsforekomster på arbejdsbænksideniveau. Behandlerne er muligvis registreret mod bestemte udvidelsespunkter via levering af en IFilter- forekomst til IExtensionTracker.registerHandler(). Behandleren kaldes kun, når de udvidelser, der svarer til IFilter-objektet, tilføjes eller fjernes.
Når en udvidelse træder ind i runtime, kaldes denne metode. Referencen har så mulighed for at inddrage den nye udvidelse i dens tilknyttede model. Alle objekter, der er oprettet på basis af den IExtension, og som er stillet til rådighed for denne grænseflade, skal registreres mod trackeren via IExtensionTracker.registerObject(). Når en udvidelse forlader runtime, kaldes denne metode. Alle objekter, der tidligere er registreret mod udvidelsen overføres som argumenter. Behandleren kan derefter rydde op og kassere objekterne efter behov. Det er en god idé at afregistrere behandlere, så registreringsdatabaserne ikke "lækkes".