Αν σκοπεύετε να παρέχετε την υποστήριξη συγχρονισμού και δεν έχετε έναν υπάρχοντα μηχανισμό για τη διαχείριση των καταστάσεων συγχρονισμού, η ενότητα αυτή εξηγεί τον τρόπο υλοποίησης μιας κλάσης Subscriber από την αρχή. Αυτό σημαίνει ότι δεν υπάρχει κάποια υποδομή συγχρονισμού και περιγράφει τον τρόπο χρήσης ορισμένων API που παρέχονται για τη διατήρηση της κατάστασης συγχρονισμού.
Στο υπόλοιπο μέρος αυτού του παραδείγματος, θα χρησιμοποιήσουμε ένα παράδειγμα εκτέλεσης. Ο πρωτογενής κώδικας βρίσκεται στο πακέτο του παροχέα συστήματος αρχείων της πρόσθετης λειτουργίαςorg.eclipse.team.examples.filesystem. Θα πρέπει να αναλάβετε τον έλεγχο του έργου από το χώρο αποθήκευσης CVS και να το χρησιμοποιήσετε ως αναφορά, ενώ διαβάζετε το παρόν πρόγραμμα εκμάθησης.
Το πρώτο παράδειγμα υποθέτει ότι δεν υπάρχει κάποια υποδομή για τη διατήρηση της κατάστασης συγχρονισμού του τοπικού χώρου εργασίας. Όταν υλοποιείτε έναν συνδρομητή από την αρχή, μπορείτε να χρησιμοποιήσετε κάποια πρόσθετα API που παρέχονται στην πρόσθετη λειτουργία org.eclipse.team.core. Το πακέτο org.eclipse.team.core.variants περιέχει δύο υποκλάσεις της Subscriberοι οποίες μπορούν να χρησιμοποιηθούν για την απλοποίηση της υλοποίησης. Η πρώτη υποκλάση είναι η ResourceVariantTreeSubscriber, την οποία θα περιγράψουμε παρακάτω, στο δεύτερο παράδειγμα. Η δεύτερη είναι μια υποκλάση της πρώτης: ThreeWaySubscriber. Αυτή η υλοποίηση συνδρομητή παρέχει διάφορες χρήσιμες κλάσεις για τη διαχείριση της κατάστασης συγχρονισμού ενός τοπικού χώρου εργασίας. Αν δεν έχετε μια υπάρχουσα υποδομή, αυτό είναι ένα καλό σημείο για να ξεκινήσετε.
Η υλοποίηση ενός συνδρομητή από την αρχή θα περιγραφεί με τη χρήση του παραδείγματος συστήματος αρχείων που είναι διαθέσιμο στην πρόσθετη λειτουργία org.eclipse.team.examples.filesystem. Ο κώδικας στην παρακάτω περιγραφή διατηρείται στο ελάχιστο, καθώς διατίθεται από το χώρο αποθήκευσης Eclipse CVS. Παρόλο που τεχνικά δεν πρόκειται για συνδρομητή τριών εκδοχών, το παράδειγμα συστήματος αρχείων αποτελεί μια καλή χρήση της υποδομής αυτής. Οι πρόσθετες λειτουργίες FTP και WebDAV έχουν επίσης δομηθεί με τη χρήση αυτής της υποδομής.
Για το παράδειγμα συστήματος αρχείων, είχαμε ήδη μια υλοποίηση της κλάσης RepositoryProvider που συσχέτιζε ένα τοπικό έργο με μια θέση συστήματος αρχείων, όπου γινόταν κατοπτρισμός των τοπικών περιεχομένων. Η FileSystemSubscriber δημιουργήθηκε ως μια υποκλάση της ThreeWaySubscriber προκειμένου να χρησιμοποιείται μια ThreeWaySynchronizer για τη διαχείριση της κατάστασης συγχρονισμού του χώρου εργασίας. Οι υποκλάσεις της κλάσης αυτής πρέπει να πραγματοποιούν τα εξής:
Εκτός από την υλοποίηση συνδρομητή, οι λειτουργίες λήψης και αποθήκευσης για τον παροχέα συστήματος αρχείων τροποποιήθηκαν, για την ενημέρωση της κατάστασης συγχρονισμού στο ThreeWaySynchronizer. Οι λειτουργίες υλοποιούνται στην κλάση org.eclipse.team.examples.filesystem.FileSystemOperations.
Η ThreeWaySynchronizer διαχειρίζεται το συγχρονισμό μεταξύ του τοπικού χώρου αποθήκευσης και μιας απομακρυσμένης θέσης. Αποθηκεύει στη λανθάνουσα μνήμη (cache) και μονιμοποιεί τα τοπικά, βασικά και απομακρυσμένα αποτυπώματα χρόνου, προκειμένου να υποστηρίζει τον ικανοποιητικό υπολογισμό της κατάστασης συγχρονισμού ενός πόρου. Ενεργοποιεί επίσης ενημερώσεις αλλαγών σε κάθε καταχωρημένη λειτουργία ακρόασης. Η ThreeWaySubscriber μεταφράζει αυτά τα συμβάντα αλλαγών στην κατάλληλη μορφή, ώστε να μεταβιβάζονται στις λειτουργίες ακρόασης που είναι καταχωρημένες με τον συνδρομητή.
Η ThreeWaySynchronizer χρησιμοποιεί τους κεντρικούς κανόνες προγραμματισμού και κλειδώνει για να διασφαλίσει την ασφάλεια νήματος και να παρέχει την ομαδοποίηση σε παρτίδες των ενημερώσεων αλλαγών.
Η ThreeWayRemoteTree είναι μια υποκλάση της ResourceVariantTree προσαρμοσμένη στη ThreeWaySubscriber. Προκειμένου να παρέχει το μηχανισμό ανάκτησης της απομακρυσμένης κατάστασης από τον εξυπηρετητή, πρέπει να αντιγραφεί από τους πελάτες. Η κλάση ResourceVariantTree περιγράφεται πιο αναλυτικά στο επόμενο παράδειγμα.
Η CachedResourceVariant αποτελεί μια μερική υλοποίηση της IResourceVariant, η οποία αποθηκεύει τυχόν ανακτημένα περιεχόμενα στη λανθάνουσα μνήμη, για ένα συγκεκριμένο χρονικό διάστημα (εδώ, 1 ώρα). Αυτό είναι ιδιαίτερα χρήσιμο, καθώς η πρόσβαση στα περιεχόμενα μπορεί να πραγματοποιηθεί πολλές φορές μέσα σε σύντομο χρονικό διάστημα (για παράδειγμα, για τον καθορισμό της κατάστασης συγχρονισμού και την εμφάνιση των περιεχομένων στη λειτουργία επεξεργασίας σύγκρισης). Οι υποκλάσεις θα πρέπει να εξακολουθούν να παρέχουν τη μοναδική ταυτότητα περιεχομένου μαζί με τον πίνακα byte, που μπορεί να είναι μόνιμη, προκειμένου να δημιουργηθεί εκ νέου ο δείκτης χειρισμού παραλλαγής πόρου.
Πολλοί παροχείς χώρου αποθήκευσης ενδέχεται να διαθέτουν ήδη ένα μηχανισμό για τη διαχείριση της κατάστασης συγχρονισμού τους (π.χ. αν έχουν ήδη πρόσθετες λειτουργίες). Η ResourceVariantTreeSubscriber και οι σχετικές με αυτή κλάσεις παρέχουν τη δυνατότητα δόμησης με βάση μια υπάρχουσα υποδομή συγχρονισμού. Για παράδειγμα, αυτή είναι η υπερκλάση όλων των συνδρομητών CVS.
Όπως αναφέρθηκε στο προηγούμενο παράδειγμα, η ThreeWaySubscriber είναι μια υποκλάση της ResourceVariantTreeSubscriber η οποία παρέχει συγχρονισμό του τοπικού χώρου εργασίας, χρησιμοποιώντας μια ThreeWaySynchronizer. Οι υποκλάσεις της ResourceVariantTreeSubscriber πρέπει να παρέχουν:
Υποκλάσεις της ResourceVariantTree (ή AbstractResourceVariantTree) που παρέχουν τη συμπεριφορά διάσχισης και ανανέωσης των απομακρυσμένων παραλλαγών πόρων και, για συνδρομητές που υποστηρίζουν συγκρίσεις τριών εκδοχών, τις βασικές παραλλαγές πόρων.
Οι άλλες δυνατότητες του συνδρομητή υλοποιούνται με τη χρήση των δυνατοτήτων αυτών.
Η ResourceVariantTree είναι μια κανονική υλοποίηση της IResourceVariantTree που παρέχει τα εξής:
Τα παρακάτω πρέπει να υλοποιούνται από υποκλάσεις:
Παρέχονται πραγματικές υλοποιήσεις της ResourceVariantByteStore που μονιμοποιούν τα bytes των επικλήσεων του πάγκου εργασίας (PersistantResourceVariantByteStore) ή αποθηκεύουν στη λανθάνουσα μνήμη μόνο τα bytes για την τρέχουσα συνεδρία (SessionResourceVariantByteStore). Ωστόσο, η δόμηση ενός συνδρομητή με βάση μια υπάρχουσα υποδομή συγχρονισμού χώρου εργασίας θα απαιτεί συνήθως την υλοποίηση των υποκλάσεων ResourceVariantByteStore που διασυνδέονται με την υποκείμενη λειτουργία συγχρονισμού. Για παράδειγμα, η ThreeWayRemoteTree χρησιμοποιεί μια υλοποίηση αποθήκευσης byte που αποθηκεύει τα απομακρυσμένα bytes της ThreeWaySynchronizer.
Η δημιουργία των δεικτών χειρισμού παραλλαγών πόρων για το παράδειγμα αυτό δεν διαφέρει από το προηγούμενο παράδειγμα, εκτός από το γεγονός ότι το αίτημα για τους δείκτες χειρισμού πραγματοποιείται από μια χρήση της διακλάδωσης παραλλαγής πόρου και όχι από το συνδρομητή.