Παροχείς χώρου αποθήκευσης

Ένας παροχέας χώρου αποθήκευσης (RepositoryProvider) είναι η κεντρική κλάση στην υλοποίηση του χώρου αποθήκευσής σας.  Η κλάση αυτή είναι υπεύθυνη για τη ρύθμιση ενός έργου για διαχείριση του χώρου αποθήκευσης και για την παροχή των απαραίτητων ρουτινών για τροποποίηση πόρων.  Οι παροχείς αντιστοιχίζονται σε ένα έργο με τη χρήση των μόνιμων ιδιοτήτων έργου.  Ο μηχανισμός για την αντιστοίχιση παροχέων σε ένα έργο δεν είναι κεντρικός στο API συνεργασίας, αλλά θα πρέπει να τον λαμβάνετε υπόψη όταν φιλτράρετε τους πόρους του περιβάλλοντος χρήστη.  Για το μεγαλύτερο μέρος, θα χρησιμοποιήσετε το API συνεργασίας για να εργαστείτε στα έργα και να τα συσχετίσετε με τον παροχέα σας.  

Για να υλοποιήσετε έναν παροχέα, πρέπει να ορίσετε έναν χώρο αποθήκευσης, χρησιμοποιώντας το σημείο επέκτασηςorg.eclipse.team.core.repository και να δώσετε μια κλάση που δημιουργείται από την κλάση  RepositoryProvider.  Θα χρησιμοποιήσουμε τον πελάτη CVS ως παράδειγμα για να δούμε πώς λειτουργεί.

Σημείο επέκτασης

Το σημείο επέκτασης org.eclipse.team.core.repository χρησιμοποιείται για την προσθήκη ενός ορισμού χώρου αποθήκευσης.  Παρακάτω δίνεται ο κώδικας για τον πελάτη CVS.

<extension
point="org.eclipse.team.core.repository">
<repository
class="org.eclipse.team.internal.ccvs.core.CVSTeamProvider"
id="org.eclipse.team.cvs.core.cvsprovider">
</repository>
</extension>

Με τον τρόπο αυτό, καταχωρείται ο παροχέας συνεργασίας με την πρόσθετη λειτουργία υποστήριξης συνεργασίας και αναθέτει μια ταυτότητα, η οποία θα πρέπει να χρησιμοποιείται όταν ο παροχέας σας συσχετίζεται με ένα έργο.  Η προσδιορισμένη κλάση για το χώρο αποθήκευσης πρέπει να επεκτείνει την RepositoryProvider.

Υλοποίηση κλάσης RepositoryProvider

Η κλάση που προσδιορίζεται στο σημείο επέκτασης πρέπει να είναι μια υποκλάση της RepositoryProvider. Ο κύριος ρόλος της είναι να πραγματοποιεί και να αναιρεί τις ρυθμίσεις ενός έργου για την υποστήριξη του χώρου αποθήκευσης και να παρέχει τις απαραίτητες ρουτίνες τροποποίησης πόρων.  Ο πελάτης CVS αποτελεί ένα καλό παράδειγμα.  Ο παροχέας χώρου αποθήκευσης σε αυτόν είναι η CVSTeamProvider.

public class CVSTeamProvider extends RepositoryProvider {
...

Η κλάση RepositoryProvider ορίζει δύο αφηρημένες μεθόδους, τις configureProject και deconfigure.  Όλοι οι παροχείς πρέπει να υλοποιούν τις μεθόδους αυτές. 

Η ρύθμιση ενός έργου πραγματοποιείται όταν αυτό συσχετίζεται για πρώτη φορά με ένα συγκεκριμένο παροχέα χώρου αποθήκευσης.  Αυτό συμβαίνει συνήθως όταν ο χρήστης επιλέγει ένα έργο και χρησιμοποιεί τους οδηγούς συνεργασίας για να συσχετίσει ένα έργο με το δικό σας χώρο αποθήκευσης.  Ανεξάρτητα από τον τρόπο με τον οποίο ενεργοποιείται η λειτουργία, αυτή είναι η κατάλληλη στιγμή για τον υπολογισμό ή την αποθήκευση στη λανθάνουσα μνήμη όλων των δεδομένων σχετικά με το έργο, τα οποία θα χρειαστείτε για την παροχή της λειτουργίας του χώρου αποθήκευσης.  (Υποθέτουμε ότι η αντιστοίχιση του έργου στον παροχέα σας έχει ήδη πραγματοποιηθεί.  Θα φροντίσετε για αυτό στον οδηγό ρυθμίσεών σας.)

Ο παροχέας CVS απλά μεταδίδει το γεγονός ότι έχουν πραγματοποιηθεί οι ρυθμίσεις ενός έργου:

public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}

Δεν θα παρακολουθήσουμε το μηχανισμό μετάδοσης της υλοποίησης της πρόσθετης λειτουργίας.  Αρκεί να πούμε ότι οποιοδήποτε τμήμα πρέπει να υπολογίσει ή να αποδώσει αρχικές τιμές σε ειδικά δεδομένα του έργου μπορεί να το κάνει τη στιγμή αυτή.

