Projekt może zawierać zasoby, które znajdują się poza katalogiem projektu w lokalnym systemie plików. Zasoby te określa się mianem zasobów dowiązanych.
Zasoby dowiązane mogą stawiać konkretne wyzwania przed dostawcami repozytorium, którzy działają bezpośrednio w odniesieniu do systemu plików. Jest to konsekwencją faktu, że zasobów dowiązanych, zgodnie z ich naturą, nie ma w natychmiastowym drzewie katalogu projektu w systemie plików.
Zasoby dowiązane mogą mieć niekorzystny wpływ na dostawców wykazujących następujące cechy:
W pierwszym przypadku można przyjąć, że użytkownik wybiera zasób dowiązany i próbuje wykonać na nim operację dostawcy. Ponieważ dostawca wywołuje klienta wiersza komend, przyjmuje się, że dostawca robi coś odpowiadającego wywołaniu najpierw metody IResource.getLocation().toOSString() i użyciu zwróconego położenia w systemie plików jako argumentu programu wiersza komend. Gdy dany zasób jest zasobem dowiązanym, metoda ta dostarczy plik/folder leżący poza drzewem katalogu projektów. Nie każdy klient wiersza komend może tego oczekiwać i umieć obsłużyć taki przypadek. Mówiąc krótko, gdy dany dostawca kiedykolwiek pobiera położenie zasobu w systemie plików, najprawdopodobniej będzie musiał wykonać dodatkową pracę, aby obsłużyć zasoby dowiązane.
Drugi przypadek jest całkiem podobny, gdyż w sposób jawny zakłada się w nim, że struktura zasobów projektu jest odwzorowaniem plików/folderów systemu plików w stosunku 1:1. W ogólności dostawca mógłby mieć problem w przypadku mieszanych operacji IResource i java.io.File. Na przykład dla dowiązań element nadrzędny obiektu IFile nie jest tym samym, co element nadrzędny operacji java.io.File, a wykonanie kodu, który zakładałby równoważność, nie powiedzie się.
Istotną kwestią w momencie wprowadzania zasobów dowiązanych było to, aby niechcąco nie spowodowały one błędów w działaniu istniejących dostawców. W szczególności dotyczyło to dostawców, dla których racjonalnie przyjęto, że lokalny system plików odzwierciedla strukturę projektu. W rezultacie domyślnie nie można dodawać zasobów dowiązanych do projektów odwzorowanych na takiego dostawcę. Dodatkowo, projekty zawierające zasoby dowiązane domyślnie nie mogą być współużytkowane z takim dostawcą.
Aby dostawca był "przyjazny dla dowiązań", powinien umożliwiać kontrolę wersji dla projektów z zasobami dowiązanymi, ale może wykluczać kontrolę wersji samych zasobów dowiązanych.
Znacznie bardziej złożonym rozwiązaniem byłoby umożliwienie kontroli wersji rzeczywistych zasobów dowiązanych, jednak należy to odradzać, ponieważ może to skutkować koniecznością brania pod uwagę skomplikowanych scenariuszy (np. plik może już podlegać kontroli wersji w drzewie innego projektu przez innego dostawcę). Dlatego zaleca się obsługę projektów podlegających kontroli wersji, które zawierają zasoby dowiązane niepodlegające kontroli wersji.
Implementacje dostawców repozytorium można zaktualizować w celu obsługi zasobów dowiązanych, przesłaniając metodę RepositoryProvider.canHandleLinkedResources() w taki sposób, aby zwracała wartość true.Dzięki temu zasoby dowiązane będą mogły istnieć w projektach współużytkowanych przez tego dostawcę repozytorium. Jednak dostawca repozytorium musi jeszcze przedsiębrać kroki zapewniające poprawną obsługę zasobów dowiązanych. Jak wspomniano wcześniej, usilnie zaleca się, aby dostawcy repozytoriów ignorowali wszystkie zasoby dowiązane. Oznacza to, że zasoby dowiązane (i ich elementy podrzędne) powinny być wyłączone z akcji obsługiwanych przez dostawcę repozytorium. Co więcej, dostawca repozytorium powinien używać domyślnego zachowania dla operacji przenoszenia i usuwania zasobów dowiązanych, gdy implementacja dostawcy repozytorium przesłania domyślną klasę IMoveDeleteHook.
W celu określenia, czy dany zasób jest dowiązany, dostawcy repozytorium mogą używać metody IResource.isLinked(). Jednak metoda ta zwraca wartość true tylko dla elementu głównego dowiązania. W celu określenia, czy dany zasób jest elementem podrzędnym dowiązania można użyć poniższego fragmentu kodu.
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
Dostawcy repozytoriów powinni ignorować wszelkie zasoby, dla których powyższy kod zwraca wartość true.