Länkade resurser

I tidigare diskussioner om resurser och filsystemet (Avbilda resurser till diskplaceringar) antogs att alla resurser i ett projekt finns på samma plats i filsystemet.  Det stämmer i allmänhet.  Begreppet länkade resurser i arbetsmiljön tillhandahålls så att filer och mappar i ett projekt kan lagras på en annan plats än platsen för projektet i ett filsystem.  

Länkade resurser kan finnas praktiskt taget vars som helst i ett filsystem. De kan finnas utanför projektets plats eller till och med i ett annat projekt. Det finns bara några få begränsningar för var länkade resurser kan finnas. Du kan använda metoden IWorkspace.validateLinkLocation till att säkerställa att en viss plats är giltig när du skapar en länkad resurs.

Länkade resurser skapas med metoden IFolder.createLink eller IFile.createLink. Du kan avgöra genom programmering om en viss resurs är länkad eller inte med hjälp av metoden IResource.isLinked. Lägg märke till att den här metoden returnerar true endast för länkade resurser, inte för underordnade objekt till länkade resurser.

Utöver de här specialmetoderna för att skapa länkade resurser och ta reda på om en resurs är länkad kan du använda det normala APIt för arbetsytan när du ändrar länkade resurser. Länkade resurser fungerar på de flesta sätt exakt likadant som andra resurser på arbetsytan. Däremot gäller vissa begränsningar när du flyttar, kopierar eller tar bort länkade resurser. Mer information om enskilda åtgärder och deras begränsningar finns i IResource och dess underordnade klasser.

Sökvägsvariabler

Du kan använda sökvägsvariabler till att ange placeringen för länkade resurser.  En sökvägsvariabel är en enkel avbildning, (Sträng -> IPath) eller (Sträng -> URI), som definierar en genväg till en plats i ett filsystem.  Med variabler kan du förenkla hanteringen av länkade resurser genom att du minskar antalet platser där hårdkodade, absoluta filsystemsökvägar används.

Sökvägsvariabler gör hanteringen av länkade resurser smidigare för användaren på många sätt:

Den sista posten på den här listan kräver en förklaring. När en användare skapar en länkad resurs i ett projekt läggs en beskrivning av den länkade resursen till i projektbeskrivningsfilen (".projekt") på platsen för projektet. Med hjälp av en sökvägsvariabel kan användarna dela ett projekt (genom att kopiera projektets innehåll eller genom att använda ett lager) och definiera om variabeln så att det passar för varje enskild arbetsstation.  En användare kanske till exempel lagrar externa resurser under c:\temp på ett system, medan en annan användare med Unix lagrar samma resurser i /hem/användarnamn/tmp.  Om vi definierar en sökvägsvariabel på var och en av arbetsytorna (TEMP=c:\temp och TEMP=/hem/användareb/tmp) kan användaren kringgå skillnaden och dela projektet med länkade resurser.

Med IPathVariableManager definieras APIt för att skapa, ändra och tolka sökvägsvariabler. Den ger också möjlighet att validera variabelnamn och -värden innan de skapas och att installera en lyssningsfunktion som aviseras när definitioner för sökvägsvariabler ändras. Du kan få en förekomst av den här klassen med hjälp av IWorkspace.getPathVariableManager. Mer information finns i kodexemplen i slutet av det här avsnittet.

Metoden IResource.getRawLocationURI kan användas till att ta reda på den olösta placeringen för en länkad resurs. Det vill säga att få det faktiska variabelnamnet för sökvägen i stället för att tolka det till dess värde. Om en resursplacering inte är definierad med en sökvägsvariabel fungerar metoden getRawLocationURI på exakt samma sätt som metoden getLocationURI.

Brutna länkar

Klienter som ändrar resurser genom programmering måste vara medvetna om risken för brutna länkar. Brutna länkar uppstår när platsen för en länkad resurs inte finns eller om den anges relaterad till en odefinierad sökvägsvariabel. Följande specialfall gäller när du använder protokollet IResource:

Kompatibilitet med installerade insticksprogram

Vissa insticksprogram kanske inte har kapacitet att hantera länkade resurser. Därför finns ett antal mekanismer för att avaktivera dem. Om du skriver ett insticksprogram där det är ett absolut krav att hela innehållet i ett projekt finns på projektets standardplats kan du använda de här mekanismerna till att förhindra att användare skapar länkade resurser på platser där de inte ska vara.

Den första mekanismen kallas projektnaturspärr. Om du definierar en egen projektnatur kan du i naturdefinitionen ange att naturen inte är kompatibel med länkade resurser. Här följer ett exempel på en naturdefinition som tillämpar naturspärr:

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

Den andra mekanismen för att förhindra skapande av länkade resurser är team hook. Om du definierar en egen lagerimplementering kan du använda utökningspunkten org.eclipse.core.resources.teamHook till att förhindra att länkade resurser skapas i projekt som delas med din lagertyp. Som standard tillåter lagerprovider inte länkade resurser i projekt som är anslutna till lagret. 

Om lagerfunktioner tillhandahålls genom ett äldre insticksprogram som inte hanterar länkade resurser kan du inte skapa länkade i de projekten. 

Slutligen finns en inställning som kan användas till att avaktivera länkade resurser för hela arbetsytan. De två tidigare spärrmekanismerna fungerar per projekt, men den här inställningen påverkar alla projekt på arbetsytan. Du kan ange den här inställningen med programmering med hjälp av inställningen ResourcesPlugin.PREF_DISABLE_LINKING. Lägg märke till att den här inställningen, även när den har angetts, kan åsidosättas av användare eller insticksprogram genom att de avaktiverar den.

Länkade resurser i kod

Här är några exempel på hur du använder länkade resurser i kod. Vi börjar med att definiera en sökvägsvariabel:

   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 {
      //ogiltigt namn eller värde, returnera undantag eller varna användaren
   }

Nu kan vi skapa en länkad resurs relativ till den definierade sökvägsvariabeln:

   IProject project = workspace.getProject("Projekt");//förutsätt att det finns
   IFolder link = project.getFolder("Link");
   IPath location = new Path("TEMP/folder");
   if (workspace.validateLinkLocation(location).isOK()) {
      link.createLink(location, IResource.NONE, null);
   } else {
      //ogiltig plats, returnera undantag eller varna användaren
   }

Klart. Nu har du en länkad mapp på arbetsytan, men namnet "Länk" som finns på sökvägen "c:\temp\mapp".

Vi avslutar med några kodexempel för den här länkade resursen för att visa hur andra metoder fungerar i relation till länkade resurser:

   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"