Et projekt kan indeholde ressourcer, der ikke findes i projektets bibliotek på det lokale filsystem. Disse ressourcer kaldes sammenkædede ressourcer.
Sammenkædede ressourcer kan udgøre særlige udfordringer for udbydere af opbevaringssteder, som arbejder direkte med filsystemet. Dette er konsekvensen af, at sammenkædede ressourcer i henhold til deres design ikke findes i projektets direkte bibliotekstræstruktur i filsystemet.
Udbydere, som har følgende egenskaber, kan blive påvirket af sammenkædede ressourcer:
Lad os i det første tilfælde antage, at brugeren henter en sammenkædet ressource og forsøger at udføre en udbyderfunktion på den. Eftersom udbyderen kalder en kommandolinjeklient, kan vi antage, at udbyderen gør noget, der svarer til først at kalde IResource.getLocation().toOSString() og anvender den resulterende placering i filsystemet som argument for kommandolinjeprogrammet. Hvis den pågældende ressource er en sammenkædet ressource, bliver resultatet en fil/folder uden for projektets bibliotekstræstruktur. Ikke alle kommandolinjeklienter kan forvente og være i stand til at håndtere dette tilfælde. Kort sagt, hvis udbyderen nogen sinde henter en ressources placering i filsystemet, vil det sandsynligvis kræve ekstra arbejde at håndtere sammenkædede ressourcer.
Det andet tilfælde ligner meget, idet der ligger en implicit antagelse om, at strukturen af projektressourcerne er 1:1 med strukturen i filsystemets filer/foldere. Generelt kan en udbyder få problemer, hvis funktionerne IResource og java.io.File blandes. Ved link er den overordnede til IFile f.eks. ikke den samme som den overordnede til java.io.File, og kode, som antager, at disse er ens, vil ikke fungere korrekt.
Det er vigtigt, at introduktionen af sammenkædede ressourcer ikke utilsigtet blokerer for eksisterende udbydere. Særligt har hensynet til udbydere, som med rimelighed antog, at strukturen af det lokale filsystem afspejlede projektstrukturen, vejet tungt. Derfor kan sammenkædede ressourcer som standard ikke tilføjes til projekter, der er tilknyttet til en sådan udbyder vha. mapping. Desuden kan projekter, som indeholder sammenkædede ressourcer, som standard ikke deles med denne udbyder.
For at være "sammenkædningsvenlig" skal en udbyder tillade projekter med sammenkædede ressourcer at blive versionskontrolleret, men kan undlade at tillade versionskontrol af selve de sammenkædede ressourcer.
En betydeligt mere kompleks løsning kunne være at tillade versionering af de faktiske sammenkædede ressourcer, men dette kan ikke anbefales, da det medfører komplekse scenarier, f.eks. kan filen allerede være versionskontrolleret under en anden projekttræstruktur af en anden udbyder. Det er vores anbefaling at understøtte versionskontrollerede projekter, som indeholder ikke-versionskontrollerede sammenkædede ressourcer.
Udbydere af opbevaringssteder kan opgraderes til at understøtte sammenkædede ressourcer ved at tilsidesætte metoden RepositoryProvider.canHandleLinkedResources(), så den returnerer true. Når det er gjort, vil sammenkædede ressourcer kunne eksistere i projekter, der deles med denne udbyder af opbevaringssteder. Men udbyderen af opbevaringssteder skal træffe forholdsregler for at sikre, at sammenkædede ressourcer behandles korrekt. Som nævnt ovenfor, anbefales det kraftigt, at udbydere af opbevaringssteder ignorerer alle sammenkædede ressourcer. Det betyder, at sammenkædede ressourcer og deres underordnede skal udelukkes fra funktioner, der understøttes af udbyderen af opbevaringssteder. Desuden skal udbyderen af opbevaringssteder anvende standardfunktionsmåden for flytning og sletning til sammenkædede ressourcer, hvis implementeringen af udbyderen af opbevaringssteder tilsidesætter standard-IMoveDeleteHook.
Teamudbydere kan bruge IResource.isLinked() til at afgøre, om en ressource er et link. Men denne metode returnerer kun true for roden af et link. Følgende kodesegment kan bruges til at afgøre, om en ressource er underordnet til et link.
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
Udbydere af opbevaringssteder bør ignorere en ressource, hvor ovenstående kode evalueres til true.