Projektissa voi olla resursseja, jotka eivät sijaitse paikallisessa tiedostojärjestelmässä projektin hakemistossa. Tällaisia resursseja kutsutaan linkitetyiksi resursseiksi.
Linkitetyt resurssit voivat aiheuttaa haastavia tilanteita sellaisille tietovarastojen toimittajille, jotka käyttävät suoraan tiedostojärjestelmää. Linkitetyt resurssit eivät nimittäin sijaitse tiedostojärjestelmässä projektin hakemistorakenteessa.
Linkitetyt resurssit saattavat vaikuttaa sellaisiin tietovaraston toimittajiin, joihin seuraava kuvaus sopii:
Oletetaan ensimmäisessä tapauksessa, että käyttäjä valitsee linkitetyn resurssin ja yrittää käyttää siihen jotakin toimittajan toimintoa. Tietovaraston toimittaja kutsuu komentorivin työasemaohjelmaa, joten voimme olettaa, että toimittaja kutsuu ensin esimerkiksi metodia IResource.getLocation().toOSString() ja syöttää saamansa tiedostojärjestelmäsijainnin argumenttina komentoriviohjelmaan. Jos kyseinen resurssi on linkitetty resurssi, tuloksena on projektin hakemistorakenteen ulkopuolella oleva tiedosto tai kansio. Jotkin komentorivin työasemaohjelmat eivät pysty käsittelemään tällaista tilannetta. Lyhyesti voidaan todeta, että jos tietovaraston toimittaja vastaanottaa resurssin sijainnin tiedostojärjestelmässä, linkitettyjen resurssien käsittely edellyttää todennäköisesti ylimääräistä työtä.
Toinen tilanne on melko samanlainen, sillä siihen sisältyy oletus siitä, että projektin resurssien rakenne vastaa täydellisesti tiedostojärjestelmän tiedostojen ja kansioiden rakennetta. Toimittajat saattavat joutua ongelmatilanteeseen, jos ne sekoittavat IResource- ja java.io.File-toimintoja. Linkkien osalta kohteen IFile pääobjekti ei ole sama kuin java.io.File-kohteen pääobjekti, joten jos koodi olettaa näiden kohteiden vastaavan toisiaan, koodin ajo epäonnistuu.
Pidettiin tärkeänä, että linkitettyjen resurssien esittely ei tahattomasti särkenyt aiemmin luotuja tietovarastojen toimittajia. Tarkemmin ottaen huolta aiheuttivat toimittajat, jotka luonnollisesti olettivat paikallisen tiedostojärjestelmän rakenteen vastaavan projektin rakennetta. Näin ollen linkitettyjä resursseja ei oletusarvon mukaan voi lisätä projekteihin, jotka on määritetty vastaamaan tällaista toimittajaa. Lisäksi linkitettyjä resursseja sisältäviä projekteja ei myöskään voi oletusarvon mukaan jakaa tällaisen toimittajan kanssa.
Linkityksiä tukevan toimittajan tulee sallia se, että linkitettyjä resursseja sisältävät projektit määritetään versionhallintaan, mutta toimittaja voi kuitenkin estää itse linkitettyjen resurssien versionhallinnan.
Huomattavasti monimutkaisempi ratkaisu on se, että myös varsinaisten linkitettyjen resurssien versionhallinta sallitaan. Tätä ratkaisua tulee kuitenkin välttää, sillä se voi aiheuttaa vaikeita tilanteita, joissa tiedosto saattaa esimerkiksi olla jo toisen toimittajan versionhallinnassa toisessa projektirakenteessa. Suositeltava vaihtoehto on siis tukea sellaisten projektien versionhallintaa, joiden sisältämät linkitetyt resurssit eivät ole versionhallinnassa.
Tietovarastojen toimittajien toteutukset voidaan päivittää tukemaan linkitettyjä resursseja korvaamalla RepositoryProvider.canHandleLinkedResources()-metodi niin, että se palauttaa arvon true. Tämän jälkeen linkitetyt resurssit sallitaan projekteissa, jotka on määritetty yhteiskäyttöön kyseisen tietovaraston toimittajan kanssa. Tietovaraston toimittajan on kuitenkin varmistettava, että linkitetyt resurssit käsitellään oikein. Kuten aiemmin mainittiin, on suositeltavaa määrittää tietovaraston toimittajat ohittamaan kaikki linkitetyt resurssit. Tällöin linkitetyt resurssit (ja niiden aliresurssit) tulee jättää pois tietovaraston toimittajan tukemista toimita. Lisäksi tietovaraston toimittajan tulee käyttää siirron ja poiston oletustoimintaa, jos tietovaraston toimittajan toteutus ohittaa oletusarvona olevan IMoveDeleteHook-toiminnan.
Ryhmän toimittajat voivat määrittää metodin IResource.isLinked() avulla, onko resurssi linkki. Tämä metodi palauttaa kuitenkin true-arvon vain, kun kyseessä on linkin juuri. Seuraavan koodikatkelman avulla voidaan määrittää, onko resurssi linkin aliobjekti.
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
Tietovarastojen toimittajien tulee ohittaa kaikki resurssit, joille yllä oleva koodi palauttaa arvon true.