Dinamikus bedolgozók

A dinamikus bedolgozók a bedolgozók Eclipse futó példányába beszúrásának és abból eltávolításának képességét biztosítják. A dinamikus bedolgozók egyszerű módszert biztosítanak a bedolgozók mozgásának nyomkövetésére, egy újra felhasználható komponenst, amely eltávolítható a memóriából.

Egy dinamikus bedolgozó nem feltétlenül marad meg az alkalmazás élete végéig, emiatt lényeges annak biztosítása, hogy amikor a komponens már nem él, minden kerüljön eltakarításra. Amikor figyelők csatlakoznak a munkaterülethez és az elemek bejegyzettek, akkor azok a leállítás után is ott maradnak. Ezen bedolgozóknak tudniuk kell, hogy el kell őket takarítani.

Az a feltételezés hamis, hogy az indításkor a kiterjesztési pont összes megvalósításán keresztüli olvasás elegendő lesz az alkalmazás életéhez, mert ez nem fog működni. Biztosítania kell, hogy a figyelő csatlakoztatva legyen, vagy soha semmi nem kerüljön beváltásra ahhoz, hogy a nyilvántartás változásai megfigyelésre kerüljenek. Fontos megérteni, hogy a munkaterületen lévő elemek nem feltétlenül statikusak, valójában ideiglenesek és bármikor eltávozhatnak. Ha egy adott nézethez ír bedolgozót, akkor először győződjön meg róla, hogy a nézet még ott van-e.

Bedolgozófejlesztőként biztosítania kell, hogy a felhasználni kívánt kiterjesztések megjelenhessenek és eltűnhessenek bármely adott ponton. Amikor eltűnnek, akkor nyugtáznia kell az eltűnésüket az olyan belső szerkezetek eltakarításával, amelyek a kiterjesztéseket képviselhetik, és el kell távolítania minden UI műterméket, amelyeket meghajtanak. Amikor megjelennek, akkor ki kell egészítenie a belső szerkezetet és esetleg létre kell hoznia új UI műtermékeket. Azt feltételezve, hogy az alkalmazás a nyilvántartásból olvas és rendelkezik egy kiterjesztéssel, egy rekordot kell létrehozni számára és hozzá kell rendelni a helyéhez. Ennek következtében értesítést kapna arról, hogy takarításra van szükség. Továbbá egy figyelő jelezni fogja, ha új elemek érkeznek be és létre fogja hozni azokat.

Az org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker és a hozzá tartozó felületek egy mechanizmust biztosítanak, amellyel a bedolgozófejlesztők egyszerűen nyomon követhetik a kiterjesztések érkezését és távozását, valamint kezelhetik az ilyen műveletek által előállított erőforrásokat.

Az alábbi példa azt feltételezi, hogy rendelkezik egy kiterjesztési ponttal a widget nevű bedolgozóban és, hogy IExtensionTracker felületet használ. Belül rendelkezik egy WidgetDescriptors elemmel, amely magába foglalja a widget kiterjesztéseket, és egy WidgetRegistry elemmel ezek kezeléséhez.



	public class WidgetRegistry implements IExtensionChangeHandler {

	
	
	  public WidgetRegistry() {
		
		IExtensionTracker tracker = PlatformUI.getWorkbench()
	
  	.getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("sajat.bedolgozo.nevter", "widget");
IExtension[] extensions = point.getExtensions();
// kezdeti populáció
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) { // nyilvántartás működése } 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) { // nyilvántartás működése }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }

Ebben a példában a platform UI IExtensionTracker példányokat biztosít a munkaterület különféle szintjein. Ha olyan objektumokat követ nyomon, amelyek a munkaterület élete alatt léteznek, akkor az IWorkbench.getExtensionTracker() által biztosított nyomkövetőt kell használnia. Ha az objektumok adott munkaterület-ablakokkal vagy -oldalakkal kapcsolatosak, akkor az IWorkbenchWindow.getExtensionTracker() vagy az IWorkbenchPage.getExtensionTracker() által biztosított nyomkövetőket kell használnia. Például a munkaterület a nézetleírókat a munkaterület szintjén, azonban a tényleges nézetpéldányokat a munkaterület oldal szintjén követi nyomon. A kezelők bejegyezhetők adott kiterjesztési pontokhoz egy IFilter példány IExtensionTracker.registerHandler() metódushoz biztosításával. A kezelő csak akkor kerül meghívásra, amikor a kiterjesztések megfelelnek a hozzáadott vagy eltávolított IFilter objektumnak.

Amikor egy kiterjesztés belép a futási környezetbe, akkor ez a metódus kerül meghívásra. Ezután a kezelőnek alkalma van egyesíteni az új kiterjesztést a hozzá tartozó modelljébe. Az ezen felülethez biztosított IExtension alapján létrehozott objektumokat az IExtensionTracker.registerObject() metóduson keresztül kell bejegyezni a nyomkövetőhöz. Amikor egy kiterjesztés elhagyja a futási környezetet, akkor ez a metódus kerül meghívásra. A kiterjesztéshez korábban bejegyzett objektumok argumentumokként kerülnek átadásra. A kezelő ezután szükség szerint eltakaríthatja és eldobhatja az objektumokat. Jó gyakorlat a kezelők bejegyzésének megszüntetése annak érdekében, hogy a nyilvántartás ne csorduljon túl.