A projekt tartalmazhat olyan erőforrásokat, amelyek nem a projekt könyvtárában találhatók a helyi fájlrendszeren. Ezekre az erőforrásokra csatolt erőforrásokként hivatkozunk.
A csatolt erőforrások kihívásokat támaszthatnak a lerakatszolgáltatókkal szemben, amelyek közvetlenül a fájlrendszeren működnek. Ez annak a következménye, hogy a csatolt erőforrások kialakítás szerint nem léteznek a fájlrendszer közvetlen címjegyzék projektkönyvtárfájában.
Az alábbi jellemzőket mutató szolgáltatókra hatással lehetnek a csatolt erőforrások:
Az első esetben tételezzük fel, hogy a felhasználó kiválaszt egy csatolt erőforrást, és megpróbál végrehajtani rajta egy szolgáltatóműveletet. Mivel a szolgáltató egy parancssori ügyfelet hív meg, feltételezhetjük, hogy a szolgáltató az IResource.getLocation().toOSString(), első meghívásának megfelelő dolgot hajt végre, az eredményül kapott fájlrendszert pedig a parancssori program argumentumaként biztosítja. Ha a kérdésben szerepelő erőforrás egy csatolt erőforrás, akkor ez a projektkönyvtárfán kívüli fájlt/mappát eredményez. Nem az összes parancssori ügyfél tudja kezelni ezt az esetet. Röviden: ha a szolgáltató megtudja az erőforrás fájlrendszer-helyét, akkor valószínűleg többletmunkát igényel a csatolt erőforrások kezeléséhez.
A második eset nagyon hasonló abban az implicit feltételezésben, hogy a projekt-erőforrások struktúrája 1:1 a fájlrendszer fájljaival/mappáival. Általában a szolgáltató bajba kerülhet, ha keveri az IResource és java.io.File műveleteket. Hivatkozások esetén például az IFile szülője nem egyezik meg a java.io.File szülőjével, és a kód, amely feltételezi ezek egyezését, meghiúsul.
Fontos volt, hogy a csatolt erőforrások bevezetése ne szakítsa meg véletlenül a meglévő szolgáltatókat. A szolgáltatók problémája, hogy érthető módon feltételezték, hogy a helyi fájlrendszer struktúra tükrözi a projektstruktúrát. Ennek következményeként alapértelmezésben nem adhatók csatolt erőforrások olyan projektekhez, amelyek ilyen szolgáltatóra vannak leképezve. A csatolt erőforrásokat tartalmazó projektek alapértelmezés szerint nem oszthatók meg ezzel a szolgáltatóval.
A csatolástámogatás érdekében a szolgáltatóknak engedélyezniük kell a csatolt erőforrásokkal rendelkező projektek verziókövetését, de a csatolt erőforrások verziókövetése letiltható.
Ennél lényegesebben bonyolultabb megoldás az aktuális csatolt erőforrások verziókövetésének engedélyezése, de ez ellenjavallt, mivel összetett példahelyzetekkel jelenik meg (például elképzelhető, hogy a fájl verziókövetését más szolgáltató már megvalósította más projektfa alatt). Javaslatunk a verziókövetett projektek támogatása, amelyek nem verziókövetett csatolt erőforrásokat tartalmaznak.
A lerakatszolgáltató-megvalósítások frissíthetők, hogy támogassák a csatolt erőforrásokat a RepositoryProvider.canHandleLinkedResources() metódus újradefiniálásával, hogy true értéket adjon vissza. Amennyiben ez megtörtént, a csatolt erőforrások engedélyezettek lesznek a lerakatszolgáltatóval megosztott projektekben. A lerakatszolgáltatónak lépéseket kell tennie annak biztosítása érdekében, hogy a csatolt erőforrások kezelése megfelelően történjen. Ahogy fent említettük, határozottan ajánlott, hogy a lerakatszolgáltatók figyelmen kívül hagyják az összes csatolt erőforrást. Ez azt jelenti, hogy a csatolt erőforrásokat (és leszármazottjaikat) ki kell hagyni a lerakatszolgáltató által támogatott tevékenységekből. A lerakatszolgáltatónak az alapértelmezett áthelyezés és törlés viselkedést kell használnia a csatolt erőforrásokhoz, ha a lerakatszolgáltató-megvalósítás felülírja az alapértelmezett IMoveDeleteHook csatlakozópontot.
A csapatszolgáltatók az IResource.isLinked() segítségével meghatározhatják, hogy az erőforrás hivatkozás-e. Ez a metódus csak a hivatkozás gyökeréhez ad vissza igaz értéket. Az alábbi kódszegmens segítségével meghatározható, hogy az erőforrás a hivatkozás leszármazottja-e.
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
A lerakatszolgáltatóknak figyelmen kívül kell hagyniuk azon erőforrásokat, amelyek esetén a kód értéke true.