Un progetto può contenere risorse non ubicate all'interno della directory del progetto nel file system locale. Tali risorse sono denominate risorse collegate.
Le risorse collegate possono porre alcuni problemi particolari per i fornitori di repository che agiscono direttamente sul file system. Si tratta di una conseguenza del fatto che tali risorse, in base al progetto, non sono presenti nella struttura ad albero di directory del progetto all'interno del file system.
Le risorse collegate possono influire sui fornitori che presentano le seguenti caratteristiche:
Nel primo caso, si supponga che l'utente selezioni una risorsa collegata e tenti di eseguire un'operazione del fornitore su di essa. Dal momento che il fornitore esegue una chiamata a un client della riga comandi, è possibile supporre che effettui un'operazione equivalente alla prima chiamata a IResource.getLocation().toOSString(), inserendo il percorso del file system risultante come argomento del programma della riga comandi. Se la risorsa in questione è una risorsa collegata, restituirà un file/cartella all'esterno della struttura ad albero della directory di progetto. Non tutti client della riga comandi sono in grado di gestire questo caso. In poche parole, se il fornitore ottiene il percorso di una risorsa nel file system, è probabile che richiedaoperazioni aggiuntive per la gestione delle risorse collegate.
Il secondo caso è abbastanza simile in quanto si basa sul presupposto implicito che la struttura delle risorse del progetto presenti un rapporto di 1:1 con quella dei file/cartelle del file system. In genere, un fornitore può riscontrare problemi se le operazioni IResource e java.io.File vengono mischiate. Ad esempio, per i collegamenti, l'elemento principale di IFile non corrisponde a quello di java.io.File e se il codice presuppone che siano identici verrà generato un errore.
L'introduzione delle risorse collegate non doveva porre problemi di compatibilità con i fornitori esistenti. In particolar modo, si era preoccupati per i fornitori che presupponevano che la struttura del file system locale riflettesse la struttura del progetto. Di conseguenza, per impostazione predefinita non è possibile aggiungere le risorse collegate ai progetti associati a tali fornitori, né condividere con essi i progetti che contengono risorse collegate.
Per creare collegamenti semplici e stabili, un fornitore deve consentire il controllo delle versioni dei progetti contenenti risorse collegate, con la possibilità di disattivare tale controllo per le risorse collegate stesse.
Una soluzione di gran lunga più complessa consiste nel consentire la creazione di versioni delle risorse collegate effettive. Tale soluzione non è tuttavia consigliata in quanto comporta scenari complessi, ad esempio il file potrebbe già essere sottoposto a un controllo delle versioni in una struttura ad albero di progetto differente daparte di un altro fornitore. Si consiglia pertanto di ricorrere al supporto dei progetti con controllo delle versioni che contengono risorse collegate non sottoposte a tale controllo.
Le implementazioni dei fornitori di repository possono essere aggiornate in modo da supportare le risorse collegate mediante la sostituzione del metodo RepositoryProvider.canHandleLinkedResources() per restituire true. Una volta eseguita questa operazione, le risorse collegate potranno essere presenti nei progetti condivisi con tale fornitore di repository. Tuttavia, il fornitore di repository deve eseguire determinate operazioni allo scopo di verificare che le risorse collegate vengano gestite correttamente. Come accennato, è particolarmente auspicabile che i fornitori di repository ignorino tutte le risorse collegate. Ciò significa che le risorse collegate e i relativi elementi secondari devono essere esclusi dalle operazioni supportate dal fornitore di repository. Inoltre, il fornitore di repository deve utilizzare le funzioni di spostamento ed eliminazione predefinite per le risorse collegate se l'implementazione del fornitore di repository sostituisce l'hookIMoveDeleteHook predefinito.
I fornitori di team possono utilizzare IResource.isLinked() per stabilire se una risorsa rappresenta un collegamento. Questo metodo, tuttavia, restituisce true solo per la directory principale di un collegamento. Il segmento di codice che segue può essere utilizzato per stabilire se una risorsa rappresenta l'elemento secondario di un collegamento.
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
I fornitori di repository devono ignorare le risorse per le quali il codice riportato sopra restituisce true.