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

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

Αρχεία που έχουν παραβλεφθεί

Σε πολλές περιπτώσεις, μπορεί να μην χρειάζεται να διατηρείτε κάποια αρχεία υπό τον έλεγχο του χώρου αποθήκευσης.  Για παράδειγμα, οι πόροι που δημιουργούνται από υπάρχοντες πόρους μπορούν συχνά να αγνοούνται από το χώρο αποθήκευσης.  Για παράδειγμα, μεταγλωττισμένα αρχεία πρωτογενούς κώδικα (όπως αρχεία Java ".class"), μπορούν να αγνοούνται, καθώς το αντίστοιχο αρχείο πρωτογενούς κώδικα (".java") βρίσκεται στο χώρο αποθήκευσης.  Επίσης μπορεί να μην είναι κατάλληλος ο έλεγχος εκδοχών για αρχεία μετα-δεδομένων τα οποία δημιουργούνται από παροχείς χώρου αποθήκευσης.  Το σημείο επέκτασης org.eclipse.team.core.ignore επιτρέπει στους παροχείς να δηλώνουν τα είδη αρχείων τα οποία θα πρέπει να παραβλέπονται για τις λειτουργίες του παροχέα χώρου αποθήκευσης.  Για παράδειγμα, ο πελάτης CVS δηλώνει το εξής:

<extension point="org.eclipse.team.core.ignore">
<ignore pattern = ".#*" selected = "true"/>
</extension>

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

Είδη αρχείων

Ορισμένοι χώροι αποθήκευσης υλοποιούν ένα διαφορετικό χειρισμό για αρχεία κειμένου ή για δυαδικά αρχεία.  Η επέκταση org.eclipse.team.core.fileTypes επιτρέπει σε πρόσθετες λειτουργίες να δηλώνουν είδη αρχείων ως αρχεία κειμένου ή δυαδικής μορφής.  Για παράδειγμα, τα εργαλεία Java δηλώνουν τα εξής:

<extension point="org.eclipse.team.core.fileTypes">
<fileTypes extension="java" type="text"/>

<fileTypes extension="classpath" type="text"/>
<fileTypes extension="properties" type="text"/>
<fileTypes extension="class" type="binary"/>

<fileTypes extension="jar" type="binary"/>
<fileTypes extension="zip" type="binary"/>
</extension>

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

Συνεργασία και διασυνδεδεμένοι πόροι

Ένα έργο μπορεί να περιέχει πόρους οι οποίοι δεν βρίσκονται μέσα στον κατάλογο του έργου, στο τοπικό σύστημα αρχείων. Οι πόροι αυτοί αναφέρονται ως διασυνδεδεμένοι πόροι.

Επιπτώσεις για παροχείς χώρου αποθήκευσης

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

Οι παροχείς που επιδεικνύουν τα παρακάτω χαρακτηριστικά ενδέχεται να επηρεάζονται από διασυνδεδεμένους πόρους:

  1. αυτοί που καλούν ένα εξωτερικό πρόγραμμα το οποίο στη συνέχεια λειτουργεί απευθείας στο σύστημα αρχείων.
  2. αυτοί οι οποίοι υλοποιούνται μέσω της IResource αλλά υποθέτουν ότι όλα τα αρχεία ή οι φάκελοι ενός έργου υπάρχουν ως άμεσα θυγατρικά στοιχεία αυτής της διακλάδωσης κεντρικού καταλόγου.

Στην πρώτη περίπτωση, ας υποθέσουμε ότι ο χρήστης διαλέγει ένα διασυνδεδεμένο πόρο και προσπαθεί να εκτελέσει μια λειτουργία παροχέα σε αυτόν. Καθώς ο παροχέας καλεί έναν πελάτη γραμμής εντολών, μπορούμε να υποθέσουμε ότι ο παροχέας πραγματοποιεί κάτι αντίστοιχο με την πρώτη κλήση της IResource.getLocation().toOSString(), τροφοδοτώντας τη θέση συστήματος αρχείων που προκύπτει ως ένα όρισμα στο πρόγραμμα της γραμμής εντολών. Εάν ο εν λόγω πόρος είναι ένας διασυνδεδεμένος πόρος, τότε η διαδικασία αυτή θα δώσει ένα αρχείο/φάκελο εκτός της διακλάδωσης του καταλόγου του έργου. Δεν θα πρέπει να αναμένεται ο χειρισμός της περίπτωσης αυτής από όλους τους πελάτες γραμμών εντολών. Συνοπτικά, αν ο παροχέας λάβει τη θέση συστήματος αρχείων ενός πόρου, θα χρειάζεται πιθανότατα επιπλέον εργασία για να χειριστεί διασυνδεδεμένους πόρους.

Η δεύτερη περίπτωση είναι παρόμοια στο ότι αποτελεί μια έμμεση υπόθεση ότι η δομή των πόρων του έργου είναι 1:1 με αυτή των φακέλων/αρχείων του συστήματος αρχείων. Γενικά, ο παροχέας μπορεί να αντιμετωπίσει πρόβλημα, αν αναμιχθούν λειτουργίες IResource και java.io.File. Για παράδειγμα, για διασυνδέσεις, το γονικό στοιχείο της διεπαφής IFile δεν είναι το ίδιο με το γονικό στοιχείο του java.io.File, οπότε ο κώδικας ο οποίος υποθέτει ότι αυτά είναι ίδια θα αποτυγχάνει.

