Propojené prostředky

Předchozí výklad o prostředcích a systému souborů (Mapování prostředků na umístění na disku) vycházel z předpokladu, že všechny prostředky v projektu se nacházejí v systému souborů na stejném místě.  Tak tomu obvykle bývá. Nicméně je k dispozici koncept propojených prostředků v pracovní ploše, takže soubory složky uvnitř projektu lze uložit v systému souborů mimo umístění projektu. 

Propojené prostředky musí mít projekt jako svůj nadřazený prostředek. Mohou být umístěny v podstatě kdekoli v systému souborů. Mohou se nacházet mimo umístění projektu nebo dokonce uvnitř jiného projektu. Existuje pouze několik omezení umístění propojených prostředků. K ověření, že je dané umístění platné pro vytvoření propojeného prostředku, je možno použít metodu IWorkspace.validateLinkLocation.

Propojené prostředky se vytvářejí za použití metody IFolder.createLink nebo IFile.createLink. K programovému určení, zda je daný prostředek propojeným prostředkem, můžete použít metodu IResource.isLinked. Uvědomte si, že tato metoda vrátí hodnotu true pouze pro propojené prostředky, nikoli pro jejich podřízené prvky.

Kromě těchto speciálních metod pro tvorbu propojených prostředků a zjišťování, zda je určitý prostředek propojený, můžete k manipulování s propojenými prostředky používat normální rozhraní API pracovního prostoru. Ve většině ohledů se propojené prostředky chovají naprosto stejně jako kterýkoli jiný prostředek v pracovním prostoru. Existují však určitá omezení při jejich přesouvání, kopírování nebo odstraňování.  Informace o jednotlivých operacích a jejich omezeních najdete v části IResource a jeho podtřídy.

Proměnné cesty

Proměnné cesty lze použít při určování umístění propojených prostředků.  Proměnná cesty je jednoduché mapování (String -> IPath), které definuje zástupce pro umístění v systému souborů.  Proměnné mohou uvolnit správu propojených prostředků snížením počtu míst, kde se používají pevně naprogramované absolutní cesty v systému souborů.

Proměnné cesty uživatelům usnadňují správu propojených prostředků několika způsoby:

Poslední položka v tomto seznamu si zaslouží podrobnější vysvětlení. Když uživatel vytvoří v projektu propojený prostředek, přidá se popis propojeného prostředku do souboru s popisem projektu (".project") v místě uložení projektu. Díky použití proměnné cesty mohou uživatelé projekt sdílet (okopírováním projektu nebo použitím úložiště) a předefinovat proměnnou tak, aby vyhovovala každé jednotlivé pracovní stanici.  Jeden uživatel může například uložit externí prostředky v adresáři c:\temp na jednom systému, zatímco druhý uživatel používající Unix může tytéž prostředky uložit v /home/username/tmp.  Definování proměnné cesty v každém pracovním prostoru (TEMP=c:\temp a TEMP=/home/userb/tmp) umožňuje uživatelům tento rozdíl obejít, a i přesto sdílet projekty s propojenými prostředky.

IPathVariableManager definuje API pro vytváření, manipulaci a řešení proměnných cesty. Také poskytuje metody pro ověřování názvů a hodnot proměnných ještě před jejich vytvořením a pro instalování listeneru, který má být upozorněn, jakmile se definice proměnných cesty změní. Instanci této třídy lze získat za pomoci metody IWorkspace.getPathVariableManager. Bližší podrobnosti najdete v příkladech kódu na konci této sekce.

Metodu IResource.getRawLocation je možno použít ke zjištění nevyřešeného umístění propojeného prostředku. To znamená získat skutečný název proměnné cesty namísto jeho vyřešení pro jeho hodnotu.  Pokud umístění prostředku není definováno pomocí proměnné cesty, metoda getRawLocation funguje naprosto stejně jako metoda getLocation.

Nefunkční odkazy

Klienti, kteří manipulují s prostředky programově, by si měli uvědomit možnost výskytu nefunkčních odkazů. Nefunkční odkazy se vyskytují, když umístění propojeného prostředku neexistuje nebo je definováno ve vztahu k nedefinované proměnné cesty. Při použití protokoluIResource platí následující speciální případy:

