Sammenkædede ressourcer

I tidligere diskussioner om ressourcer og filsystemet (Tilknyt ressourcer vha. mapping til diskplaceringer) antages det, at alle ressourcer i et projekt er placeret det samme sted i filsystemet. Det er som regel også korrekt. Men begrebet sammenkædede ressourcer på arbejdsbænken er stillet til rådighed, så filer og foldere i et projekt kan gemmes i et filsystem uden for projektets placering.  

Sammenkædede ressourcer kan være placeret hvor som helst i filsystemet. De kan være placeret uden for projektets placering eller endda i et andet projekt. Der er kun få begrænsninger, hvad angår placeringen af sammenkædede ressourcer. Metoden IWorkspace.validateLinkLocation kan bruges til at sikre, at en given placering er gyldig for oprettelsen af en sammenkædet ressource.

Sammenkædede ressourcer oprettes vha. metoden IFolder.createLink eller IFile.createLink. For at afgøre programmatisk om en given ressource er en sammenkædet ressource, kan du bruge metoden IResource.isLinked. Bemærk, at denne metode kun returnerer true for sammenkædede ressourcer og ikke for de sammenkædede ressourcers underordnede elementer.

Foruden disse specielle metoder til oprettelse af sammenkædede ressourcer og til undersøgelse af, om en ressource er sammenkædet, kan du bruge normale arbejdsområde-API'er ved manipulation af sammenkædede ressourcer. I de fleste henseender fungerer sammenkædede ressourcer på præcis samme måde som enhver anden ressource i arbejdsområdet. Der gælder dog visse begrænsninger ved flytning, kopiering eller sletning af sammenkædede ressourcer. Under IResource og de tilhørende underklasser finder du oplysninger om individuelle funktioner og deres begrænsninger.

Stivariabler

Stivariabler kan benyttes ved angivelse af placeringen af sammenkædede ressourcer. En stivariabel er en enkel (Streng -> IPath)-definition eller (Streng -> URI)-definition , der angiver en genvej til en placering i filsystemet. Variabler kan lette administrationen af sammenkædede ressourcer, ved at de kan reducere antallet af steder, hvor hard-coded, absolutte filsystemstier benyttes.

Stivariabler strømliner styringen af sammenkædede ressourcer for brugere på flere måder:

Det sidst punkt på denne liste kræver lidt forklaring. Når en bruger opretter en sammenkædet ressource i et projekt, tilføjes en beskrivelse af den sammenkædede ressource til projektbeskrivelsesfilen (".project") i projektets placering. Ved hjælp af en stivariabel kan brugere dele et projekt (ved at kopiere projektets indhold eller ved at bruge et opbevaringssted) og omdefinere variablen, så den passer til hver enkelt arbejdsstation. Eksempel: En bruger gemmer måske eksterne ressourcer under c:\temp på et system, mens en anden bruger, der anvender Unix, gemmer de samme ressourcer i /home/brugernavn/tmp. Ved at definere en stivariabel i hvert arbejdsområde (TEMP=c:\temp og TEMP=/home/brugernavn/tmp) kan brugere se bort fra denne forskel og dele projekter med sammenkædede ressourcer uden videre.

IPathVariableManager definerer API'et til oprettelse, manipulation og opløsning af stivariabler. Den stiller også metoder til rådighed for validering af variabelnavne og -værdier, inden de oprettes, og for installation af en lytter, der skal underrettes, når stivariabeldefinitioner ændres. Du kan hente en forekomst af denne klasse vha. IWorkspace.getPathVariableManager. I kodeeksemplerne i slutningen af dette afsnit finder du flere oplysninger.

Metoden IResource.getRawLocationURI kan bruges til finde den uløste placering af en sammenkædet ressource. Det vil sige at hente det faktiske stivariabelnavn i stedet for at opløse det til en værdi. Hvis en ressourceplacering ikke er defineret med en stivariabel, fungerer metoden getRawLocationURI på præcis samme måde som metoden getLocationURI.

Brudte link

Klienter, der manipulerer med ressourcer programmatisk, skal være opmærksomme på muligheden for brudte link. Brudte link opstår, når en sammenkædet ressources placering ikke findes eller er angivet relativt til en ikke-defineret stivariabel. Følgende specialtilfælde gælder, når protokollen IResource benyttes:

Kompatibilitet med installerede plugins

Nogle plugins er muligvis ikke i stand til at håndtere sammenkædede ressourcer, hvorfor der findes en række mekanismer til brug for deaktivering af dem. Hvis du er ved at skrive en plugin, som kræver, at hele projekts indhold er placeret i projektets standardplacering, kan du bruge disse mekanismer til at forhindre brugere i at oprette sammenkædede ressourcer, hvor du ikke ønsker dem.

Den første mekanisme hedder veto af projektnatur. Hvis du definerer din egen projektnatur, kan du i naturdefinitionen angive, at naturen ikke er kompatibel med sammenkædede ressourcer. Her er et eksempel på en naturdefinition, der benytter naturveto:

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

Den anden mekanisme til brug for forhindring af oprettelsen af sammenkædede ressourcer er team-hook. Hvis du definerer din egen implementering af opbevaringssted, kan du benytte org.eclipse.core.resources.teamHook-udvidelsespunktet til at forhindre oprettelsen af sammenkædede ressourcer i projekter, der deles sammen med opbevaringsstedtypen. Som standard tillader udbydere af opbevaringssteder ikke sammenkædede ressourcer i projekter, der er tilsluttet til opbevaringsstedet.  

Hvis understøttelse af opbevaringssted stilles til rådighed af en ældre plugin, der ikke er opmærksom på sammenkædede ressourcer, kan du ikke oprette sammenkædede ressourcer i disse projekter.  

Og endelig findes der en indstilling, der kan benyttes til at deaktivere sammenkædede ressourcer for hele arbejdsområdet. De to forrige vetomekanismer fungerer på basis af det individuelle projekt, men denne indstilling har indflydelse på alle projekter i arbejdsområdet. Du skal bruge indstillingen ResourcesPlugin.PREF_DISABLE_LINKING til at angive denne indstilling programmatisk. Bemærk, at selvom indstillingen er aktiveret, kan brugere eller plugins tilsidesætte den ved at deaktivere indstillingen.

Sammenkædede ressourcer i kode

Her er nogle eksempler på at bruge sammenkædede ressourcer i kode. Start med at definere en stivariabel:

   IWorkspace arbejdsområde = 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 {
      //viser en undtagelse eller advarer brugeren, hvis navn eller værdi er ugyldig
   }

Nu kan der oprettes en sammenkædet ressource, der er relativ til den definerede stivariabel:

   IProject projekt = workspace.getProject("Projekt");//antager, at dette findes
   IFolder link = project.getFolder("Link");
   IPath location = new Path("TEMP/folder");
   if (workspace.validateLinkLocation(location).isOK()) {
      link.createLink(location, IResource.NONE, null);
        } else {
      //viser en fejl eller advarer brugeren, hvis placeringen er ugyldig
   }

Nu har du en sammenkædet folder i arbejdsområdet, der hedder "Link", og den er placeret i "c:\temp\folder".

Afslutningsvis gennemgås nogle kodeelementer for denne sammenkædet ressource. Disse illustrerer, hvordan andre metoder med relation til sammenkædede ressourcer fungerer:

   link.getFullPath() ==> "/Project/Link"
   link.getLocation() ==> "c:\temp\folder"
   link.getRawLocation() ==> "TEMP/folder"
   link.isLinked() ==> "true"
   
   IFile underordnet = 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"