Resourcebeheer door repository's

Nadat u een instance van RepositoryProvider hebt gemaakt, moet u ook rekening houden met andere aspecten op het gebied van resourcebeheer:

Genegeerde bestanden

Op bepaalde bestanden hoeft wellicht geen versiebeheer te worden toegepast. Resources die bijvoorbeeld van bestaande resources worden afgeleid, kunnen vaak buiten de repository worden opgeslagen. Denkt u dan bijvoorbeeld aan gecompileerde bronbestanden (zoals CLASS-bestanden van Java); deze hoeven niet te worden opgenomen, omdat de bijbehorende JAVA-bronbestanden zich in de repository bevinden. Ook kan het niet nodig zijn bestanden met metagegevens op te nemen die door repositoryproviders worden gegenereerd. Het extensiepunt org.eclipse.team.core.ignore stelt providers in staat bestandstypen te declareren die tijdens repositoryprovider-bewerkingen moeten worden genegeerd. Door de CVS-client wordt bijvoorbeeld het volgende gedeclareerd:

<extension point="org.eclipse.team.core.ignore">
<ignore pattern = ".#*" selected = "true"/>
</extension>

De markup declareert een te negeren bestandsnamenzoekreeks en het kenmerk selected waarmee de standaardselectiewaarde van het bestandstype in het dialoogvenster met voorkeuren wordt aangeduid. De gebruiker kan uiteindelijk zelf aangeven welke bestanden moeten worden genegeerd. De standaardlijst met genegeerde bestandstypen kan worden bewerkt door typen te (de)selecteren, toe te voegen of te wissen.

Bestandstypen

Sommige repository's hanteren andere verwerkingsmethoden voor tekst- en binaire bestanden. Het extensiepunt org.eclipse.team.core.fileTypes maakt het voor plugins mogelijk bestandstypen te declareren als tekst- of binaire bestanden. Door de Java-tools wordt bijvoorbeeld het volgende gedeclareerd:

<extension point="org.eclipse.team.core.fileTypes">
<fileTypes extension="java" type="text"/>

<fileTypes extension="classpath" type="text"/>
<fileTypes extension="properties" type="text"/>
<fileTypes extension="class" type="binary"/>

<fileTypes extension="jar" type="binary"/>
<fileTypes extension="zip" type="binary"/>
</extension>

In de markup worden bestandstypen gedefinieerd met een extensie (extension) en het type text (tekst) of binary (binair). Ook de lijst met tekst- en binaire bestanden kan door de gebruiker zelf worden aangepast.

Team- en gekoppelde resources

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.

Gevolgen voor respositoryproviders

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:

  1. Providers die externe programma's aanroepen en vervolgens rechtstreeks met het bestandssysteem werken.
  2. Providers die in verband met IResource worden geïmplementeerd maar er vanuit gaan dat alle bestanden en mappen van een project rechtstreekse onderliggende items zijn van de directorystructuur met één hoofddirectory.

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.

Compatibiliteit met eerdere versies

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.

Strategieën voor het verwerken van gekoppelde resources

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.

Technische informatie voor het ondersteunen van links

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.

Besloten teamresources

Vaak worden specifieke gegevens over de implementatie van een repository in extra bestanden en mappen opgeslagen. Deze bestanden mogen in het werkgebied dan een functie hebben, maar zijn van geen enkel nut voor andere plugins of de eindgebruiker.

Door een teamprovider kan IResource.setTeamPrivateMember(boolean) worden gebruikt om aan te geven dat resources alleen voor de implementatie van de provider dienen. Nieuwe resources zijn standaard niet besloten, maar kunnen met deze methode wel expliciet als zodanig worden gemarkeerd. Het is een goed idee een submap van het project als besloten aan te wijzen bij het configureren van het project en het maken van de map.

Andere resource-API's voor het doorlopen van resources (zoals resourcedeltastructuren) nemen besloten teamleden alleen op als opname expliciet is aangegeven. In de meeste clients worden de besloten teamresources dus overgeslagen en niet afgebeeld. Besloten teamleden worden in de resourcenavigator standaard verborgen, maar u kunt dit gedrag via de voorkeursinstellingen wijzigen.

U kunt projecten of de hoofdmap van het werkgebied niet als besloten markeren.

Projectensets

De resources van projecten waarop versiebeheer wordt toegepast, worden in een repository bewaard, en daarom is het mogelijk een verwijzing naar de repository-gegevens van het project beschikbaar te stellen voor gemeenschappelijk gebruik, zodat het project gedeeld kan worden en gereconstrueerd kan worden in het werkgebied. U gebruikt hiervoor een bepaald type bestandsexport voor teamprojectensets.

 

In 3.0 is API toegevoegd aan ProjectSetCapability, zodat repositoryproviders een klasse kunnen declareren waarmee het opslaan van bestuurde projecten kan worden geïmplementeerd. Zo worden alleen de projecten geëxporteerd waarvan in de repository projectensets zijn gedefinieerd. Deze API vervangt de verouderde serialiserings-API voor projectensets (zie hieronder).

De projectensetklasse voor repositoryproviders wordt opgehaald uit de klasse RepositoryProviderType, die in dezelfde extensie als de repositoryprovider is geregistreerd. Voorbeeld:

<extension point="org.eclipse.team.core.repository">
<repository
typeClass="org.eclipse.team.internal.ccvs.core.CVSTeamProviderType"

class="org.eclipse.team.internal.ccvs.core.CVSTeamProvider"
id="org.eclipse.team.cvs.core.cvsnature">
</repository>
</extension>

Vóór versie 3.0 konden repositoryproviders een klasse declareren voor het opslaan van bestuurde projecten door middel van het extensiepunt org.eclipse.team.core.projectSets. Zo worden alleen de projecten geëxporteerd waarvan in de repository projectensets zijn gedefinieerd.

Door de CVS-client wordt bijvoorbeeld het volgende gedeclareerd:

<extension point="org.eclipse.team.core.projectSets">
<projectSets id="org.eclipse.team.cvs.core.cvsnature" class="org.eclipse.team.internal.ccvs.ui.CVSProjectSetSerializer"/>
</extension>

De opgegeven klasse moet IProjectSetSerializer implementeren. U kunt deze interface nog steeds gebruiken in versie 3.0, maar deze is wel gedeprecieerd.