Láthattuk, hogy az erőforrásmódosítások hogyan kötegelhetők egy futtatható fájlban (Erőforrásmódosítások kötegelése). Tekintsük meg az érem másik oldalát. Mi van, ha a munkaterület összes módosítását nyomon kívánja követni, amely a bedolgozó futása során történik? Regisztrálhat egy IResourceChangeListener figyelőt a munkaterülettel. A figyelő egy IResourceChangeEvent objektumon keresztül kap értesítést a módosításokról, amely leírja a változásokat.
Először regisztrálnia kell az erőforrásmódosítás-figyelőt a munkaterülettel.
IResourceChangeListener listener = new MyResourceChangeReporter(); ResourcesPlugin.getWorkspace().addResourceChangeListener( listener, IResourceChangeEvent.POST_CHANGE);
A figyelő értesítést kap a munkaterület-erőforrások módosítása után. Az erőforrásokat módosító erőforrás API metódusok ezeket az eseményeket a dokumentált viselkedés részeként aktiválják. Az erőforrás API metódus metódus parancsa explicit módon állítja, hogy aktivál-e egy erőforrás-módosítási eseményt. Az alábbi például megtalálható az IFile.setContents() megjegyzésben:
Ez a metódus módosítja az erőforrásokat; ezekről a módosításokról jelentés készül a további erőforrás-módosítási eseményben annak jelzését is beleértve, hogy a fájl tartalma módosításra került.
Az erőforrást létrehozó, törlő vagy módosító metódus jellemzően aktiválja ezeket az eseményeket. A metódusok, amelyek olvassák, de nem írják az erőforrásokat, jellemzően nem aktiválják ezeket az eseményeket.
Az erőforrás-módosítási esemény leírja a munkaterületen történt módosítás (vagy módosítások halmazának) specifikációit. Az esemény tartalmaz egy erőforrás-változást, amely leírja a módosítások hálózati hatását. Ha például hozzáad egy erőforrást és később törli ezt az egyik módosításhalmaz során, akkor az erőforrás nem jelenik meg a változásban.
Az erőforrás-változás faként van strukturálva, amelynek gyökere a munkaterület gyökere. Az erőforrás-különbségfa leírja ezeket a típusú módosításokat:
Az erőforrás-különbségfa áttekintéséhez megvalósítható az IResourceDeltaVisitor felület, vagy az IResource.getAffectedChildren segítségével a fa áttekinthető explicit módon. Az erőforrásváltozás-látogatók megvalósítanak egy látogatás metódust, amelyet az erőforrás-változás hív meg, amikor felsorolja a fa módosításait.
Megjegyzés: A munkamenet erőforrás-tulajdonságok vagy állandó erőforrás-tulajdonságok módosításait nem azonosítja az erőforrás-változás.
Az erőforrás-módosítási események a munkaterület módosításakor (vagy módosítások kötegelt halmaza esetén) kerülnek elküldésre. Ezen felül az erőforrás-módosítási események elküldésre kerülnek adott speciális munkaterület-műveletekhez. Az alábbi táblázat összesíti az erőforrás-módosítási eseménytípusokat és a jelentéskészítés idejét.
Eseménytípus |
Leírás |
---|---|
PRE_CLOSE |
Értesíti a figyelőket, hogy a projekt hamarosan lezárásra kerül. Ez az esemény a projekt bezárása előtt a projekt memória reprezentációjából kinyeri és elmenti a szükséges információkat (például a munkamenet-tulajdonságokat). (A projekt bezárásakor a memóriában lévő ábrázolás eltávolításra kerül). A munkaterület az esemény során zárolásra kerül (az erőforrások nem frissíthetők). Az esemény tartalmazza a bezárandó projektet. |
PRE_DELETE |
Értesíti a figyelőket, hogy a projekt hamarosan törlésre kerül. Ez az esemény végrehajtja a kiürítési műveletet, mint például a mentett állapot eltávolítása, amely kapcsolódik a projekthez a bedolgozó könyvtárából. A munkaterület az esemény során zárolásra kerül (az erőforrások nem frissíthetők).Az esemény tartalmazza a törlendő projektet. |
PRE_AUTOBUILD |
Értesíti a figyelőket az automatikus összeépítés végrehajtása előtt. Ez az esemény üzenetszórással kerül továbbításra, amikor a platform észleli az automatikus összeépítést függetlenül attól, hogy az automatikus összeépítés engedélyezve van-e. A munkaterület nem kerül zárolásra az esemény során (az erőforrások frissíthetők). Az esemény tartalmaz egy erőforrás-változások fájlt, amely leírja az utolsó jelentett POST_CHANGE esemény óta bekövetkező módosításokat. |
POST_AUTOBUILD |
Értesíti a figyelőket az automatikus összeépítés végrehajtásáról. Ez az esemény üzenetszórással kerül továbbításra, miután a platform végrehajtotta az automatikus összeépítést függetlenül attól, hogy az automatikus összeépítés valójában engedélyezve van-e. A munkaterület nem kerül zárolásra az esemény során (az erőforrások frissíthetők).Az esemény tartalmaz egy erőforrás-változások fájlt, amely leírja az utolsó jelentett POST_CHANGE esemény óta bekövetkező módosításokat. |
POST_CHANGE |
Leírja az utolsó jelentett POST_CHANGE esemény óta bekövetkezett munkaterület-módosításokat. Egy egyéni erőforrás-módosítási API vagy egy kötegelt munkaterület-módosításhalmaz után kerül aktiválásra. A PRE_AUTOBUILD vagy POST_AUTOBUILD értesítés befejezése után is aktiválásra kerül. Az esemény tartalmaz egy erőforrás-változást, amely leírja az utolsó POST_CHANGE esemény óta történt hálózati módosításokat. A munkaterület az esemény során zárolásra kerül (az erőforrások nem frissíthetők). |
Az alábbi példa egy konzol alapú erőforrásmódosítás-figyelőt valósít meg. Az erőforrásmódosítás-figyelő adott eseménytípusokhoz kerül bejegyzésre, és ezen eseményekkel kapcsolatos információk kerülnek kiírásra a konzolon:
IResourceChangeListener listener = new MyResourceChangeReporter(); ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_AUTO_BUILD | IResourceChangeEvent.POST_AUTO_BUILD | IResourceChangeEvent.POST_CHANGE);
A figyelő ellenőrzi az összes eseménytípust, és jelentést készít a módosított erőforrásokkal, és a módosítás típusával kapcsolatban. A példa célja, hogy egy általános figyelőt jelenítsen meg, amely kezeli az összes erőforrásesemény-típust, egy jellemző figyelő csak egy eseménytípushoz kerül regisztrálásra.
A POST_CHANGE megvalósítása másik osztályt használ, amely meglátogathatja az erőforrás-változások fájlban lévő módosításokat .
import org.eclipse.resources.*; import org.eclipse.runtime.*; public class MyResourceChangeReporter implements IResourceChangeListener { public void resourceChanged(IResourceChangeEvent event) { IResource res = event.getResource(); switch (event.getType()) { case IResourceChangeEvent.PRE_CLOSE: System.out.print("Project "); System.out.print(res.getFullPath()); System.out.println(" is about to close."); break; case IResourceChangeEvent.PRE_DELETE: System.out.print("Project "); System.out.print(res.getFullPath()); System.out.println(" is about to be deleted."); break; case IResourceChangeEvent.POST_CHANGE: System.out.println("Resources have changed."); event.getDelta().accept(new DeltaPrinter()); break; case IResourceChangeEvent.PRE_AUTO_BUILD: System.out.println("Auto build about to run."); event.getDelta().accept(new DeltaPrinter()); break; case IResourceChangeEvent.POST_AUTO_BUILD: System.out.println("Auto build complete."); event.getDelta().accept(new DeltaPrinter()); break; } } }
A DeltaPrinter osztály megvalósítja az IResourceDeltaVisitor felületet az erőforrás-változás lekérdezéséhez. A visit() metódus meghívásra kerül az erőforrás-változás minden erőforrásmódosításához. A látogatós egy visszatérési értéket használ annak jelzéséhez, hogy a leszármazott-erőforrások változásait meg kell-e látogatni.
class DeltaPrinter implements IResourceDeltaVisitor { public boolean visit(IResourceDelta delta) { IResource res = delta.getResource(); switch (delta.getKind()) { case IResourceDelta.ADDED: System.out.print("Resource "); System.out.print(res.getFullPath()); System.out.println(" was added."); break; case IResourceDelta.REMOVED" System.out.print("Resource "); System.out.print(res.getFullPath()); System.out.println(" was removed."); break; case IResourceDelta.CHANGED: System.out.print("Resource "); System.out.print(res.getFullPath()); System.out.println(" has changed."); break; } return true; // a leszármazottat meg kell látogatni } }
További információk a biztosított erőforrás-változásról kérhetők le. Az alábbi részlet bemutatja, hogy az IResourceDelta.CHANGED eset hogyan valósítható meg az erőforrásmódosítások további leírása érdekében.
... case IResourceDelta.CHANGED: System.out.print("Resource "); System.out.print(delta.getFullPath()); System.out.println(" has changed."); int flags = delta.getFlags(); if ((flags & IResourceDelta.CONTENT) != 0) { System.out.println("--> Content Change"); } if ((flags & IResourceDelta.REPLACED) != 0) { System.out.println("--> Content Replaced"); } if ((flags & IResourceDelta.MARKERS) != 0) { System.out.println("--> Marker Change"); IMarkerDelta[] markers = delta.getMarkerDeltas(); // ha érdekelt a jelzőkben, tekintse meg ezeket a változásokat } break; ...
Az erőforrás-változások, látogatók és jelzőváltozások teljes leírásáért tekintse meg az IResourceDelta, IResourceDeltaVisitor, és IMarkerDelta API specifikációját.
Megjegyzés: Az erőforrásmódosítás-figyelők hasznosak a bedolgozó aktiválása során előforduló erőforrás-módosításainak nyomkövetéséhez. Ha a bedolgozó bejegyez egy erőforrásmódosítás-figyelőt az indítási kód során, akkor elképzelhető, hogy számos erőforrás-módosítási esemény kerül aktiválásra a bedolgozó aktiválása előtt. A bedolgozó által fogadott erődorrás-módosítási eseményben lévő erőforrás-változás nem tartalmazza a bedolgozó utolsó aktiválása óta történt összes módosítást. Ha nyomon kívánja követni a bedolgozó tevékenységei közötti módosításokat, akkor a munkaterület mentéséhez biztosított támogatást kell használnia. Ennek leírását a Részvétel a munkaterület-mentésben rész tartalmazza.
Megjegyzés: Aktiválásra került néhány erőforrás-módosítási esemény a háttérszálban végbemenő feldolgozás során. Az erőforrásmódosítás-figyelőknek biztonságos szálkezelésűnek kell lennie. Az UI szálbiztonságával kapcsolatos információkat a Szálkezelési problémák rész tartalmaz.