Συμβατότητα με προηγούμενες εκδόσεις

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

Στρατηγικές για το χειρισμό διασυνδεδεμένων πόρων

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

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

Τεχνικές λεπτομέρειες για "φιλική" διασύνδεση

Οι υλοποιήσεις παροχέα χώρου αποθήκευσης μπορούν να αναβαθμιστούν, με αντικατάσταση της μεθόδου RepositoryProvider.canHandleLinkedResources() ώστε να επιστρέφει την τιμή true. Αφού γίνει αυτό, οι διασυνδεδεμένοι πόροι θα μπορούν να υπάρχουν σε έργα τα οποία είναι κοινόχρηστα με αυτόν τον παροχέα χώρου αποθήκευσης. Ωστόσο, ο παροχέας χώρου αποθήκευσης πρέπει να εκτελέσει κάποια βήματα ώστε να διασφαλίσει ότι ο χειρισμός των διασυνδεδεμένων πόρων πραγματοποιείται σωστά. Όπως αναφέρθηκε παραπάνω, συστήνεται η παράβλεψη όλων των διασυνδεδεμένων πόρων από τους παροχείς χώρου αποθήκευσης. Αυτό σημαίνει ότι οι διασυνδεδεμένοι πόροι (και τα θυγατρικά τους στοιχεία) θα πρέπει να αποκλείονται από τις ενέργειες οι οποίες υποστηρίζονται από τον παροχέα χώρου αποθήκευσης. Επίσης, ο παροχέας χώρου αποθήκευσης θα πρέπει να χρησιμοποιεί την προεπιλεγμένη συμπεριφορά μετακίνησης και διαγραφής για διασυνδεδεμένους πόρους, αν η υλοποίηση του παροχέα χώρου αποθήκευσης αντικαθιστά την προεπιλεγμένη διεπαφή IMoveDeleteHook.

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

String linkedParentName = resource.getProjectRelativePath().segment(0);
IFolder linkedParent = resource.getProject().getFolder(linkedParentName);
boolean isLinked = linkedParent.isLinked();

Οι παροχείς χώρου αποθήκευσης θα πρέπει να παραβλέπουν κάθε πόρο για τον οποίο ο παραπάνω κώδικας δίνει την τιμή true.

Ιδιωτικοί πόροι σε μια συνεργασία

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

Οι παροχείς συνεργασίας μπορούν να χρησιμοποιούν τη μέθοδο IResource.setTeamPrivateMember(boolean) για να υποδεικνύουν ότι ένας πόρος είναι ιδιωτικός για την υλοποίηση ενός παροχέα συνεργασίας. Οι νέοι δημιουργημένοι πόροι δεν είναι ιδιωτικοί, ως προεπιλογή, επομένως αυτή η μέθοδος πρέπει να χρησιμοποιείται για τη ρητή σημείωση του πόρου ως ιδιωτικό πόρο ομάδας.  Μια κοινή χρήση είναι η σημείωση ενός υποφακέλου του έργου ως ιδιωτικό σε μια συνεργασία, όταν ένα έργο ρυθμίζεται για μια συνεργασία και δημιουργείται ο υποφάκελος αυτός.

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

Οι προσπάθειες σημείωσης των έργων ή της αφετηρίας του χώρου εργασίας ως ιδιωτικό σε μια συνεργασία θα παραβλέπονται.

Σύνολα έργων

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

 

Στην έκδοση 3.0, στην κλάση ProjectSetCapability προστέθηκε ένα API, που επιτρέπει τη δήλωση μιας κλάσης η οποία υλοποιεί την αποθήκευση έργων για έργα που ανήκουν σε αυτή.  Όταν ο χρήστης επιλέγει την εξαγωγή συνόλων έργων, τότε ως υποψήφια για την εξαγωγή εμφανίζονται μόνο τα έργα τα οποία έχουν ρυθμιστεί με χώρους αποθήκευσης. Αυτό το API αντικαθιστά το παλαιό API σειριοποίησης συνόλου έργων (δείτε παρακάτω).

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

<extension point="org.eclipse.team.core.repository">
<repository
typeClass="org.eclipse.team.internal.ccvs.core.CVSTeamProviderType"

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

Στην έκδοση 3.0, το σημείο επέκτασης org.eclipse.team.core.projectSets επέτρεπε στους παροχείς του χώρου αποθήκευσης να δηλώνουν μια κλάση η οποία υλοποιεί την αποθήκευση έργων για έργα που ανήκουν σε αυτή.  Όταν ο χρήστης επιλέγει την εξαγωγή συνόλων έργων, τότε ως υποψήφια για την εξαγωγή εμφανίζονται μόνο τα έργα τα οποία έχουν ρυθμιστεί με χώρους αποθήκευσης.

Για παράδειγμα, ο πελάτης CVS δηλώνει το εξής:

<extension point="org.eclipse.team.core.projectSets">
<projectSets id="org.eclipse.team.cvs.core.cvsnature" class="org.eclipse.team.internal.ccvs.ui.CVSProjectSetSerializer"/>
</extension>

Η καθορισμένη κλάση πρέπει να υλοποιεί τη διεπαφή IProjectSetSerializer. Η χρήση της διεπαφής αυτής εξακολουθεί να υποστηρίζεται στην έκδοση 3.0, αλλά έχει καταργηθεί.