Linkede ressurser

I tidligere beskrivelser av ressurser og filsystemet (Tilordne ressurser til diskplasseringer) har vi forutsatt at alle ressursene i et prosjekt er plassert på samme sted i filsystemet.  Dette er vanligvis riktig. Vi bruker imidlertid begrepet linkede ressurser i arbeidsbenken for filer og mapper i et prosjekt som er lagret i et annet filsystem enn der prosjektet et plassert. 

Linkede ressurser kan plasseres praktisk talt hvor som helst i et filsystem. De kan plasseres utenfor selve prosjektet eller i andre prosjekter. Det er få begrensninger for plassering av linkede ressurser. Med metoden IWorkspace.validateLinkLocation sikrer du at en gitt plassering er gyldig for opprettelse av en linket ressurs.

Linkede ressurser opprettes ved hjelp av metodene IFolder.createLink eller IFile.createLink. Du kan fastsette programmatisk om en gitt ressurs er linket ved å bruke metoden IResource.isLinked. Merk at denne metoden bare returnerer true for linkede ressurser, ikke ressurser som er underordnet linkede ressurser.

Med unntak av disse spesialmetodene for opprettelse av linkede ressurser og fastsettelse av om en ressurs er linket, kan du bruke vanlig programmeringsgrensesnitt for arbeidsområdet når du manipulerer linkede ressurser. I de fleste tilfeller er linkede ressurser nøyaktig som andre ressurser i arbeidsområdet. Det er imidlertid noen begrensninger for flytting, kopiering eller sletting av linkede ressurser. Du finner informasjon om enkeltoperasjoner og hvilke begrensinger som gjelder, under IResource og subklassene.

Banevariabler

Banevariabler kan brukes når du oppgir plasseringen av linkede ressurser.  En banevariabel er en enkel tilordning (Streng -> IPath) eller (Streng -> URI) som definerer en snarvei for en plassering i filsystemet.  Variabler kan gjøre håndteringen av linkede ressurser enklere ved å redusere antall steder der hardkodede, fullstendige filsystembaner brukes.

Banevariabler effektiviserer håndteringen av linkede ressurser for brukere på flere måter:

Det siste elementet i denne listen krever nærmere forklaring. Når en bruker oppretter en linket ressurs i et prosjekt, legges det til en beskrivelse av den linkede ressursen i filen som beskriver prosjektet (".project"), der prosjektet er plassert. Ved å bruke en banevariabel kan brukere dele et prosjekt (ved å kopiere prosjektinnholdet eller ved å bruke et datalager), og omdefinere variabelen slik at den er tilpasset hver enkelt arbeidsstasjon. I ett system kan for eksempel brukeren lagre eksterne ressurser under c:\temp, mens en annen bruker som bruker Unix kan lagre samme ressurs i /home/username/tmp.  Ved å definere en banevariabel i hvert arbeidsområde (TEMP=c:\temp og TEMP=/home/userb/tmp) omgår brukerne denne forskjellen og deler prosjektene med linkede ressurser som de er.

IPathVariableManager definerer programmeringsgrensesnittet (API) for opprettelse, manipulering og behandling av banevariabler. Den inneholder også metoder for validering av variabelnavn og -verdier før de opprettes, og for installering av en lytter som skal varsles når definisjonene av banevariabelen endres. Du kan hente en forekomst av denne klassen ved hjelp av IWorkspace.getPathVariableManager. Du finner mer informasjon i kodeeksemplene nedenfor.

Metoden IResource.getRawLocationURI kan brukes til å finne den ubehandlede plasseringen av en linket ressurs. Det vil si at det faktiske navnet på banevariabelen hentes i stedet for å behandle det som en verdi.  Hvis det ikke er definert noen ressursplassering med en banevariabel, fungerer getRawLocationURI-metoden akkurat på samme måte som getLocationURI-metoden.

Brutte linker

Når du manipulerer ressurser programmatisk, må du være oppmerksom på at det kan forekomme brutte linker. Brutte linker oppstår når plasseringen av en linket ressurs ikke eksisterer eller er angitt som relativ til en udefinert banevariabel. De følgende særtilfellene gjelder når du bruker IResource-protokollen:

Kompatibilitet med installerte plugin-moduler

Av og til klarer ikke enkelte plugin-moduler å håndtere linkede ressurser, derfor finnes det en rekke mekanismer for å deaktivere dem. Hvis du skriver en plugin-modul som krever at alt prosjektinnhold er plassert på prosjektets standardplassering, kan du bruke disse mekanismene til å hindre brukere i å opprette linkede ressurser der du ikke vil de skal vises.

Den første mekanismen kalles prosjektnatursperring. Hvis du definerer din egen prosjektnatur, kan du i naturdefinisjonen angi at naturen ikke er kompatibel med linkede ressurser. Her er et eksempel på en naturdefinisjon med natursperring:

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

Den andre mekanismen for å hindre opprettelse av linkede ressurser, er gruppebinding. Hvis du definerer din egen datalagerimplementering, kan du bruke utvidelsespunktet org.eclipse.core.resources.teamHook for å hindre opprettelsen av linkede ressurser i prosjekter som deles med datalagertypen. Som standard tillater ikke datalagerleverandører linkede ressurser i prosjekter som er knyttet til datalageret. 

Hvis datalagerstøtten er oppgitt av en eldre plugin-modul som ikke tar hensyn til linkede ressurser, kan du ikke opprette linkede ressurser i disse prosjektene. 

Det er også en preferanseinnstilling som kan brukes til å deaktivere linkede ressurser for hele arbeidsområdet. I motsetning til de to foregående mekanismene som fungerer per prosjekt, påvirker denne preferansen alle prosjekter i arbeidsområdet. Du angir denne preferansen programmatisk ved å bruke preferansen ResourcesPlugin.PREF_DISABLE_LINKING. Merk at selv om dette er angitt, kan brukere eller plugin-moduler overstyre innstillingen ved å deaktivere preferansen.

Linkede ressurser i kode

La oss se på noen eksempler på bruk av linkede ressurser i kode. Vi starter med å definere en banevariabel:

      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 {
      //invalid name or value, throw an exception or warn user
   }

Vi kan nå opprette en linket ressurs som er relativ til den definerte banevariabelen:

   IProject project = workspace.getProject("Project");//assume this exists
   IFolder link = project.getFolder("Link");
   IPath location = new Path("TEMP/folder");
   if (workspace.validateLinkLocation(location).isOK()) {
      link.createLink(location, IResource.NONE, null);
        } else {
      //invalid location, throw an exception or warn user
   }

Det var det hele! Du har nå en linket mappe i arbeidsområdet som heter "Link", og som er plassert her: "c:\temp\folder".

La oss avslutte med noen kodesnutter i den linkede ressursen for å vise funksjonen til andre metoder som er knyttet til linkede ressurser:

   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"