Verlinkte Ressourcen

In den bisherigen Erläuterungen für Ressourcen und das Dateisystem (Ressourcen zu Plattenpositionen zuordnen) wurde davon ausgegangen, dass sich alle Ressourcen in einem Projekt an derselben Position des Dateisystems befinden,  was normalerweise auch zutreffend ist.  In der Workbench wird jedoch das Konzept der verlinkten Ressourcen realisiert, damit Dateien und Ordner, die zu einem Projekt gehören, im Dateisystem außerhalb der Projektposition gespeichert werden können.  

Verlinkte Ressourcen müssen ein Projekt als übergeordnete Ressource haben. Sie können sich virtuell an einer beliebigen Stelle im Dateisystem befinden. Sie können außerhalb der Projektposition oder sogar in einem anderen Projekt platziert sein. Für die Positionen von verlinkten Ressourcen gelten lediglich einige wenige Einschränkungen. Mit der Methode IWorkspace.validateLinkLocation können Sie sicherstellen, dass eine bestimmte Position für die Erstellung einer verlinkten Ressource gültig ist.

Verlinkte Ressourcen werden unter Verwendung der Methode IFolder.createLink oder IFile.createLink erstellt. Wenn Sie programmgestützt ermitteln möchten, ob es sich bei einer bestimmten Ressource um eine verlinkte Ressource handelt, können Sie hierzu die Methode IResource.isLinked verwenden. Bitte beachten Sie, dass diese Methode den Wert true nur für verlinkte Ressource, nicht aber für deren untergeordnete Elemente zurückgibt.

Abgesehen von diesen speziellen Methoden für die Erstellung von verlinkten Ressourcen und die Ermittlung, ob eine Ressource verlinkt ist, können Sie bei der Bearbeitung von verlinkten Ressourcen die übliche Arbeitsbereichs-API verwenden. Hinsichtlich der meisten Aspekte verhalten sich verlinkte Ressourcen genauso wie alle anderen Ressourcen im Arbeitsbereich. Einige Einschränkungen gelten jedoch für das Versetzen, Kopieren oder Löschen von verlinkten Ressourcen.  Informationen zu den einzelnen Operationen und den entsprechenden Einschränkungen finden Sie in den Angaben zu IResource und ihren Unterklassen.

Pfadvariablen

Pfadvariablen können zur Angabe der Position von verlinkten Ressourcen verwendet werden.  Eine Pfadvariable ist eine einfache Zuordnung (String -> IPath), die eine Verknüpfung mit einer Position im Dateisystem definiert.  Variablen können die Verwaltung von verlinkten Ressourcen vereinfachen, da sie die Anzahl der Stellen reduzieren, an denen fest codierte, absolute Dateisystempfade verwendet werden.  

Mit Pfadvariablen können Sie die Verwaltung von verlinkten Ressourcen in vielerlei Hinsicht optimieren:

Der letzte Eintrag in dieser Liste erfordert eine gewisse Erläuterung. Wenn ein Benutzer in einem Projekt eine verlinkte Ressource erstellt, wird eine Beschreibung für die verlinkte Ressource zur Projektbeschreibungsdatei (".project") an der Position des Projektes hinzugefügt. Durch die Verwendung einer Pfadvariablen können Benutzer ein Projekt gemeinsam verwenden (indem der Inhalt des Projektes kopiert oder ein Repository genutzt wird) und die Variable erneut definieren, damit sie für jede einzelne Workstation passend ist.  Ein Benutzer könnte beispielsweise externe Ressourcen unter "c:\temp" auf seinem System speichern, während ein anderer Benutzer, der UNIX verwendet, dieselben Ressourcen unter "/home/username/tmp" speichern könnte.  Wenn die Benutzer für jeden Arbeitsbereich eine Pfadvariable definieren (TEMP=c:\temp und TEMP=/home/userb/tmp) können sie diesen Unterschied umgehen und die Projekte mit verlinkten Ressourcen ohne weiteren Aufwand gemeinsam benutzen.

IPathVariableManager definiert die API für die Erstellung, Bearbeitung und Auflösung von Pfadvariablen. Außerdem stellt diese Klasse Methoden für die Auswertung von Variablennamen und -werten vor deren Erstellung sowie für die Installation einer Listener-Funktion bereit, die bei der Änderung von Pfadvariablendefinitionen benachrichtigt wird. Ein Exemplar dieser Klasse erhalten Sie unter Verwendung von IWorkspace.getPathVariableManager. Weitere Details können Sie aus den Codebeispielen am Ende dieses Abschnitts ersehen.

