Lageröversikt för integrering av logiska modeller

En lagerleverantör kan göra det möjligt att använda logiska modeller fullt ut genom att utföra följande steg:

  1. Lägga till lämpliga lageråtgärder till element som anpassas till ResourceMapping.
  2. Kontrollera att alla lämpliga modellelement och -resurser ingår i åtgärder som utföras för resursavbildningar med hjälp av ett ISynchronizationScope och ett API som kan användas.
  3. Tillåta modelleverantörer att delta i konsollös sammanfogning via IMergeContext-gränssnittet och ett API som kan användas.
  4. Tillåta modelleverantörer att delta i förhandsvisningar av sammanfogningar genom att använda 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.
  5. Ge åtkomst till historiken för arbetsytefiler via IFileHistoryProvider-API:t
  6. Ge åtkomst till fjärrkonfigurationer via API:t för Eclipse-filsystemet i insticksprogrammet org.eclipse.core.filesystem och länka det till arbetsyteprojekt via ProjectSetCapability
  7. Möjliggöra dekoration av element för logiska modeller genom att tillhandahålla en 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."

Lägga till åtgärder i resursavbildningar

Det allmänna resursavbildnings-API:t

Resursavbildnings-API:t består av följande klasser:

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.

Resursavbildningar och objekttillägg

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:

  1. Uppdatera eventuella objectContributions för popupMenus-utökningspunkten i filen plugin.xml till mål-ResourceMapping i stället för IResource (i tillämpliga fall).
  2. Uppdatera åtgärderna så att de gäller 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.

Åtgärdsomfång

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:

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:

  1. Tillhandahålla en RemoteResourceMappingContext för användning när resursbläddringar från resursavbildningar hämtas.
  2. Åsidosätta SynchronizationScopeManager för att anpassa omfångshanteringsprocessen enligt behov.

I de följande två avsnitten beskrivs de här punkterna närmare.

Fjärrkontext för resursavbildning

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.

Skapa underklasser till SynchronizationScopeManager

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:

  1. Lagerleverantören måste ta med extra resurser på grund av en lagernivårelation (till exempel ändringsuppsättning). Det kan åstadkommas genom att metoden adjustInputTraversals(ResourceTraversal[]) åsidosätts.
  2. Synkroniseringen har en längre livscykel (till exempel en vy i stället för en dialogruta för synkronisering) och måste ha möjlighet att reagera på ändringar av omfånget. 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.

Modellbaserad sammanfogning

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.

  1. API där synkroniseringsstatus för de resurser som ingår i sammanfogningen beskrivs.
  2. API där modelleverantörer kan sammanfoga modellelement.
I följande avsnitt beskrivs de här två delarna.

API för beskrivning av synkroniseringsstatus

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.

API för modellsammanfogning

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.

Modellinnehåll i gruppvisningsprogram

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:

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:

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>

Filhistorik

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:

Funktioner för projektuppsättningar

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.

Dekorera modellelement

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.