Týmové a propojené prostředky

Projekt může obsahovat prostředky, které nejsou umístěny v adresáři projektu na lokálním systému souborů. Tyto prostředky se označují jako propojené prostředky.

Důsledky pro poskytovatele úložišť

Propojené prostředky mohou představovat zvláštní komplikaci pro ty poskytovatele úložišť, kteří pracují přímo se systémem souborů. Jde o důsledek skutečnosti, že propojené prostředky ve své podstatě neexistují v bezprostředním adresářovém stromu projektu v systému souborů.

Propojené prostředky mohou mít vliv na poskytovatele, kteří vykazují následující charakteristiky:

  1. Ty, kteří volají externí program pracující přímo se systémem souborů.
  2. Ty, kteří jsou implementováni v rámci IResource, ale předpokládají, že všechny soubory a složky v projektu existují jako přímé odvozené položky daného adresářového stromu s jedním kořenem.

Předpokládejme, že v prvním uvedeném případě uživatel vybere propojený prostředek a pokusí se nad ním provést operaci poskytovatele. Poskytovatel volá klienta příkazového řádku, a proto můžeme předpokládat, že nejprve bude volat metodu IResource.getLocation().toOSString(), přičemž výsledné umístění systému souborů zadá jako argument programu příkazového řádku. Pokud dotyčný prostředek představuje propojený prostředek, výsledkem bude soubor/složka mimo adresářový strom projektu. Takový vstup může být pro některé klienty příkazového řádku problém a možná jej nebudou schopni zpracovat. Stručně řečeno, pokud váš poskytovatel získá umístění prostředku v systému souborů, pravděpodobně bude nutné věnovat další pozornost zpracování propojených prostředků.

Druhý případ je podobný v tom, že se opět implicitně předpokládá přesná analogie 1:1 mezi strukturou prostředků projektu a soubory/složkami systému souborů. Obecně platí, že pokud poskytovatel volně míchá operace IResource a java.io.File, může se dostat do problémů. Například u odkazů, nadřazený prvek IFile není totožný s nadřazeným prvkem java.io.File a pokud toto některý program předpokládá, dojde k chybě.

Zpětná kompatibilita

Bylo důležité, aby zavedením propojených prostředků nedošlo k nechtěnému narušení stávajících poskytovatelů. Konkrétně se obavy týkaly poskytovatelů, kteří logicky předpokládali, že struktura lokálního systému souborů přesně odráží strukturu projektu. V důsledku toho nelze propojené prostředky standardně přidávat do projektů, které jsou mapovány na takového poskytovatele. Projekty obsahující propojené prostředky dále nemohou být s takovým poskytovatelem sdíleny.

Strategie pro práci s propojenými prostředky

Chce-li poskytovatel zajistit "bezproblémovost propojení", měl by umožnit správu verzí pro projekty s propojenými prostředky, ale zároveň zakázat správu verzí u samotných propojených prostředků.

Výrazně složitějším řešením je umožnit správu verzí u samotných propojených prostředků, ale tento přístup není vhodný, protože v praxi vede na složité scénáře (např. soubor může podléhat správě verzí jiným poskytovatelem v rámci jiného stromu projektu). Doporučujeme proto podporovat projekty se správou verzí, obsahující propojené prostředky bez správy verzí.

Technické podrobnosti pro zajištění "bezproblémovosti propojení"

Implementace poskytovatelů úložišť lze zdokonalit pro podporu propojených prostředků potlačením metody RepositoryProvider.canHandleLinkedResources(), tak, aby vracela hodnotu true.Pak budou moci propojené prostředky společně existovat v projektech sdílených s takovým poskytovatelem úložiště. Poskytovatel úložiště však musí vykonat kroky pro zajištění toho, že se s propojenými prostředky pracuje správně. Jak již bylo uvedeno výše, důrazně se doporučuje, aby poskytovatelé úložišť všechny propojené prostředky ignorovali. To znamená, že propojené prostředky (a jejich podřízené prvky) by měly být vyloučeny z akcí podporovaných poskytovatelem. Pokud implementace poskytovatele úložiště potlačuje výchozí metodu IMoveDeleteHook, měl by tento poskytovatel dále používat standardní chování operací přesunu a odstraňování u propojených prostředků.

Týmoví poskytovatelé mohou použít metodu IResource.isLinked() ke zjištění, zda je prostředek odkazem. Tato metoda však vrací hodnotu true pouze v případě kořene odkazu. Chcete-li zjistit, zda je prostředek podřízeným prvkem odkazu, můžete použít následující úsek kódu.

String linkedParentName = resource.getProjectRelativePath().segment(0);
IFolder linkedParent = resource.getProject().getFolder(linkedParentName);
boolean isLinked = linkedParent.isLinked();

Poskytovatelé úložišť by měli ignorovat všechny prostředky, pro které výše uvedený kód vrací hodnotu true.