Είδαμε πώς μπορεί κανείς να ομαδοποιήσει αλλαγές πόρου σε ένα εκτελέσιμο (Ομαδοποίηση αλλαγών πόρου). Ας ρίξουμε μια ματιά τώρα στην άλλη πλευρά του νομίσματος. Τι μπορείτε να κάνετε εάν θέλετε να παρακολουθήσετε το σύνολο των αλλαγών στο χώρο εργασίας οι οποίες πραγματοποιήθηκαν κατά την εκτέλεση της πρόσθετης λειτουργίας; Μπορείτε να καταχωρήσετε μια διασύνδεση IResourceChangeListener με το χώρο εργασίας. Η λειτουργεία ακρόασής σας θα ειδοποιηθεί για τις αλλαγές μέσω ενός αντικειμένου IResourceChangeEvent, το οποίο περιγράφει τις αλλαγές.
Πρώτα, πρέπει να καταχωρήσετε μια λειτουργία ακρόασης αλλαγής πόρου με το χώρο εργασίας.
IResourceChangeListener listener = new MyResourceChangeReporter(); ResourcesPlugin.getWorkspace().addResourceChangeListener( listener, IResourceChangeEvent.POST_CHANGE);
Η λειτουργία ακρόασης θα ειδοποιηθεί μετά την πραγματοποίηση των τροποποιήσεων στους πόρους του χώρου εργασίας. Οι μέθοδοι API πόρου που τροποποιούν τους πόρους ενεργοποιούν αυτόματα αυτά τα συμβάντα ως τμήμα της τεκμηριωμενης συμπεριφοράς τους. Το σχόλιο μεθόδου για τη μέθοδο API ενός πόρου δηλώνει ρητά κατά πόσον υπάρχει ενεργοποίηση ενός συμβάντος αλλαγής πόρου. Για παράδειγμα, τα παρακάτω περιλαμβάνονται στο σχόλιο 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.
Οι μέθοδοι που δημιουργούν, διαγράφουν ή αλλάζουν έναν πόρο συνήθως ενεργοποιούν αυτόματα αυτά τα συμβάντα. Οι μέθοδοι που διαβάζουν, αλλά δεν εγγράφουν πόρους, συνήθως δεν ενεργοποιούν αυτόματα αυτά τα συμβάντα.
Το συμβάν αλλαγής πόρου περιγράφει τις προδιαγραφές της αλλαγής (ή του συνόλου των αλλαγών) που προέκυψαν στο χώρο εργασίας. Το συμβάν περιέχει τροποποιημένα στοιχεία πόρου που περιγράφουν το καθαρό αποτέλεσμα των αλλαγών. Για παράδειγμα, αν προσθέσετε έναν πόρο και αργότερα τον διαγράψετε κατά την ομαδοποίηση αλλαγών, ο πόρος δεν θα εμφανίζεται στα τροποποιημένα στοιχεία.
Τα τροποποιημένα στοιχεία πόρου δομούνται ως μια διακλάδωση η οποία συνδέεται με τη ρίζα του χώρου εργασίας. Η διακλάδωση τροποποιημένων στοιχείων πόρου περιγράφει τρεις τύπους αλλαγών:
Για να διασχίσετε μια διακλάδωση τροποποιημένων στοιχείων πόρου, μπορείτε να υλοποιήσετε τη διασύνδεση IResourceDeltaVisitor ή να διασχίσετε τη διακλάδωση ρητά με χρήση του IResource.getAffectedChildren. Οι επισκέπτες των τροποποιημένων στοιχείων πόρου υλοποιούν μια μέθοδο visit η οποία καλείται από τα τροποποιημένα στοιχεία πόρου καθώς απαριθμεί κάθε αλλαγή στη διακλάδωση.
Σημείωση: Οι αλλαγές που γίνονται στις ιδιότητες συνεδρίας πόρου ή στις ιδιότητες μόνιμων πόρων δεν εξακριβώνονται στα τροποποιημένα στοιχεία πόρου.
Τα συμβάντα αλλαγής πόρου αποστέλλονται, όποτε πραγματοποιείται κάποια αλλαγή (ή ένα ομαδοποιημένο σύνολο αλλαγών), στο χώρο εργασίας. Επιπλέον, τα συμβάντα αλλαγής πόρου αποστέλλονται για ορισμένες συγκεκριμένες λειτουργίες του χώρου εργασίας. Ο πίνακας που ακολουθεί συνοψίζει τα είδη συμβάντων αλλαγής πόρου και το χρόνο αναφοράς τους.
Είδος συμβάντος |
Περιγραφή |
---|---|
PRE_CLOSE |
Ειδοποιεί τις λειτουργίες ακρόασης ότι ένα έργο πρόκειται να κλείσει. Αυτό το συμβάν μπορεί να χρησιμοποιηθεί για την εξαγωγή και αποθήκευση των απαραίτητων πληροφοριών από την αναπαράσταση μνήμης (π.χ. ιδιότητες συνεδρίας) ενός έργου πριν από το κλείσιμό του. (Όταν ένα έργο κλείσει, γίνεται αποδέσμευση της αναπαράστασης μνήμης). Ο χώρος εργασίας κλειδώνει (δεν είναι δυνατή η ενημέρωση πόρων) κατά τη διάρκεια αυτού του συμβάντος. Το συμβάν περιέχει το έργο το οποίο έκλεισε. |
PRE_DELETE |
Ειδοποιεί τις λειτουργίες ακρόασης ότι ένα έργο πρόκειται να διαγραφεί. Αυτο το συμβάν μπορεί να χρησιμοποιηθεί για την εκκαθάριση λειτουργιών, όπως η αφαίρεση τυχόν αποθηκευμένων δεδομένων τα οποία συσχετίζονται με το έργο από τον κατάλογο της πρόσθετης λειτουργίας σας. Ο χώρος εργασίας κλειδώνει (δεν είναι δυνατή η ενημέρωση πόρων) κατά τη διάρκεια αυτού του συμβάντος. Το συμβάν περιέχει το έργο το οποίο διεγράφη. |
PRE_AUTOBUILD |
Ειδοποιεί τις λειτουργίες ακρόασης πριν από την εμφάνιση οποιασδήποτε αυτόματης δόμησης. Το συμβάν αυτό μεταδίδεται όταν η πλατφόρμα εντοπίσει μια αυτόματη δόμηση η οποία πρέπει να εμφανιστεί, ανεξάρτητα από το εάν έχει γίνει ενεργοποίηση αυτής της αυτόματης δόμησης. Ο χώρος εργασίας δεν κλειδώνει κατά τη διάρκεια αυτού του συμβάντος. (δεν είναι δυνατή η ενημέρωση πόρων). Αυτό το συμβάν περιέχει τροποποιημένα στοιχεία πόρου τα οποία περιγράφουν τις αλλαγές που προέκυψαν από την αναφορά του τελευταίου συμβάντος POST_CHANGE. |
POST_AUTOBUILD |
Ειδοποιεί τις λειτουργίες ακρόασης μετά από την εμφάνιση μιας οποιασδήποτε αυτόματης δόμησης. Το εν λόγω συμβάν μεταδίδεται μετά την εκτέλεση μιας αυτόματης δόμησης από την πλατφόρμα, ανεξάρτητα από το αν έχει γίνει ενεργοποίηση αυτής της αυτόματης δόμησης. Ο χώρος εργασίας δεν κλειδώνει κατά τη διάρκεια αυτού του συμβάντος (δεν είναι δυνατή η ενημέρωση πόρων). Αυτό το συμβάν περιέχει τροποποιημένα στοιχεία πόρου τα οποία περιγράφουν τις αλλαγές που προέκυψαν από την αναφορά του τελευταίου συμβάντος POST_CHANGE. |
POST_CHANGE |
Περιγράφει το σύνολο των αλλαγών που προκύπτουν στο χώρο εργασίας από την αναφορά του τελευταίου συμβάντος POST_CHANGE. Ενεργοποιείται αυτόματα μετά από τη μεμονωμένη χρήση ενός API αλλαγής πόρου ή σε ένα ομαδοποιημένο σύνολο αλλαγών χώρου εργασίας. Επίσης ενεργοποιείται μετά από την ολοκλήρωση οποιασδήποτε ειδοποίησης PRE_AUTOBUILD ή POST_AUTOBUILD. Αυτό το συμβάν περιέχει τροποποιημένα στοιχεία πόρου που περιγράφουν τις καθαρές αλλαγές από το τελευταίο συμβάν POST_CHANGE. Ο χώρος εργασίας κλειδώνει (δεν είναι δυνατή η ενημέρωση πόρων) κατά τη διάρκεια αυτού του συμβάντος. |
Το ακόλουθο παράδειγμα υλοποιεί μια λειτουργία αλλαγής πόρου που βασίζεται σε κονσόλα. Μια λειτουργία ακρόασης αλλαγής πόρου καταχωρείται για συγκεκριμένα είδη συμβάντων και οι πληροφορίες σχετικά με αυτά τα συμβάντα εκτυπώνονται στην κονσόλα.
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);
Η λειτουργία ακρόασης ελέγχει το κάθε είδος συμβάντος και αναφέρει τις πληροφορίες σχετικά με τον πόρο που τροποποιήθηκε καθώς και τα είδη αλλαγών που προέκυψαν. Αν και αυτό το παράδειγμα έχει σχεδιαστεί προκειμένου να παρουσιάσει μια γενική λειτουργία ακρόασης η οποία χειρίζεται όλα τα είδη συμβάντων πόρου, μια συνηθισμένη λειτουργία ακρόασης θα καταχωρούσε μόνο για ένα είδος συμβάντος.
Η υλοποίηση του POST_CHANGE χρησιμοποιεί άλλη κλάση η οποία μπορεί να χρησιμοποιηθεί για να επισκεφθείτε τις αλλαγές στα τροποποιημένα στοιχεία πόρου.
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 υλοποιεί τη διασύνδεση IResourceDeltaVisitor για την εξέταση των τροποποιημένων στοιχείων πόρου. Η μέθοδος visit() καλείται για κάθε αλλαγή πόρου στα τροποποιημένα στοιχεία πόρου. Ο επισκέπτης χρησιμοποιεί μια τιμή επιστροφής προκειμένου να υποδείξει αν θα πρέπει να πραγματοποιηθεί επίσκεψη στα τροποποιημένα στοιχεία πόρου θυγατρικών πόρων.
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 } }
Μπορείτε να αποκτήσετε επιπλέον πληροφορίες από τα τροποποιημένα στοιχεία πόρου που παρέχονται. Το ακόλουθο τμήμα κώδικα δείχνει πώς μπορείτε να υλοποιήσετε την περίπτωση IResourceDelta.CHANGED προκειμένου να περιγράψετε περαιτέρω τις αλλαγές πόρου.
... 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; ...
Για μια πλήρη περιγραφή των τροποποιημένων στοιχείων πόρου, των επισκεπτών και των τροποποιημένων στοιχείων δείκτη, συμβουλευθείτε την προδιαγραφή API για τις διασυνδέσεις IResourceDelta, IResourceDeltaVisitor, και IMarkerDelta.
Σημείωση: Οι λειτουργίες ακρόασης αλλαγής πόρου είναι χρήσιμες για την παρακολούθηση αλλαγών που προκύπτουν σε πόρους κατά την ενεργοποίηση της πρόσθετης λειτουργίας σας. Αν η πρόσθετη λειτουργία σας καταχωρεί μια λειτουργία ακρόασης αλλαγής πόρου κατά την εκκίνηση του κώδικα, ενδέχεται, πριν από την ενεργοποίηση της πρόσθετης λειτουργίας σας, να προηγήθηκε μια αυτόματη ενεργοποίηση πολλών συμβάντων αλλαγής πόρου. Τα τροποποιημένα στοιχεία πόρου που περιέχονται στο πρώτο συμβάν αλλαγής πόρου το οποίο λαμβάνεται από την πρόσθετη λειτουργία σας, δεν θα περιέχουν όλες τις αλλαγές που πραγματοποιήθηκαν από την τελευταία ενεργοποίηση της πρόσθετης λειτουργίας σας. Αν χρειάζεται να παρακολουθήσετε τις αλλαγές που έγιναν μεταξύ των ενεργοποιήσεων της πρόσθετης λειτουργίας σας, θα πρέπει να χρησιμοποιήσετε την υποστήριξη που παρέχεται για την αποθήκευση του χώρου εργασίας. Η υποστήριξη αυτή περιγράφεται στην ενότητα Συστατικό στοιχείο συμμετοχής αποθήκευσης χώρου εργασίας.
Σημείωση: Ορισμένα συμβάντα αλλαγής πόρου ενεργοποιούνται αυτόματα κατά την επεξεργασία η οποία προκύπτει σε κάποιο νήμα παρασκηνίου. Οι λειτουργίες ακρόασης πόρου θα πρέπει να είναι ασφαλείς όταν υπάρχουν νήματα. Για μια συζήτηση σχετικά με την ασφάλεια του περιβάλλοντος χρήστη όταν υπάρχουν νήματα, δείτε την ενότητα Θέματα δημιουργίας νημάτων.