Mit der Methode IResource.getRawLocation kann die nicht aufgelöste Position einer verlinkten Ressource ermittelt werden. Dies bedeutet, dass der tatsächliche Pfadvariablenname abgerufen wird, statt ihn in seinen Wert aufzulösen.  Falls eine Ressourcenposition nicht durch eine Pfadvariable definiert ist, sollte die Methode getRawLocation genauso wie die Methode getLocation funktionieren.

Unterbrochene Links

Clients, die Ressourcen programmgestützt bearbeiten, müssen das Risiko von unterbrochenen Links kennen. Unterbrochene Links treten auf, wenn die Position einer verlinkten Ressource nicht vorhanden ist oder relativ zu einer nicht definierten Pfadvariablen angegeben wurde. Die folgenden Sonderfälle gelten bei der Verwendung des Protokolls IResource:

Kompatibilität zu installierten Plug-ins

Einige Plug-ins sind möglicherweise nicht in der Lage, verlinkte Ressourcen zu verarbeiten. Daher gibt es eine Reihe von Mechanismen, mit denen sie inaktiviert werden können. Wenn Sie ein Plug-in schreiben, dass das Vorhandensein des gesamten Projektinhalts in der Standardposition zwingend voraussetzt, können Sie mit diesen Mechanismen verhindern, dass Benutzer verlinkte Ressourcen an unerwünschten Positionen erstellen.

Der erste Mechanismus wird als Veto für die Projektgattung bezeichnet. Wenn Sie eine eigene Projektgattung definieren, können Sie in der Gattungsdefinition angeben, dass die Gattung mit verlinkten Ressource nicht kompatibel ist. Das folgende Beispiel einer Gattungsdefinition setzt das Gattungsveto ein:

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

Der zweite Mechanismus, mit dem Sie die Erstellung von verlinkten Ressourcen verhindern können, ist der Team-Hook. Wenn Sie eine eigene Repositoryimplementierung definieren, können Sie den Erweiterungspunktorg.eclipse.core.resources.teamHook einsetzen, um die Erstellung von verlinkten Ressourcen in solchen Projekten zu verhindern, die mit Ihrem Repositorytyp gemeinsam benutzt werden. In der Standardeinstellung lassen Repository-Provider verlinkte Ressourcen in Projekten, die mit dem Repository verbunden sind, nicht zu. 

Falls die Repositoryunterstützung durch ein älteres Plug-in bereitgestellt wird, das keine verlinkten Ressourcen kennt, können Sie in diesen Projekten keine verlinkten Ressourcen erstellen.  

Schließlich gibt es noch eine Benutzervorgabeneinstellung, mit der Sie verlinkte Ressourcen für den gesamten Arbeitsbereich inaktivieren können. Während die vorherigen beiden Vetomechanismen projektbezogen gelten, wirkt sich diese Benutzervorgabe auf alle Projekte im Arbeitsbereich aus. Um diese Benutzervorgabe programmgestützt zu definieren, verwenden Sie die Benutzervorgabe ResourcesPlugin.PREF_DISABLE_LINKING. Diese Einstellung wird normalerweise zusammen mit der Primärfunktion des Überschreibungsmechanismus für Benutzervorgaben verwendet, damit die Primärfunktion der Eclipse-Installation verlinkte Ressourcen inaktivieren kann. Bitte beachten Sie, dass diese Benutzervorgabe - auch wenn sie definiert ist - von Benutzern oder von Plug-ins überschrieben und somit inaktiviert werden kann.

Verlinkte Ressourcen im Code

Im Folgenden werden einige Beispiele für die Darstellung von verlinkten Ressourcen im Code vorgestellt. Als Erstes sehen Sie ein Beispiel für die Definition einer Pfadvariablen:

    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
   }
Als Nächstes kann eine verlinkte Ressource erstellt werden, die sich auf die definierte Pfadvariable bezieht:
   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
   }
Hiermit liegt im Arbeitsbereich ein verlinkter Ordner namens "Link" vor, der sich in "c:\temp\folder" befindet.

Abschließend sehen Sie einige Codeausschnitte für diese verlinkte Ressource, die das Verhalten von anderen Methoden in Bezug auf verlinkte Ressourcen veranschaulichen:

   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"
   

Copyright IBM Corporation und Andere 2000, 2003.