Διασυνδεδεμένοι πόροι

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

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

Οι διασυνδεδεμένοι πόροι δημιουργούνται με χρήση της μέθόδου IFolder.createLink ή IFile.createLink. Για να καθορίσετε, σε προγραμματιστικό επίπεδο, αν ένας δεδομένος πόρος είναι ένας διασυνδεδεμένος πόρος, μπορείτε να χρησιμοποιήσετε τη μέθοδο IResource.isLinked. Σημειώστε ότι αυτή η μέθοδο θα επιστρέψει μόνο την τιμή true για διασυνδεδεμένους πόρους, και όχι για τα θυγατρικά στοιχεία των διασυνδεδεμένων πόρων.

Εκτός από αυτές τις ειδικές μεθόδους για τη δημιουργία διασυνδεδεμένων πόρων και την επαλήθευση του εάν κάποιος πόρος είναι διασυνδεδεμένος, μπορείτε, κατά το χειρισμό διασυνδεδεμένων πόρων, να χρησιμοποιήσετε ένα κανονικό API χώρου εργασίας. Οι διασυνδεδεμένοι πόροι στις περισσότερες πλευρές τους, συμπεριφέρονται ακριβώς όπως και ένας οποιοσδήποτε άλλος πόρος στο χώρο εργασίας. Ωστόσο, ισχύουν ορισμένοι περιορισμοί κατά τη μετακίνηση, αντιγραφή ή διαγραφή διασυνδεδεμένων πόρων.   Δείτε την κλάση IResource και τις υπο-κλάσεις της για πληροφορίες σχετικά με μεμονωμένες λειτουργίες και τους περιορισμούς τους.

Μεταβλητές διαδρομής

Μπορείτε να χρησιμοποιήσετε τις μεταβλητές διαδρομής όταν καθορίζετε τη θέση των διασυνδεδεμένων πόρων.  Μια μεταβλητή διαδρομής είναι μια απλή (String -> IPath) ή (String -> URI) αντιστοιχία που καθορίζει μια συντόμευση για μια θέση σε ένα σύστημα αρχείων.  Οι μεταβλητές μπορούν να διευκολύνουν τη διαχείριση των διασυνδεδεμένων πόρων μειώνοντας τον αριθμό θέσεων όπου χρησιμοποιούνται απόλυτες μη-προσαρμόσιμες διαδρομές συστήματος αρχείων.

Οι μεταβλητές διαδρομής διευκολύνουν τη διαχείριση των διασυνδεδεμένων πόρων για χρήστες με αρκετούς τρόπους:

Το τελευταίο στοιχείο σε αυτή τη λίστα αξίζει περαιτέρω ανάλυση. Όταν κάποιος χρήστης δημιουργεί ένα διασυνδεδεμένο πόρο σε ένα έργο, η περιγραφή του διασυνδεδεμένου πόρου προστίθεται στο αρχείο περιγραφής έργου (".project") στη θέση του έργου. Χρησιμοποιώντας μια μεταβλητή διαδρομής, οι χρήστες μπορούν να κάνουν κοινή χρήση ενός έργου (αντιγράφοντας το περιεχόμενο του έργου ή χρησιμοποιώντας ένα χώρο αποθήκευσης), και καθορίζοντας εκ νέου τη μεταβλητή ώστε να ταιριάζει με κάθε μεμονωμένο σταθμό εργασίας.  Για παράδειγμα, κάποιος χρήστης μπορεί να αποθηκεύσει εξωτερικούς πόρους στη θέση c:\temp στο σύστημα, ενώ κάποιος άλλος χρήστης μπορεί με τη βοήθεια του Unix να αποθηκεύσει τους ίδιους πόρους στο /home/username/tmp.  Ο καθορισμός μιας μεταβλητής διαδρομής σε κάθε χώρο εργασίας (TEMP=c:\temp και TEMP=/home/userb/tmp) επιτρέπει στους χρήστες να επιλύσουν αυτή τη διαφορά και να κάνουν κοινή χρήση έργων με διασυνδεδεμένους πόρους ως έχουν.

