Projecten kunnen resources bevatten die zich niet in de directory van het project in het lokale bestandssysteem bevinden. Dergelijke resources worden ook wel gekoppelde resources genoemd.
Gekoppelde resources kunnen problemen veroorzaken voor repositoryproviders die rechtstreeks met het bestandssysteem werken. De reden hiervoor is dat gekoppelde resources niet in de directe directorystructuur van het project bestaan.
Gekoppelde resources kunnen gevolgen hebben voor providers met de volgende kenmerken:
Een voorbeeld van het eerste geval: Een gebruiker kiest een gekoppelde resource en probeert er een bewerking op uit te voeren. De provider roept een opdrachtregelclient aan, maar voert eerst de instructie IResource.getLocation().toOSString() uit om de bestandssysteemlocatie op te halen en geeft deze als parameter door aan het opdrachtregelprogramma. Als de opgehaalde resource gekoppeld is, wordt hiermee aangegeven dat de resource een bestand of een map buiten de directorystructuur van het project is. Mogelijk kunnen niet alle opdrachtregelclients deze situatie afhandelen. Kortom: Houd er rekening mee dat voor uw provider aanvullende instructies nodig zijn voor het verwerken van gekoppelde resources.
Het tweede geval is vergelijkbaar, maar hier wordt er impliciet vanuit gegaan dat de structuur van de projectresources identiek is aan de structuur van bestanden en mappen in het bestandssysteem. Over het algemeen kunnen providers problemen krijgen bij het combineren van bewerkingen van IResource en java.io.File. Voor links geldt bijvoorbeeld dat het bovenliggende item van IFile niet gelijk is aan het bovenliggende item van java.io.File's en daarom treden fouten op als in code wordt aangenomen dat beide identiek zijn.
De nieuwe functionaliteit op het gebied van gekoppelde resources mocht geen problemen veroorzaken in bestaande providers. Vooral providers die er standaard vanuit gingen dat het lokale bestandssysteem een kopie was van de projectstructuur, zouden problemen krijgen. Daarom kunnen gekoppelde resources niet standaard worden toegevoegd aan projecten die aan dergelijke providers zijn toegewezen. Ook kunnen projecten met gekoppelde resources standaard niet beschikbaar worden worden gesteld voor gemeenschappelijk gebruik met dergelijke providers.
Providers moeten versiebeheer kunnen toepassen op projecten met gekoppelde resources, maar de gekoppelde resources zelf mogen niet onder versiebeheer vallen.
Het is echter wel mogelijk versiebeheer toe te passen op de gekoppelde resources zelf. Dit wordt niet aanbevolen, omdat vervolgens rekening moet worden gehouden met een aantal ingewikkelde situaties. (Op bestanden kan bijvoorbeeld al versiebeheer worden toegepast in een andere projectstructuur van een andere provider.) U kunt versiebeheer wel toepassen op projecten, maar het is raadzaam gekoppelde resources van het versiebeheer uit te sluiten.
U kunt ondersteuning voor gekoppelde resources aan de implementatie van een repositoryprovider toevoegen door true als resultaat van de methode RepositoryProvider.canHandleLinkedResources() te geven. Vervolgens kunnen gekoppelde resources worden opgenomen in projecten die met die repositoryprovider gedeeld zijn. Voor het correct verwerken van gekoppelde resources moeten stappen worden genomen door de repositoryprovider. Zoals hierboven al werd aangegeven, is het ten zeerste aan te bevelen alle gekoppelde resources te laten negeren door repositoryproviders. Zorg er daarom voor dat gekoppelde resources (en onderliggende items) uitgesloten zijn van de acties die door de repositoryprovider worden ondersteund. Bovendien moet door de repositoryprovider het standaardgedrag voor verplaatsen en wissen worden gehanteerd als de standaardingang IMoveDeleteHook door de implementatie van de repositoryprovider wordt vervangen.
Teamproviders kunnen met IResource.isLinked() opvragen of een resource een link is. Deze methode resulteert in "true" voor de hoofddirectory van een link. U kunt het volgende codesegment gebruiken om vast te stellen of een resource een onderliggend item van een link is:
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
Alle resources waarvan de evaluatie van de bovenstaande code in true resulteert, moeten worden overgeslagen door repositoryproviders.