Grupp och länkade resurser

Ett projekt kan innehålla resurser som inte finns i projektets katalog i det lokala filsystemet. Dessa resurser kallas för länkade resurser.

Konsekvenser för lagerproviders

Länkade resurser kan ge speciella utmaningar för lagerproviders som arbetar direkt mot filsystemet. Detta är en konsekvens av det faktum att länkade resurser till sin natur inte finns i projektets omedelbara katalogträd i filsystemet.

Providers, med följande egenskaper, kan påverkas av länkade resurser:

  1. De som anropar ett externt program som sedan körs direkt mot filsystemet.
  2. De som implementeras i termer av IResource men antar att alla filerna/mapparna i ett projekt är direkt underordnade detta enda rotkatalogträd.

I det första fallet antar vi att användaren tar en länkad resurs och försöker utföra en provideråtgärd. Eftersom providern anropar en kommandoradsklient kan vi anta att providern gör något som motsvarar att först anropa IResource.getLocation().toOSString(), och ange resulterande filsystemsplats som ett argument till kommandoradsprogrammet. Om den aktuella resursen är en länkad resurs ger detta en fil/mapp utanför projektets katalogträd. Det är inte alla kommandoradsklienter som kan förvänta sig och ha förmåga att hantera ett sådant fall. Kort sagt, om providern någonsin får en filsystemsplats från en resurs krävs troligen extraarbete för hantering av länkade resurser.

Det andra fallet liknar det första på så sätt att det finns ett underförstått antagande att projektresursernas struktur helt matchar filsystemets filer/mappar. I allmänhet kan en provider få problem om IResource- och java.io.File-åtgärderna blandas. För länkar är t.ex. det överordnade objektet till IFile inte detsamma som överordnat objekt för java.io.File. Kod som antar att dessa är desamma kommer att misslyckas.

Bakåtkompatibilitet

Det var viktigt att introduktionen av länkade resurser inte av misstag bryter befintliga providers. Bekymret var specifikt providers som rimligt antog att den lokala filsystemstrukturen speglade projektstrukturen. Följaktligen kan länkade resurser som standard inte läggas till i projekt som avbildas till en sådan provider. Dessutom kan projekt, som innehåller länkade resurser, inte som standard delas med den providern.

Strategier för hantering av länkade resurser

I syfte att vara "länkvänlig" bör en provider tillåta att projekt med länkade resurser versionskontrolleras men kan neka versionskontroll av själva de länkade resurserna.

En avsevärt mer komplex lösning skulle vara att tillåta versionshantering av de faktiska länkade resurserna men detta ska inte uppmuntras eftersom det medför komplexa situationer (filen kanske exempelvis redan har versionkontrollerats under ett annat projektträd, av en annan provider). Vår rekommendation är därför att stödja versionskontrollerade projekt som innehåller icke-versionskontrollerade länkade resurser.

Teknisk information för att vara "länkvänlig"

Implementationer av lagerproviders kan uppgraderas för att stödja länkade resurser genom att åsidosätta RepositoryProvider.canHandleLinkedResources()-metoden för att returnera true. När detta har gjorts kan det finnas länkade resurser i projekt som delas med den lagerprovidern. Lagerprovidern måste däremot vidta åtgärder för att säkerställa att länkade resurser hanteras på rätt sätt. Som nämnts ovan rekommenderar vi att lagerproviders ignorerar alla länkade resurser. Det innebär att länkade resurser (och underordnade objekt) bör uteslutas från de åtgärder som stöds av lagerprovidern. Dessutom bör lagerprovidern använda standardbeteende för flytta/ta bort av länkade resurser om implementationen av lagerprovidern åsidosätter standarden IMoveDeleteHook.

Grupproviders kan använda IResource.isLinked() för att bestämma om en resurs är en länk. Den här metoden returnerar emellertid bara "true" för roten på en länk. Följande kodsegement kan användas till att bestämma om en resurs är ett underordnat objekt till en länk.

String linkedParentName = resource.getProjectRelativePath().segment(0);
IFolder linkedParent = resource.getProject().getFolder(linkedParentName);
boolean isLinked = linkedParent.isLinked();

Lagerproviders bör ignorera alla resurser för vilka ovanstående kod returnerar true.