Un projet peur contenir des ressources ne se trouvant pas dans son répertoire du système de fichiers local. Ces ressources sont alors qualifiées de liées.
Les ressources liées peuvent s'avérer problématiques pour les fournisseurs de référentiels fonctionnant directement par rapport au système de fichiers. En effet, les ressources liées n'existent pas par nature dans l'arborescence du projet.
Les fournisseurs présnetant les caractéristiques ci-après peuvent rencontrer des problèmes dans le cas de ressources liées :
Dans le premier cas, imaginons que l'utilisateur choisit une ressource liée et tente d'effectuer une opération de fournisseur. Sachant que le fournisseur appelle un client de ligne de commande, nous pouvons comparer cette opération au premier appel de IResource.getLocation().toOSString(), ce qui fait de l'emplacement dans le système de fichier un argument pour le programme de ligne de commande. Si la ressource en question est liée, un fichier/dossier est créé en dehors de l'arborescence du projet. Tous les clients de ligne de commande ne peuvent anticiper et gérer ce cas de figure. En bref, si votre fournisseur obtient l'emplacement d'une ressource dans le système de fichiers, un travail supplémentaire sera requis pour gérer les ressources liées.
Le second cas est assez semblable vu que la structure des ressources est implicitement supposée être 1:1 par rapport aux fichiers/dossiers du système de fichiers. En général, un fournisseur peut connaître des difficultés s'il combine des opérations IResource et java.io.File. Dans le cas de liaisons par exemple, le parent de IFile est différent de celui de java.io.File et le code les considérant identiques échouera.
Il était important que l'introduction de ressources liées ne rompe pas des fournisseurs existants par inadvertance. l'idée notamment portait sur les fournisseurs supposant que la structure du système de fichiers local est calquée sur celle du projet. De cette façon, les ressources liées ne peuvent par défaut pas être ajoutées à des projets mappés vers ce type de fournisseur. Par ailleurs, les projets contenant des ressources liées ne peuvent par défaut pas être partagés avec ce fournisseur.
Afin d'établir une "bonne liaison", un fournisseur doit permettre à des projets comportant des ressources liées d'être contrôlés en termes de version, tout en interdisant ce même contrôle au niveau des ressources.
Une solution nettement plus complexe consisterait à autoriser le versionnage des ressources liées, sauf que cette option entraîne des scénarios fort alambiqués (par exemple, le fichier peut déjà être contrôlé par un autre fournisseur dans une autre arborescence de projet). Nous vous conseillons donc de prendre en charge les projets versionnés contenant des ressources liées non contrôlées en termes de version.
Les implémentations de fournisseurs de référentiels peuvent être mises à niveau afin de supporter des ressources liées. Pour ce faire, la méthode RepositoryProvider.canHandleLinkedResources() doit être remplacée afin de renvoyer la valeur true. Ainsi, les ressources liées peuvent exister dans des projets partagés avec ce fournisseur de référentiels. Toutefois, ce dernier doit prendre des mesures pour que les ressources liées soient correctement gérées. Comme expliqué auparavant, il est fort recommandé que les fournisseurs de référentiels ignorent toutes les ressources liées. Par conséquent, ces ressources (et leurs enfants) doivent être exclues des actions supportées par les fournisseurs. En outre, le fournisseur doit suivre le comportement de déplacement et de suppression par défaut si son implémentation remplace le IMoveDeleteHook par défaut.
Les fournisseurs d'équipes peuvent utiliser IResource.isLinked() pour savoir si une ressource est liée. Cependant, cette méthode renvoie uniquement la valeur true pour la racine d'une liaison. Le fragment de code peut servir à déterminer si une ressource est l'enfant d'une liaison.
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
les fournisseurs de référentiel doivent ignorer toute ressource pour laquelle le code ci-dessus parvient à true.