Η κλάση IPathVariableManager καθορίζει το API για τη δημιουργία, το χειρισμό και την ανάλυση μεταβλητών διαδρομής. Επίσης παρέχει μεθόδους για την επικύρωση ονομάτων και τιμών μεταβλητών πριν από τη δημιουργία τους, και για την εγκατάσταση μιας λειτουργίας ακρόασης που θα ειδοποιείται όταν οι ορισμοί των μεταβλητών διαδρομής αλλάζουν. Μπορείτε να αποκτήσετε μια χρήση αυτής της κλάσης με χρήση της μεθόδου IWorkspace.getPathVariableManager. Δείτε τα παραδείγματα κώδικα στο τέλος της παρούσας ενότητας για περισσότερες πληροφορίες.

Η μέθοδος IResource.getRawLocationURI μπορεί να χρησιμοποιηθεί για τον εντοπισμό της μη-αναλυμένης θέσης ενός διασυνδεδεμένου πόρου. Δηλαδή, τον εντοπισμό του πραγματικού ονόματος της μεταβλητής διαδρομής αντί για την ανάλυσή του με βάση την τιμή του.  Εάν μια θέση πόρου δεν έχει προσδιοριστεί με μια μεταβλητή διαδρομής, η μέθοδος getRawLocationURI λειτουργεί ακριβώς όπως και η μέθοδος getLocationURI.

Κατεστραμμένες διασυνδέσεις

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

Συμβατότητα με εγκατεστημένες πρόσθετες λειτουργίες

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

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

<extension
	id="myNature"
	name="My Nature"
	point="org.eclipse.core.resources.natures">
	<runtime>
		<run class="com.xyz.MyNature"/>
	</runtime>
	<options allowLinking="false"/>
</extension>

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

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

Τέλος, υπάρχει μια ρύθμιση προτίμησης την οποία μπορείτε να χρησιμοποιήσετε προκειμένου να απενεργοποιήσετε τους διασυνδεδεμένους πόρους για το σύνολο του χώρου εργασίας. Ενώ οι προηγούμενοι δύο μηχανισμοί απόρριψης λειτουργούν σε μια βάση ανά έργο, αυτή η προτίμηση επηρεάζει όλα τα έργα στο χώρο εργασίας. Για να ορίσετε αυτή την προτίμηση σε επίπεδο προγραμματισμού, χρησιμοποιήστε την προτίμηση ResourcesPlugin.PREF_DISABLE_LINKING. Σημειώστε ότι ακόμα κι αν έχει οριστεί, οι χρήστες μπορούν να την παρακάμψουν απενεργοποιώντας την προτίμηση.

Διασυνδεδεμένοι πόροι σε κώδικα

Ας δούμε όμως ορισμένα παραδείγματα διασυνδεδεμένων πόρων σε κώδικα. Θα ξεκινήσουμε καθορίζοντας μια μεταβλητή διαδρομής:

      IWorkspace workspace = ResourcesPlugin.getWorkspace();
   IPathVariableManager pathMan = workspace.getPathVariableManager();
   String name = "TEMP";
   IPath value = new Path("c:\\temp");
   if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) {
      pathMan.setValue(name, value);
        } else {
      //invalid name or value, throw an exception or warn user
   }

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

   IProject project = workspace.getProject("Project");//assume this exists
   IFolder link = project.getFolder("Link");
   IPath location = new Path("TEMP/folder");
   if (workspace.validateLinkLocation(location).isOK()) {
      link.createLink(location, IResource.NONE, null);
        } else {
      //invalid location, throw an exception or warn user
   }

Αυτό ήταν! Έχετε τώρα στη διάθεσή σας ένα διασυνδεδεμένο φάκελο στο χώρο εργασίας σας που ονομάζεται "Διασύνδεση" και βρίσκεται στη θέση "c:\temp\folder".

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

   link.getFullPath() ==> "/Project/Link"
   link.getLocation() ==> "c:\temp\folder"
   link.getRawLocation() ==> "TEMP/folder"
   link.isLinked() ==> "true"
   
   IFile child = link.getFile("abc.txt");
   child.create(...);
   child.getFullPath() ==> "/Project/Link/abc.txt"
   child.getLocation() ==> "c:\temp\folder\abc.txt"
   child.getRawLocation() ==> "c:\temp\folder\abc.txt"
   child.isLinked() ==> "false"