Ένα έργο μπορεί να περιέχει πόρους οι οποίοι δεν βρίσκονται μέσα στον κατάλογο του έργου, στο τοπικό σύστημα αρχείων. Οι πόροι αυτοί αναφέρονται ως διασυνδεδεμένοι πόροι.
Οι διασυνδεδεμένοι πόροι μπορούν να θέτουν ιδιαίτερες προκλήσεις για τους παροχείς χώρου αποθήκευσης οι οποίοι λειτουργούν απευθείας στο σύστημα αρχείων. Αυτό αποτελεί συνέπεια του γεγονότος ότι οι διασυνδεδεμένοι πόροι, εκ του σχεδιασμού τους, δεν υπάρχουν στην άμεση διακλάδωση του καταλόγου του έργου στο σύστημα αρχείων.
Οι παροχείς που επιδεικνύουν τα παρακάτω χαρακτηριστικά ενδέχεται να επηρεάζονται από διασυνδεδεμένους πόρους:
Στην πρώτη περίπτωση, ας υποθέσουμε ότι ο χρήστης διαλέγει ένα διασυνδεδεμένο πόρο και προσπαθεί να εκτελέσει μια λειτουργία παροχέα σε αυτόν. Καθώς ο παροχέας καλεί έναν πελάτη γραμμής εντολών, μπορούμε να υποθέσουμε ότι ο παροχέας πραγματοποιεί κάτι αντίστοιχο με την πρώτη κλήση της 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.