Kompatibilita s instalovanými moduly plug-in

Některé moduly plug-in nemusí být schopné s propojenými prostředky pracovat, a proto je k dispozici celá řada mechanizmů k jejich znepřístupnění. Pokud vytváříte modul plug-in, který zcela nezbytně potřebuje, aby se veškerý obsah projektu nacházel ve výchozím umístění projektu, můžete za pomoci těchto mechanizmů uživatelům zabránit ve vytvoření propojených prostředků na místech, kde je nechcete mít.

První mechanizmus se nazývá veto charakteru projektu. Pokud definujete svůj vlastní charakter projektu, můžete v jeho definici zadat, že daný charakter není kompatibilní s propojenými prostředky. Níže je uveden příklad definice charakteru s použitím veta charakteru projektu:

<extension
	id="myNature"
	name="My Nature"
	point="org.eclipse.core.resources.natures">
	<runtime>
		<run class="com.xyz.MyNature"/>
	</runtime>
	<options allowLinking="false"/>
</extension>

Druhým mechanizmem, kterým lze zabránit vytvoření propojeného prostředku, je týmový záchytný bod. Jestliže definujete vlastní implementaci úložiště, můžete pomocí bodu rozšíření org.eclipse.core.resources.teamHook zabránit vytvoření propojených prostředků v projektech, které jsou sdílené s vaším typem úložiště. Standardně poskytovatelé úložišť nepovolují propojené prostředky v projektech připojených k úložišti. 

Pokud podporu úložišť poskytuje starší modul plug-in, který o propojených prostředcích neví, nebudete moci v takových projektech propojené prostředky vytvářet. 

Konečně existuje také nastavení předvolby, které lze použít k znepřístupnění propojených prostředků pro celý pracovní prostor. Zatímco předchozí dva vetovací mechanizmy mají platnost pro jednotlivé projekty, tato předvolba se vztahuje na všechny projekty v celém pracovním prostoru. Chcete-li tuto předvolbu nastavit programově, použijte předvolbu ResourcesPlugin.PREF_DISABLE_LINKING. Uvědomte si však, že i když je tato předvolba nastavená, uživatelé nebo moduly plug-in mohou toto nastavení potlačit tím, že tuto předvolbu vypnou.

Propojené prostředky v podobě kódu

Ukažme si nyní několik příkladů používání propojených prostředků v podobě kódu. Začneme tím, že si nadefinujeme proměnnou cesty:

      IWorkspace workspace = ResourcesPlugin.getWorkspace();
   IPathVariableManager pathMan = workspace.getPathVariableManager();
   String name = "TEMP";
   IPath value = new Path("c:\\temp");
   if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) {
      pathMan.setValue(name, value);
   } else {
      //neplatný název nebo hodnota, vyvolat výjimku nebo varovat uživatele
   }

Nyní můžeme vytvořit propojený prostředek ve vztahu k nadefinované proměnné cesty:

      IProject project = workspace.getProject("Project");//předpokládat, že existuje
   IFolder link = project.getFolder("Link");
   IPath location = new Path("TEMP/folder");
   if (workspace.validateLinkLocation(location).isOK()) {
      link.createLink(location, IResource.NONE, null);
   } else {
     //neplatné umístění, vyvolat výjimku nebo varovat uživatele    }

A je to! Nyní máte ve svém pracovním prostoru propojenou složku s názvem "Link", umístěnou ve složce "c:\temp\folder".

Tento výklad zakončíme několika úseky kódu pro tento propojený prostředek, abychom si ilustrovali chování dalších metod souvisejících s propojenými prostředky:

   link.getFullPath() ==> "/Project/Link"
   link.getLocation() ==> "c:\temp\folder"
   link.getRawLocation() ==> "TEMP/folder"
   link.isLinked() ==> "true"
   
   IFile child = link.getFile("abc.txt");
   child.create(...);
   child.getFullPath() ==> "/Project/Link/abc.txt"
   child.getLocation() ==> "c:\temp\folder\abc.txt"
   child.getRawLocation() ==> "c:\temp\folder\abc.txt"
   child.isLinked() ==> "false"