Η αναίρεση των ρυθμίσεων ενός έργου πραγματοποιείται όταν ο χρήστης δεν επιθυμεί πλέον τη συσχέτιση ενός παροχέα συνεργασίας με ένα έργο.   Η υλοποίηση της ενέργειας χρήστη η οποία οδηγεί στην πραγματοποίηση της αναίρεσης αυτής εξαρτάται από τη δική σας πρόσθετη λειτουργία (εδώ θα πραγματοποιείται και η αναίρεση της αντιστοίχισης του έργου με το δικό σας παροχέα συνεργασίας).  Η μέθοδος deconfigure  αποτελεί την κατάλληλη στιγμή για τη διαγραφή της λανθάνουσας μνήμης που σχετίζεται με το έργο ή την αφαίρεση τυχόν παραπομπών στο έργο από το περιβάλλον χρήστη.  Ο παροχέας CVS πραγματοποιεί την εκκαθάριση της λανθάνουσας μνήμης που σχετίζεται με τον παροχέα, η οποία διατηρείται στις προβολές του και μεταδίδει το γεγονός της αναίρεσης των ρυθμίσεων του έργου.

public void deconfigure() throws CoreException {
...
try {
EclipseSynchronizer.getInstance().flush(getProject(), true, true /*flush deep*/, null);
} catch(CVSException e) {
throw new CoreException(e.getStatus());
} finally {
CVSProviderPlugin.broadcastProjectDeconfigured(getProject());
}
}

Ρύθμιση ενός έργου

Συνήθως, το πρώτο βήμα για τη δόμηση ενός περιβάλλοντος χρήστη συνεργασίας είναι η υλοποίηση μιας σελίδας οδηγού, όπου επιτρέπεται στους χρήστες η ρύθμιση ενός έργου για την υποστήριξη συνεργασίας της δικής σας πρόσθετης λειτουργίας.  Στο σημείο αυτό θα προστεθεί η ταυτότητα του δικού σας παροχέα συνεργασίας στις ιδιότητες του έργου.  Συμμετέχετε στη ρύθμιση του έργου συνεισφέροντας στο σημείο επέκτασης org.eclipse.team.ui.configurationWizards.  Ο οδηγός αυτός εμφανίζεται όταν ο χρήστης επιλέξει Συνεργασία -> Κοινή χρήση έργου...

Θα εξετάσουμε την περίπτωση αυτή στο περιβάλλον της υλοποίησης πελάτη CVS.  Παρακάτω δίνεται ο κώδικας περιβάλλοντος χρήστη CVS για τον οδηγό ρυθμίσεών του:

<extension
point="org.eclipse.team.ui.configurationWizards">
<wizard
name="%SharingWizard.name"
icon="icons/full/wizards/newconnect_wiz.png"
class="org.eclipse.team.internal.ccvs.ui.wizards.SharingWizard"
id="org.eclipse.team.ccvs.ui.SharingWizard">
</wizard>
</extension>

Ως συνήθως, οι πρόσθετες λειτουργίες παρέχουν μια κλάση η οποία υλοποιεί το σημείο επέκτασης και μια μοναδική ταυτότητα που προσδιορίζει την επέκτασή τους.  Το όνομα και το εικονίδιο εμφανίζονται στην πρώτη σελίδα του οδηγού ρυθμίσεων έργου, εάν υπάρχουν περισσότεροι του ενός παροχείς από τους οποίους πρέπει να επιλέξετε.

Μόλις ο χρήστης επιλέξει έναν παροχέα, η επόμενη σελίδα εμφανίζει τις συγκεκριμένες πληροφορίες ρυθμίσεων για τον παροχέα σας.  (Αν ο παροχέας σας είναι η μόνη εγκατεστημένη πρόσθετη λειτουργία παροχής συνεργασίας, τότε ο οδηγός μεταβαίνει απευθείας στη σελίδα σας.)  Ο οδηγός σας πρέπει να υλοποιεί τη διεπαφή IConfigurationWizard, η οποία αποδίδει αρχικές τιμές στον οδηγό για ένα καθορισμένο πάγκο εργασίας και έργο.  Το υπόλοιπο τμήμα της υλοποίησης εξαρτάται από τη σχεδίαση του οδηγού σας. Πρέπει να συγκεντρώσετε όλες τις πληροφορίες που απαιτούνται για τη συσχέτιση του έργου με την υποστήριξη συνεργασίας που διαθέτετε.

Όταν ο οδηγός ολοκληρωθεί, πρέπει να αντιστοιχίσετε το δικό σας παροχέα συνεργασίας με το έργο χρησιμοποιώντας τη μέθοδο RepositoryProvider.map(IProject, String).  Η αντιστοίχιση χειρίζεται την ανάθεση της σωστής μόνιμης ιδιότητας του έργου στο έργο σας.

