Az erőforrásmódosítások nyomkövetése

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.

Figyelő regisztrálása

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.

Erőforrás-módosítási események

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).

Erőforrásmódosítás-figyelő megvalósítása

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.