Vi har just sett hur vi batchbearbetar resursändringar i en körbar fil (Batchbearbeta resursändringar). Låt oss ta en titt på myntets baksida. Vad gäller om du vill spåra alla ändringar på arbetsytan som sker när insticksprogrammet körs? Du kan registrera en IResourceChangeListener med arbetsytan. Din lyssnare meddelande om ändringarna via ett IResourceChangeEvent-objekt som beskriver ändringarna.
Först måste du registrera en resursändringslyssnare med arbetsytan.
IResourceChangeListener listener = new MyResourceChangeReporter(); ResourcesPlugin.getWorkspace().addResourceChangeListener( listener, IResourceChangeEvent.POST_CHANGE);
Lyssnaren meddelas när arbetsytans resurser har ändrats. Resurs-API-metoder som ändrar resurser utlöser dessa ändelser som en del av deras dokumenterade beteende. Metodkommentaren för en resurs-API-metod uttrycker explicit huruvida den utlöser en resursändringshändelse. Ett exempel: följande ingår i kommentaren IFile.setContents():
This method changes resources; these changes will be reported in a subsequent resource change event, including an indication that this file's content have been changed.
Metoder som skapar, tar bort eller ändrar en resurs utlöser vanligen dessa händelser. Metoder som läser men inte skriver resurser utlöser vanligen inte dessa händelser.
Resursändringshändelsen beskriver ändringens egenskaper(eller ändringsuppsättningar) som har inträffat på arbetsytan. Händelsen innehåller ett resursdelta som beskriver nettoeffekten av ändringarna. Ett exempel: om du lägger till en resurs och sedan tar bort den under en batchbearbetning av ändringar, visas inte resursen i deltat.
Resursdeltat är strukturerat som ett träd med roten i arbetsytans rot. Resursdeltaträdet beskriver dessa typer av ändringar:
Om du vill korsa ett resursdeltaträd kan du implementera gränssnittet IResourceDeltaVisitor eller korsa trädet explicit med IResource.getAffectedChildren. Resursdeltabesökare implementerar en visit-metod som anropas av resursdeltat när det räknar upp varje ändring i trädet.
Obs! Ändringar i resurssessionsegenskaperna eller resursfasta egenskaper identifieras inte i resursdeltat.
Resursändringshändelser skickas när en ändring (eller batchbearbetad uppsättning ändringar) görs på arbetsytan. Dessutom skickas resursändringshändelser för vissa specifika arbetsyteoperationer. Tabellen nedan summerar typerna av resursändringshändelser och när de rapporteras.
Händelsetyp |
Beskrivning |
---|---|
PRE_CLOSE |
Meddelar lyssnare att ett projekt ska stängas. Den här händelsen kan användas till att extrahera och spara nödvändig information från i minnet-representationen (t.ex. sessionsegenskaper) för ett projekt innan det sparas. (När ett projekt är stängt tas i minnet-representationen bort). Arbetsytan låses (inga resurser kan uppdateras) under händelsen. Händelsen innehåller det projekt som stängs. |
PRE_DELETE |
Meddelar lyssnare att ett projekt ska tas bort. Den här händelsen kan användas till att utföra upprensningsoperationer, t.ex. ta bort ett sparat läge som är relaterat till projektet från insticksprogrammets katalog. Arbetsytan är låst (inga resurser kan uppdateras) under den här händelsen. Händelsen innehåller det projekt som tas bort. |
PRE_AUTOBUILD |
Meddelar lyssnare innan ett automatiskt byggande sker. Den här händelsen sänds ut när plattformen upptäcker att ett byggande måste ske automatiskt, oavsett om funktionen verkligen är aktiverad. Arbetytan är inte låst under den här händelsen (resurser kan uppdateras). Händelsen innehåller ett resursdelta som beskriver de ändringar som har inträffat sedan den senaste POST_CHANGE. händelsen rapporterades. |
POST_AUTOBUILD |
Meddelar lyssnare efter ett automatiskt byggande. Den här händelsen sänds ut efter att plattformen skulle ha utfört ett automatiskt byggande oavsett om funktionen verkligen är aktiveras. Arbetsytan är inte låst under den här händelsen (resurser kan uppdateras). Händelsen innehåller ett resursdelta som beskriver de ändringar som har inträffat sedan den senaste POST_CHANGE. händelsen rapporterades. |
POST_CHANGE |
Beskriver en uppsättning ändringar som inträffat på arbetsytan sedan den senaste POST_CHANGE-händelsen rapporterades. Utlöses efter att ett resursändrings-API använts enskilt eller i en batchbearbetning av arbetsyteändringar. Utlöses också efter att ett PRE_AUTOBUILD- eller POST_AUTOBUILD-meddelande har slutförts. Händelsen innehåller ett resursdelta som beskriver nettoändringarna sedan den senaste POST_CHANGE-händelsen. Arbetsytan är låst (inga resurser kan uppdateras) under den här händelsen. |
Följande exempel implementerar en konsolbaserad resursändringslyssnare. En resursändringslyssnare registreras för specifika typer av händelser och information om dessa händelser visas på konsolen:
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);
Lyssnaren söker efter varje händelsetyp och rapporterar information om den resurs som ändrades och de typer av ändringar som inträffade. Även om detta exempel är framtaget för att visa en allmän lyssnare som hanterar alla typer av resurshändelser, skulle en typisk lyssnare bara registreras för en typ av händelse.
Implementationen för POST_CHANGE använder en annan klass som kan användas till att besöka ändringarna i resursdeltat.
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; } } }
Klassen DeltaPrinter implementerar gränssnittet IResourceDeltaVisitor till att förhöra resursdelta. Metoden visit() anropas för varje resursändring i resursdeltat. Besökaren använder ett returvärde till att ange huruvida deltan för underordnade resurser ska besökas.
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; // visit the children } }
Mer information kan erhållas från det tillhandahållna resursdeltat. Följande kodstycker visar hur IResourceDelta.CHANGED-fallet kan implementeras till att ytterligare beskriva resursändringarna.
... 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(); // if interested in markers, check these deltas } break; ...
För en fullständig beskrivning av resursdeltan, besökare och markördeltan, se API-specifikationen för IResourceDelta, IResourceDeltaVisitor och IMarkerDelta.
Obs! Resursändringslyssnare är användbara om du vill spåra ändringar som inträffar i resurser medan insticksprogrammet är aktiverat. Om ditt insticksprogram registrerar en resursändringslyssnare när det startas, är det möjligt att många resursändringshändelser har utlösts innan insticksprogrammet hunnit aktiveras. Det resursdelta som finns i den första resursändringshändelsen som tas emot av insticksprogrammet innehåller inte alla gjorda ändringar sedan insticksprogrammet senast aktiverades. Om du behöver spåra ändringar gjorda mellan aktiveringar av ditt insticksprogram ska du använda det stöd som tillhandahålls för sparande på arbetsytan. Det här beskrivs i Medverkande vid sparåtgärder för arbetsytor.
Obs! Vissa resursändringshändelser utlöses under bearbetning som inträffar i en bakgrundstråd. Resursändringslyssnare ska vara trådsäkra. En diskussion om trådsäkerhet i användargränssnittet finns i avsnittet Trådproblem.