Ο πελάτης CVS πραγματοποιεί την εργασία αυτή στη μέθοδο setSharing του παροχέα σας, η οποία καλείται όταν ο οδηγός ολοκληρώνεται:

public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {

// Ensure provided info matches that of the project
...
// Ensure that the provided location is managed
...
// Register the project with Team
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}

Εύρεση ενός παροχέα

Οι στατικές μέθοδοι στην κλάση RepositoryProvider διευκολύνουν τους πελάτες να αντιστοιχίζουν έργα σε παροχείς και να βρίσκουν τους παροχείς που συσχετίζονται με ένα δεδομένο έργο.

Παροχείς χώρου αποθήκευσης και δυνατότητες

Αν ένα προϊόν επιλέξει να προσθέσει μια πρόσθετη λειτουργία χώρου αποθήκευσης σε μια δυνατότητα, θα πρέπει να συνδέσει τη δυνατότητα με την ταυτότητα του χώρου αποθήκευσης. Παρακάτω δίνονται τα δύο βήματα που πρέπει να εκτελεστούν για την ενεργοποίηση μιας κλάσης RepositoryProvider ως μια δυνατότητα.

  1. Συνδέστε τη δυνατότητα με την ταυτότητα παροχέα χώρου αποθήκευσης. Έτσι, η πρόσθετη λειτουργία συνεργασίας θα έχει τη δυνατότητα να ενεργοποιείται/απενεργοποιείται με βάση τις ταυτότητες παροχέων χώρου αποθήκευσης.
    <activityPatternBinding
        activityId="org.eclipse.team.cvs"
        pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
    </activityPatternBinding>
  2. Στη συνέχεια, συνδέστε τη δυνατότητα σε όλα τα πακέτα του περιβάλλοντος χρήστη για τον παροχέα:
    <activityPatternBinding
         activityId="org.eclipse.team.cvs"
         pattern="org\.eclipse\.team\.cvs\.ui/.*">
    </activityPatternBinding>

Υπάρχουν δύο σημεία ενεργοποίησης δυνατοτήτων που ορίζονται από τις πρόσθετες λειτουργίες συνεργασίας. Το πρώτο είναι ο οδηγός Συνεργασία > Κοινή χρήση έργου..., ο οποίος επιτρέπει το φιλτράρισμα των παροχέων χώρου αποθήκευσης με βάση την κατάσταση ενεργοποίησης/απενεργοποίησης των δυνατοτήτων του πάγκου εργασίας. Το δεύτερο είναι η αυτόματη ενεργοποίηση πρόσθετης λειτουργίας συνεργασίας.

Ρουτίνες τροποποίησης πόρου

Οι περισσότερες από τις ενδιαφέρουσες λειτουργίες που συσχετίζονται με έναν παροχέα χώρου αποθήκευσης πραγματοποιούνται καθώς ο χρήστης εργάζεται με τους πόρους του έργου, το οποίο ρυθμίζεται για τον παροχέα.  Προκειμένου να ενημερώνεται για τις αλλαγές που πραγματοποιεί ο χρήστης σε έναν πόρο, ο παροχέας μπορεί να υλοποιεί ρουτίνες τροποποίησης πόρων.  Η πρόσθετη λειτουργία πόρων παρέχει τις ρουτίνες αυτές ως σημεία επέκτασης.  Στην τεκμηρίωση των IMoveDeleteHook, IFileModificationValidator και ResourceRuleFactory περιγράφονται οι λεπτομέρειες για την υλοποίηση των ρουτινών αυτών.

Η πρόσθετη λειτουργία συνεργασίας βελτιστοποιεί και απλοποιεί τη συσχέτιση της ρουτίνας με τους αντίστοιχους πόρους, καταχωρώντας γενικές ρουτίνες μαζί με την πρόσθετη λειτουργία πόρων.  Αυτές οι γενικές ρουτίνες απλά αναζητούν στον παροχέα χώρου αποθήκευσης έναν δεδομένο πόρο και λαμβάνουν τη ρουτίνα του.  Το γεγονός αυτό έχει το πλεονέκτημα ότι καλείται μία μόνο ρουτίνα παροχέα και δεν απαιτείται από κάθε υλοποίηση παροχέα η καταχώρηση μιας ρουτίνας, η οποία θα πρέπει να ελέγχει πρώτα αν η διαχείριση του πόρου πραγματοποιείται από τον παροχέα.

Αυτό σημαίνει ότι παρέχετε όλες τις απαραίτητες ρουτίνες αντικαθιστώντας μεθόδους στην κλάση RepositoryProvider.  Η προεπιλεγμένη υλοποίηση των μεθόδων αυτών δίνει την τιμή null, υποδεικνύοντας ότι δεν απαιτείται καμία ρουτίνα (εκτός από τη μέθοδο κατασκευής κανόνων πόρου, όπως περιγράφεται παρακάτω):