En lagerleverantör kan göra det möjligt att använda logiska modeller fullt ut genom att utföra följande steg:
ResourceMapping
.ISynchronizationScope
och ett API som kan användas.IMergeContext
-gränssnittet och ett API som kan användas.teamContentProviders
för de modeller som ingår i sammanfogningen. En ModelSynchronizeParticipant
-klass tillhandahålls för att underlätta hanteringen av relationen mellan modellinnehållet, en sammanfogningskontext och jämförelseramverket. IFileHistoryProvider
-API:tProjectSetCapability
arbetsyteleverantör
för användning med SynchronizationStateTester
-API:t.I följande avsnitt beskrivs de här punkterna närmare. Insticksprogrammet org.eclipse.team.examples.filesystem innehåller ett exempel där flera av de här punkterna åskådliggörs. Du kan checka ut projektet från CVS-lagret och använda som referens medan du går igenom den här självstudiekursen. Obs! Källkoden i exempelinsticksprogrammen kan förändras. Om du vill ha en kopia som matchar det som används i exemplet kan du checka ut projektet med hjälp av 3.2 versionsmärkordet (troligen R3_2) eller datummärkningen 28 juni 2006."
Resursavbildnings-API:t består av följande klasser:
Object getModelObject()
: Det modellobjekt som avbildningen härleds (eller anpassas) från.ResourceTraversal[]
getTraversals(ResourceMappingContext, IProgressMonitor)
: Den resursbläddring som räcker de resurser som modellobjektet består av. ResourceTraversal
innehåller en uppsättning resurser och en djupflagga
som anger det djup till vilket resurserna i bläddringen är associerade med ursprungsmodellobjektet. Resursavbildningar tillhandahåller klienter med resursbläddringar där innehållet i en modell beskrivs på ett sätt så att klienten (till exempel en lagerleverantör) kan utföra åtgärder på ett så effektivt sätt som möjligt. Metoder som kan vara av intresse: getResources()
getDepth()
ResourceMappingContext
och RemoteResourceMappingContext
är lite mer komplicerad och beskrivs senare.Det finns två typer av insticksprogram som har att göra med resursavbildningar. De som tillhandahåller en modell som består av, eller är beständig i, resurser i arbetsytan, och de som utför åtgärder för resurser. Det förra fallet behandlas i avsnittet om modellöversikt och det senare fallet i nästa avsnitt.
Två ändringar måste göras i insticksprogram som lägger till utökningar till anpassningsbara utökningspunkter för att de ska gå att använda tillsammans med det nya ResourceMapping
-API:t:
ResourceMapping
i stället för IResource
(i tillämpliga fall). ResourceMapping
och inte IResource
och så att djupbegränsningarna i bläddringarna beaktas. Insticksprogram som lägger till objekttillägg till IResource
kan nu lägga till dem i ResourceMapping
i stället, om åtgärden kan utföras för flera resurser. Här är ett XML-kodstycke som lägger till en menyåtgärd till objekt som anpassas till resursavbildningarna:
<extension point="org.eclipse.ui.popupMenus"> <objectContribution objectClass="org.eclipse.core.resources.mapping.ResourceMapping" adaptable="true" id="org.eclipse.team.ccvs.ui.ResourceMapperContributions"> <enablement>
<adapt type="org.eclipse.core.resources.mapping.ResourceMapping">
<test
property="org.eclipse.core.resources.projectPersistentProperty"
args="org.eclipse.team.core.repository,org.eclipse.team.cvs.core.cvsnature" />
</adapt>
</enablement>
<action
label="%UpdateAction.label"
definitionId="org.eclipse.team.cvs.ui.update"
class="org.eclipse.team.internal.ccvs.ui.actions.UpdateAction"
tooltip="%UpdateAction.tooltip"
menubarPath="team.main/group2"
id="org.eclipse.team.cvs.ui.update">
</action>
...
</objectContribution>
</extension>
Tillägg till ResourceMapping
används automatiskt för objekt som anpassas till IResource
. Den här transitiva associationen hanteras av arbetsmiljön. Filtrering av tillägg till resursavbildningar kan göras med hjälp av aktiveringsuttryck. Ett uttryck för filtrering efter
projektbeständiga egenskaper har lagts till så att menyer för lagerleverantörer kan visas för projekt som är avbildade till deras lager.
Åtgärder som har lagts till i ResourceMapping
-klassen får ett urval som innehåller en eller flera ResourceMappings
.
Med hjälp av åtgärderna översätts resursavbildningen till en uppsättning resurser som kan bearbetas. Det kan göras genom anrop till getTraversals
så hämtas avbildningens bläddringar. En bläddring gör det möjligt för klienter till bläddringen att optimera sina åtgärder baserat på djupet för de resurser som bläddringen täcker. En klient kan bläddra igenom resursen manuellt eller använda resursen och djupet som indata till en åtgärd som delegeras att utföra arbetet. Ett exempel: Om användaren utför en
CVS-uppdatering av ett Java-paket och resursavbildningen för Java-paketet avbildas til en mapp med djupet ett utfärdar
CVS ett lämpligt kommando ("cvs update -l" för den som undrar) som utför en ytlig uppdatering av den mapp som paketet representerar.
Även om det är möjligt att erhålla en uppsättning bläddringar direkt från de valda resursavbildningarna finns det modellrelationer (eller lagerrelationer) som kan kräva att andra resurser eller modellelement ingår i åtgärden. I nästa avsnitt beskrivs hur du säkerställer att alla nödvändiga resurser ingår i en åtgärd.
För gruppåtgärder måste de valda avbildningarna översättas till den uppsättning avbildningar som ska bearbetas. I processen ingår att kontrollera att modelleverantörer ingår i åtgärder för resurser som överensstämmer med deras aktiveringsregler. Den term vi använder för att beskriva den fullständiga uppsättningen resursavbildningar som ska bearbetas är åtgärdens omfång. Följande API tillhandahålls för det här:
ISynchronizationScope
:
Gränssnitt som definierar API:t för åtkomst till omfånget för åtgärden. Det ger åtkomst till alla de resursavbildningar som bearbetas och bläddringarna för de avbildningarna enligt hur de beräknades under den process då omfånget skapades. ISynchronizationScopeManager
:
Gränssnitt som definierar API:t för att skapa och hantera ett omfång. SynchronizationScopeManager
:
Utökningsbar klass som tillhandahåller en standardimplementering av ISynchronizationScopeManager
-API:t.ModelOperation
:
Utökningsbar åtgärdsklass som genererar ett omfång med hjälp av en angiven omfångshanterare och frågar om ytterligare resurser eller avbildningar har lagts till i åtgärden på grund av modelleverantörsrelationer.initialize(IProgressMonitor)-metoden för SynchronizationScopeManager
-klassen hanterar hela processen med att konvertera en indatauppsättning av resursavbildningar till den fullständiga uppsättningen avbildningar som ska bearbetas och den fullständiga uppsättningen bläddringar som täcker de avbildningarna. En lagerleverantör kan anpassa processen genom att:
RemoteResourceMappingContext
för användning när resursbläddringar från resursavbildningar hämtas. SynchronizationScopeManager
för att anpassa omfångshanteringsprocessen enligt behov. I de följande två avsnitten beskrivs de här punkterna närmare.
Det kan hända att modelleverantören måste kunna göra en snabb kontroll av status för en eller flera resurser i lagret för att kunna garantera att alla nödvändiga resurser ingår i en gruppåtgärd. För vissa modeller är det inte nödvändigt. Till exempel är ett Java-paket en behållare med bläddring på ett djup på ett oavsett fjärrstatus för modellen. Om det är möjligt kan en lagerleverantör enkelt avgöra om utgående borttagningar ska ingå vid bekräftelse eller om inkommande tillägg ska ingå vid uppdatering. De resurser som utgör vissa logiska modeller kan ändras över tid. Till exempel kan de resurser som utgör ett modellelement vara beroende av innehållet i en manifestfil (eller någon liknande mekanism). En förutsättning för att resursavbildningen ska returnera rätt bläddring är att den har åtkomst till fjärrinnehållet för manifestfilen (om det skiljer sig från det lokala innehållet) för att kontrollera om det finns fler resurser som ska ingå. Det kan hända att de här extra resurserna inte finns i arbetsytan men lagerleverantören kan kontrollera att de fanns där när den valda åtgärden utfördes.
Se till att de här mer komplexa modellerna kan användas genom att överföra RemoteResourceMappingContext
till metoden ResourceMapping#getTraversals
.
När en kontext tillhandahålls kan avbildningen använda den till att säkerställa att alla nödvändiga resurser ingår i bläddringen. Om en kontext tillhandahålls kan avbildningen anta att endast lokal status är av intresse.
Fjärrkontexten för resursavbildningen innehåller tre allmänna frågor:
Svaret på den första frågan beror på vilken typ av åtgärd som utförs. Vanligen är uppdateringar och sammanfogningar trevägsåtgärder medan jämförelser och ersättningar (åtminstone för CVS) är tvåvägsåtgärder.
I API:t för Eclipse-grupper ingår en Subscriber
-klass
som definierar ett API som visar status för synkronisering mellan den lokala arbetsytan och fjärrservern. En SubscriberResourceMappingContext
tillhandahålls. Där används en Subscriber
för åtkomst till nödvändig fjärrstatus. Klienter som har en Subscriber
behöver inte utföra göra något extra för att erhålla en resursavbildningskontext.
Det går att skapa underklasser till klassen SynchronizationScopeManager
för att anpassa
omfångsgenereringen och hanteringsprocessen. De två huvudanledningarna till att skapa underklasser till omfångshanteraren:
ISynchronizationScopeParticipant
-gränssnittet definierar det API som modelleverantörer kan använda till att delta i omfångshanteringsprocessen. Klassen SubscriberScopeManager
är en Subscriber
-baserad underklass till SynchronizationScopeManager
som inbegriper deltagare i omfångshanteringsprocessen. Ett exempel på varför den här typen av
process behövs är arbetsuppsättningar. Om en arbetsuppsättning är en av resursavbildningarna i ett omfång ökar uppsättningen bläddringar som täcks av omfånget om resurser läggs till i arbetsuppsättningen. Den huvudåtgärdstyp för lager som kräver modelldeltagande är sammanfogning. I många fall behöver modeller bara delta på filnivå. I det syftet infördes IStorageMerger
-API:t så att
modelleverantörer skulle kunna bidra med sammanfogningar som skulle användas till att sammanfoga filer för en viss utökning eller innehållstyp. I vissa fall behöver modeller dock extra kontext för att delta på rätt sätt i en sammanfogning. Med det i åtanke införde vi API:erna IResourceMappingMerger
och IMergeContext
.
Sammanfogningsåtgärder utlöses fortfarande av åtgärder som är associerade med en lagerleverantör. När en åtgärd av sammanfogningstyp begärs av användaren måste dock lagerleverantören inbegripa modelleverantörerna i sammanfogningsprocessen för att säkerställa att sammanfogningen inte skadar modellen på något sätt.
Det finns två huvuddelar i lagerleverantörs-API:t som gäller modellbaserad sammanfogning.
En viktig aspekt av modellbaserad sammanfogning är det API som används till att informera modelleverantören om synkroniseringsstatus för de ingående resurserna. Följande gränssnitt används till att beskriva synkroniseringsstatus:
Abstrakta klasser tillhandahålls för alla de här gränssnitten med
namnkonventionen att alla klassnamn överensstämmer med gränssnittsnamnen med prefixet "I"
borttaget. Den enda klass som lagerleverantörer måste åsidosätta är klassen ResourceDiff
så att lämpliga före- och efterversioner av filer kan tillhandahållas.
IMergeContext-gränssnittet utökar synkroniseringskontexten med fler metoder som kan användas vid sammanfogning. Återanropsmetoder finns för att:
En abstrakt MergeContext-klass tillhandahålls som innehåller standardimplementeringar för en stor del av sammanfogningsfunktionerna och även använder IStorageMerger till att utföra trevägssammanfogningar. Även en SubscriberMergeContext-klass tillhandahålls som hanterar ifyllning och underhåll av den beskrivning av synkroniseringsstatus som är associerad med sammanfogningskontexten.
En åtgärdsklass, ModelMergeOperation,
tillhandahålls för vilken IResourceMappingMerger
-API:t används till att utföra en modellbaserad sammanfogningsåtgärd. Underklasser måste åsidosätta metoden initializeContext(IProgressMonitor)
för att returnera en sammanfogningskontext. I åtgärden används den här kontexten till ett försök att göra en
konsollös modellbaserad sammanfogning. Om det uppstår konflikter lämnas förhandsvisningen av sammanfogningen till underklassen. Som framgår i nästa avsnitt finns det en ModelParticipantMergeOperation
som tillhandahåller förhandsvisningsfunktioner med hjälp av en ModelSynchronizeParticipant.
Funktioner för visning av logiska modeller i en gruppåtgärd tillhandahålls via
ramverket för den gemensamma navigeringsvyn som infördes i Eclipse 3.2. Logiska modeller kan associera en innehållsutökning med en modelleverantör med hjälp av utökningspunkten org.eclipse.team.ui.teamContentProvider. Gruppleverantörer har åtkomst till de här innehållsleverantörerna via ITeamContentProviderManager
.
Det finns flera platser där gruppleverantörer kan visa logiska modeller:
ModelOperation
-klassen tillhandahåller ett meddelande där de registrerade gruppinnehållsleverantörerna används till att informera användaren om utökningen av omfånget. ModelSynchronizeParticipant
gör integrering i synkroniseringsvyn möjlig eller tillhandahåller en behållare där iSynchronizePages
kan visas.
Deltagaren använder både de befintliga deltagarfunktionerna för synkronisering och funktionerna i den gemensamma navigeringsvyn för att göra det möjligt för gruppleverantörer och modeller att anpassas till verktygsfältet, kontextmenyn och andra aspekter av förhandsvisningen av sammanfogningen. ModelSynchronizeParticipant
tillhandahåller följande:
Här följer en kontrollista med steg för att anpassa en modellsynkroniseringsdeltagare för en viss gruppleverantör:
ModelSynchronizeParticipant
ISynchronizePageConfiguration.P_VIEWER_ID
. MergeActionGroup
i syfte att anpassa utseendet på de sammanfogningsrelaterade åtgärderna. ModelParticipantMergeOperation
för hantering av överföringen från en modellbaserad sammanfogning till en förhandsvisning i en dialogruta eller synkroniseringsvy. Följande XML-kodstycken visar hur CVS-deltagarklassen registreras och hur visningsprogrammet definieras.
<extension point="org.eclipse.team.ui.synchronizeParticipants"> <participant name="CVS" icon="$nl$/icons/full/eview16/cvs_persp.gif" class="org.eclipse.team.internal.ccvs.ui.mappings.WorkspaceModelParticipant" id="org.eclipse.team.cvs.ui.workspace-participant"> </participant> </extension> <extension point="org.eclipse.ui.navigator.viewer"> <viewer viewerId="org.eclipse.team.cvs.ui.workspaceSynchronization"> <popupMenu allowsPlatformContributions="false" id="org.eclipse.team.cvs.ui.workspaceSynchronizationMenu"> <insertionPoint name="file"/> <insertionPoint name="edit" separator="true"/> <insertionPoint name="synchronize"/> <insertionPoint name="navigate" separator="true"/> <insertionPoint name="update" separator="true"/> <insertionPoint name="commit" separator="false"/> <insertionPoint name="overrideActions" separator="true"/> <insertionPoint name="otherActions1" separator="true"/> <insertionPoint name="otherActions2" separator="true"/> <insertionPoint name="sort" separator="true"/> <insertionPoint name="additions" separator="true"/> <insertionPoint name="properties" separator="true"/> </popupMenu> </viewer> </extension>
Ett API för filhistorik har lagts till så att modeller kan få åtkomst till filhistoriken. API:t för filhistorik består av följande gränssnitt:
Förutom det här API:t har en allmän filhistorikvy lagts till. Där kan gruppleverantörer visa sin fil-/resurshistorik i en delad vy och modeller kan även visa modellelementhistorik för element som inte avbildas direkt till filer. Historikvyn är en sidbaserad vy där en sida för det valda elementet hämtas på följande sätt:
RepositoryProvider
som är associerad med det projekt som innehåller resursen för en IHistoryPageSource anpassas.
IHistoryPageSource
.Metoder har lagts till i ProjectSetCapability
för att möjliggöra översättning mellan en referenssträng som används till att identifiera en avbildning mellan ett projekt och fjärrinnehåll och URI-adresser som identifierar ett filsystemsschema som registrerats i utökningspunkten org.eclipse.core.filesystem.filesystems. Gruppleverantörer kan tillhandahålla funktioner för det här för att tillåta logiska modeller att utföra fjärrbläddring och projektinläsning.
Gruppleverantörer kan dekorera modellelement genom att konvertera Lightweight-dekoratörer så att de kan användas för resursavbildningar på samma sätt som objekttillägg konverteras för att användas för resursavbildningar. Det finns dock en aspekt av dekoration av element för logiska modeller som är problematisk. Om det inte finns en ett-till-ett-avbildning till en resurs för ett modellelement kan modellelementet inte ta emot en etikettuppdatering när de underliggande resurserna ändras.
I syfte att åtgärda det här problemet infördes ITeamStateProvider
så att modelleverantörer får åtkomst till tillståndsändringar som kan påverka gruppdekorationer. Dessutom kan
en SynchronizationStateTester
användas i modellvyer för att bestämma när etiketterna för element för logiska modeller måste uppdateras. I det här API:t används ITeamStateProvider
-gränssnittet till att bestämma när gruppstatus för resurser har ändrats och kan överföras till en gruppdekoreringsfunktion som en del av en IDecorationContext
.