In eerdere besprekingen van resources en het bestandssysteem (Resources aan schijflocaties toewijzen) is ervan uitgegaan dat alle resources in een project zich op dezelfde locatie in het bestandssysteem bevinden. Over het algemeen is dit waar. U hebt in de workbench echter de beschikking over het concept van gekoppelde resources. Hiermee kunnen bestanden en mappen in een project in een bestandssysteem worden opgeslagen buiten de projectlocatie.
Gekoppelde resources kunnen zich bijna overal in een bestandssysteem bevinden. Ze kunnen zich buiten de projectlocatie bevinden of zelfs binnen een ander project. Er zijn weinig beperkingen voor de locatie van gekoppelde resources. U kunt met de methode IWorkspace.validateLinkLocation zorgen dat een gegeven locatie geldig is voor het maken van een gekoppelde resource.
Gekoppelde resources worden gemaakt met de methode IFolder.createLink of
IFile.createLink.
Om op programmaniveau vast te stellen of een gegeven resource een gekoppelde resource is, kunt u de methode IResource.isLinked gebruiken. Deze methode retourneert true
voor gekoppelde resources, maar niet voor onderliggende items van gekoppelde resources.
Behalve deze speciale methoden voor het maken van gekoppelde resources en het achterhalen of een resource gekoppeld is, kunt u ook de normale werkgebied-API gebruiken als u gekoppelde resources bewerkt. In de meeste opzichten gedragen gekoppelde resources zich net zo als andere resources in het werkgebied. Er zijn echter enige beperkingen bij het verplaatsen, kopiëren of wissen van gekoppelde resources. Zie IResource en de bijbehorende subklassen voor informatie over afzonderlijke bewerkingen en hun beperkingen.
U kunt padvariabelen gebruiken als u de locatie van gekoppelde resources opgeeft. Een padvariabele is een eenvoudige toewijzing (tekenreeks -> IPath) of (tekenreeks -> URI) die een snelkoppeling definieert naar een locatie in het bestandssysteem. Variabelen kunnen het beheer van gekoppelde resources vereenvoudigen doordat op minder plaatsen hardgecodeerde, absolute bestandssysteempaden worden gebruikt.
Padvariabelen stroomlijnen het beheer van gekoppelde resources op verschillende manieren:
De laatste vermelding in deze lijst verdient nog enige uitleg. Als een gebruiker een gekoppelde resource in een project maakt, wordt hiervan een beschrijving toegevoegd aan het projectbeschrijvingsbestand (".project") op de projectlocatie. Door een padvariabele te gebruiken kunnen gebruikers een project gemeenschappelijk gebruiken (door de projectinhoud te kopiëren of door een repository te gebruiken) en de variabele aanpassen aan de afzonderlijke werkstations. Een gebruiker kan bijvoorbeeld externe resources met Windows opslaan onder c:\temp, terwijl een andere gebruiker met Unix dezelfde resources opslaat in /home/username/tmp . Door het definiëren van een padvariabele voor ieder werkgebied (TEMP=c:\temp
and TEMP=/home/userb/tmp)
hebben gebruikers geen last van dit probleem en kunnen eenvoudig projecten met gekoppelde resources delen.
Met IPathVariableManager wordt de API voor het maken, bewerken en omzetten van padvariabelen gedefinieerd. Deze biedt ook methoden voor het controleren van variabelennamen en -waarden voordat ze worden gemaakt en voor het installeren van een listener die bijhoudt of de padvariabelendefinities worden gewijzigd. U maakt een instance van deze klasse met IWorkspace.getPathVariableManager. Zie de codevoorbeelden aan het einde van deze sectie voor meer informatie.
U kunt de methode IResource.getRawLocationURI gebruiken om een niet-omgezette locatie van een gekoppelde resource te zoeken. Dat wil zeggen dat de feitelijke padvariabelennaam wordt opgehaald in plaats van deze om te zetten in de bijbehorende waarde. Als een resourcelocatie niet met een padvariabele is gedefinieerd, heeft de methode getRawLocationURI precies hetzelfde effect als de methode getLocationURI.
Clients die recources op programmaniveau bewerken, moeten rekening houden met ongeldige of niet-functionerende links. Er is sprake van ongeldige links als een gekoppelde resourcelocatie niet bestaat of relatief ten opzichte van een ongedefinieerde padvariabele is opgegeven. De volgende speciale gevallen zijn van toepassing als het protocol IResource wordt gebruikt:
null
voor gekoppelde resources waarvan de locatie relatief is ten opzichte van ongedefinieerde padvariabelen. Sommige plugins kunnen niet werken met gekoppelde resources, dus er is een aantal mechanismen beschikbaar om ze uit te schakelen. Als u een plugin schrijft waarvoor het absoluut noodzakelijk is dat de volledige inhoud van het project zich in de standaarddirectory bevindt, kunt u deze mechanismen gebruiken om te voorkomen dat gebruikers gekoppelde resources maken op plaatsen waar u ze niet wilt hebben.
Het eerste mechanisme wordt projectsoortveto genoemd. Als u een eigen projectsoort definieert, kunt u in de definitie opgeven dat de soort niet compatibel is met gekoppelde resources. Hier volgt een voorbeeld van een soortdefinitie die gebruik maakt van het soortveto:
<extension id="myNature" name="My Nature" point="org.eclipse.core.resources.natures"> <runtime> <run class="com.xyz.MyNature"/> </runtime> <options allowLinking="false"/> </extension>
Het tweede mechanisme om het maken van gekoppelde resources te voorkomen is de teamingang. Als u een eigen implementatie van een repository definieert, kunt u gebruik maken van het extensiepunt org.eclipse.core.resources.teamHook om te voorkomen dat er gekoppelde resources worden gemaakt in projecten die worden gedeeld met uw repositorytype. Repositoryproviders ondersteunen standaard geen gekoppelde resources in projecten die met de repository zijn verbonden.
Als de repositoryondersteuning wordt geleverd door een oudere plugin die geen gekoppelde resources kent, kunt u in de betreffende projecten geen gekoppelde resources maken.
Ten slotte is er een voorkeursinstelling die u kunt gebruiken om gekoppelde resources voor het gehele werkgebied uit te schakelen. De twee eerder genoemde veto-mechanismen zijn per project van kracht, maar deze voorkeur is van invloed op alle projecten in het werkgebied. Om deze voorkeur op programmaniveau in te stellen, gebruikt u de voorkeur ResourcesPlugin.PREF_DISABLE_LINKING
. Zelfs als de voorkeur is ingesteld, kunnen gebruikers of plugins deze negeren door de voorkeur uit te schakelen.
Hier volgen enige voorbeelden waarin gekoppelde resources in de code worden gebruikt. Om te beginnen de definitie van een padvariabele:
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 { //ongeldige naam of waarde, een uitzondering verwerpen of gebruiker waarschuwen }
U kunt nu een gekoppelde resource maken die relatief is ten opzichte van de gedefinieerde padvariabele:
IProject project = workspace.getProject("Project");//aannemen dat deze bestaat IFolder link = project.getFolder("Link"); IPath location = new Path("TEMP/folder"); if (workspace.validateLinkLocation(location).isOK()) { link.createLink(location, IResource.NONE, null); } else { //ongeldige locatie, een uitzondering verwerpen of gebruiker waarschuwen }
Dat is alles. U hebt nu een gekoppelde map in het werkgebied. De naam van de map is "Link" en de locatie is "c:\temp\folder".
De laatste voorbeelden zijn fragmenten over de gekoppelde resource om het gedrag van methoden ten opzichte van gekoppelde resources te laten zien:
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"