Olemme juuri tarkastelleet resurssimuutosten eräajoa runnable-objektissa (Resurssimuutosten eräajo). Seuraavaksi asiaa tarkastellaan toisesta suunnasta. Entä jos käyttäjä haluaa jäljittää kaikki muutokset, jotka tapahtuvat työtilassa samalla kun lisäosa on ajossa? Voit rekisteröidä kohteen IResourceChangeListener työtilaan. Kuuntelutoiminnolle ilmoitetaan muutoksista muutokset kuvaavan IResourceChangeEvent-objektin avulla.
Ensiksi on rekisteröitävä resurssimuutosten kuuntelutoiminto työtilaan.
IResourceChangeListener listener = new MyResourceChangeReporter(); ResourcesPlugin.getWorkspace().addResourceChangeListener( listener, IResourceChangeEvent.POST_CHANGE);
Kuuntelutoiminnolle ilmoitetaan, kun työtilan resursseja on muutettu. Resurssien sovellusohjelmaliittymämetodit, jotka muokkaavat resursseja, liipaisevat nämä tapahtumat osana dokumentoitua toimintaansa. Resurssien sovellusohjelmaliittymämetodin metodikommentti ilmoittaa nimenomaisesti, liipaiseeko se resurssin muutostapahtuman. Esimerkiksi seuraava sisältyy IFile.setContents()-kommenttiin:
Tämä metodi muuttaa resursseja. Muutokset raportoidaan myöhemmässä resurssin muutostapahtumassa, mukaan luettuna ilmoitus siitä, että tämän tiedoston sisältö on muuttunut.
Metodit, jotka luovat tai poistavat resursseja tai muuttavat niitä, liipaisevat yleisimmin nämä tapahtumat. Metodit, jotka lukevat, mutta eivät kirjoita, eivät yleensä liipaise näitä tapahtumia.
Resurssien muutostapahtuma kuvaa työtilassa tapahtuneen muutoksen (tai muutosjoukon) yksityiskohtia. Tapahtuma sisältää resurssien deltan, joka kuvaa muutosten nettovaikutusta. Jos esimerkiksi lisäät resurssin ja myöhemmin poistat sen samassa muutoserässä, resurssi ei tule näkyviin deltassa.
Resurssien delta on rakenne, jonka juuri on työtilan juuri. Resurssien deltan rakenne kuvaa seuraavia muutoksia:
Voit käydä läpi resurssien deltan rakenteen toteuttamalla IResourceDeltaVisitor-rajapinnan tai nimenomaisesti käyttämällä kohdetta IResource.getAffectedChildren. Resurssien deltan läpikäyntitoiminnot toteuttavat visit-metodin, jota resurssien delta kutsuu luetellessaan rakenteen kunkin muutoksen.
Huomautus: Resurssi-istunnon ominaisuuksiin tai resurssien pysyviin ominaisuuksin tehdyt muutokset eivät tule näkyviin resurssien deltassa.
Resurssien muutostapahtumat lähetetään aina, kun työtilaan tehdään muutos (tai siinä ajetaan muutosjoukko eräajona). Lisäksi resurssien muutostapahtumat lähetetään tiettyjen työtilan toimintojen yhteydessä. Seuraavassa taulukossa on esitetty resurssien muutostapahtumien lajit ja se, milloin ne raportoidaan.
Tapahtuman laji |
Kuvaus |
---|---|
PRE_CLOSE |
Ilmoittaa kuuntelutoiminnoille, että projekti lopetetaan pian. Tämän tapahtuman avulla voi noutaa ja tallentaa tarpeellisia tietoja muistissa olevasta projektin esityksestä (esim. istunnon ominaisuudet), ennen kuin projekti lopetetaan. (Kun projekti lopetetaan, muistissa oleva projektin esitys poistetaan). Tämän tapahtuman aikana työtila on lukittu (resursseja ei voi päivittää). Tapahtuma sisältää suljettavan projektin. |
PRE_DELETE |
Ilmoittaa kuuntelutoiminnoille, että projekti poistetaan pian. Tämän tapahtuman avulla voi tehdä puhdistustoimintoja, esimerkiksi poistaa projektiin liittyvät tallennetut tilat lisäosan hakemistosta. Tämän tapahtuman aikana työtila on lukittu (resursseja ei voi päivittää).Tapahtuma sisältää poistettavan projektin. |
PRE_AUTOBUILD |
Ilmoittaa kuuntelutoiminnoille automaattisesta koonnista, ennen kuin se on tapahtunut. Tämä tapahtuma lähetetään yleisjakeluun, kun ympäristö havaitsee, että automaattinen koonti on toteutettava, huolimatta siitä, onko automaattinen koonti todellisuudessa käytössä. Työtila ei ole lukittu tämän tapahtuman aikana (resursseja voi päivittää). Tapahtuma sisältää resurssien deltan, joka kuvaa resursseissa edellisen POST_CHANGE-tapahtuman raportoinnin jälkeen tapahtuneet muutokset. |
POST_AUTOBUILD |
Ilmoittaa kuuntelutoiminnoille automaattisesta koonnista sen jälkeen, kun se on tapahtunut. Tämä tapahtuma lähetetään yleisjakeluun sen jälkeen, kun ympäristö on toteuttanut automaattisen koonnin, huolimatta siitä, onko automaattinen koonti todellisuudessa käytössä. Työtila ei ole lukittu tämän tapahtuman aikana (resursseja voi päivittää).Tapahtuma sisältää resurssien deltan, joka kuvaa resursseissa edellisen POST_CHANGE-tapahtuman raportoinnin jälkeen tapahtuneet muutokset. |
POST_CHANGE |
Kuvaa muutokset, jotka ovat tapahtuneet työtilassa sen jälkeen, kun edellinen POST_CHANGE-tapahtuma on raportoitu. Se liipaistaan sen jälkeen, kun resurssien muutosten sovellusohjelmaliittymää on käytetty erikseen tai työtilan muutosten eräajona ajetussa joukossa. Se liipaistaan myös sen jälkeen, kun mikä tahansa PRE_AUTOBUILD- tai POST_AUTOBUILD-ilmoitus on valmis. Tapahtuma sisältää resurssien deltan, joka kuvaa edellisen POST_CHANGE-tapahtuman jälkeiset nettomuutokset. Tämän tapahtuman aikana työtila on lukittu (resursseja ei voi päivittää). |
Seuraava esimerkki toteuttaa konsoliin perustuvan resurssien muutosten kuuntelutoiminnon. Resurssien muutosten kuuntelutoiminto rekisteröidään tiettyjä tapahtumien lajeja varten, ja näitä tapahtumia koskevat tiedot tulostetaan konsoliin:
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);
Kuuntelutoiminto hakee kutakin tapahtumien lajia ja ilmoittaa muutetun resurssin tiedot sekä muutosten lajin. Vaikka tämä esimerkki on tarkoitettu kuvaamaan yleistä kuuntelutoimintoa, joka käsittelee kaikenlaisia resurssien tapahtumia, tyypillinen kuuntelutoiminto on rekisteröity vain yhtä tapahtumalajia varten.
POST_CHANGE-toteutus käyttää toista luokkaa, jonka avulla voi käydä läpi resurssien deltassa olevat muutokset.
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; } } }
DeltaPrinter-luokka toteuttaa IResourceDeltaVisitor-rajapinnan, jonka avulla voit tehdä resurssien deltaa koskevan kyselyn. Visit()-metodia kutsutaan resurssin deltan jokaisen resurssimuutoksen osalta. Läpikäyntitoiminto käyttää palautusarvoa osoittamaan, käydäänkö aliresurssien deltat läpi.
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; // käy aliobjektit läpi } }
Lisätietoja on toimitetussa resurssin deltassa. Seuraavassa katkelmassa esitetään, kuinka IResourceDelta.CHANGED-tapauksen voi toteuttaa, jos haluaa kuvata resurssien muutoksia tarkemmin.
... 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(); // jos olet kiinnostunut näistä merkinnöistä, tarkista nämä deltat } break; ...
Kattava kuvaus resurssien deltoista, läpikäyntitoiminnoista ja merkintöjen deltoista on kohteiden IResourceDelta, IResourceDeltaVisitor ja IMarkerDelta sovellusohjelmaliittymien määrityksissä.
Huomautus: Resurssien muutosten kuuntelutoimintojen avulla voi kätevästi seurata resursseissa ilmeneviä muutoksia lisäosan ollessa aktivoituna. Jos lisäosa rekisteröi resurssin muutoksen kuuntelutoiminnon aloituskoodinsa aikana, on mahdollista, että monia resurssien muutostapahtumia on liipaistu ennen lisäosan aktivointia. Ensimmäiseen lisäosan vastaanottamaan resurssien muutostapahtumaan sisältyvä resurssien delta ei sisällä kaikkia muutoksia, jotka ovat tapahtuneet sen jälkeen, kun lisäosa edellisen kerran on aktivoitu. Jos on tarpeen jäljittää lisäosan aktivointien välillä tapahtuneita muutoksia, käytä työtilan tallennuksen tukea. Se on kuvattu kohdassa Työtilan tallennuksen osanotto.
Huomautus: Jotkin resurssien muutostapahtumat liipaistaan taustasäikeen käsittelyn aikana. Resurssien muutosten kuuntelutoimintojen on oltava turvallinen säikeiden käytön kannalta. Lisätietoja säikeiden käytön turvallisuudesta käyttöliittymässä on kohdassa Säikeisiin liittyvät ongelmat.