Passa ai contenuti principali

TFS 2010 Object Model: recuperare le informazioni delle project collections

In questo post vorrei mostrare come sia possibile recuperare  le informazioni delle project collection contenute nel nostro Team Foundation Server utilizzando l’Object Model messoci a disposizione dall’SDK.

Nel precedente post della serie abbiamo visto come sia possibile eseguire la connessione al server TFS, quindi diamo per assodato il fatto di essere in grado di accedere al server.

Per recuperare le informazioni delle project collections possiamo utilizzare la proprietà CatalogNode della classe TfsConfigurationServer ed eseguire una query per ricavare i nodi di tipo Collection:

  1. Dim tfsInstance = TfsConfigurationServerFactory.GetConfigurationServer(New Uri("http://server:8080/tfs"))
  2. Dim collections = tfsInstance.CatalogNode.QueryChildren({CatalogResourceTypes.ProjectCollection},
  3.                                                         False, CatalogQueryOptions.None)

La variabile collections conterrà una collezione a sola lettura di CatalogNode nei quali sono contenuti i dati da noi ricercati.

In particolare CatalogNode ha una proprietà Resource di tipo CatalogResource.

Le più importanti proprietà della classe CatalogeResource sono:

  • Description :  descrizione della collection (in generale della risorsa). Si tratta della descrizione che abbiamo inserito in fase di creazione della collezione;
  • DisplayName : nome della collectio. E’ il nome che abbiamo inserito nel wizard di creazione della collezione;
  • Identifier : si tratta di un Guid che identifica univocamente la risorsa a livello di catalog;
  • Properties : è un oggetto che implementa IDictionary(Of String,String) in cui sono contenute delle proprietà del nodo. In particolare in questo dictionary troviamo la proprietà InstanceId utile quando vogliamo recuperare il riferimento ai servizi esposti dalla collezione;
  • ResourceType : contiene il tipo della risorsa. Nel caso in questione si tratta di TeamprojectCollection.

La proprietà CatalogNode di una TfsConnection, permette di ricavare tutte le informazioni relative ai nodi apparteneti alla connessione. Nel caso della TfsConfigurationServer si tratta di tuti gli oggetti contenuti nel server tra cui collection, progetti e via discorrendo.

Possiamo recuperare le informazioni contenute nella CatalogeNode anche avendo a disposizione l’istanza della Project Collection (cioè un’istannza della classe TfsTeamProjectCollection).

Prima di vedere come recuperare le informazioni di cui sopra vediamo come è possibile ottenere l’istanza della TFSTeamProjectCollection.

Se abbiamo a disposizione un’istanza della TfsConfigurationServer (vedi il post precedente), possiamo utilizzare il metodo GetTeamProjectCollection.

Il metodo in questione prevede, come argomento, l’instance identifier della collezione che si vuole recuperare. Si tratta di un Guid che è recuperabile all’interno della proprietà Properties dell’istanza CatalogeResource della collection con la chiave “InstanceId”:

  1. Dim tfs = TfsConfigurationServerFactory.GetConfigurationServer(New Uri("http://server:8080/tfs"),
  2.                                                                New UICredentialsProvider())
  3. Dim collections = tfs.CatalogNode.QueryChildren({CatalogResourceTypes.ProjectCollection},
  4.                                                              False,
  5.                                                              CatalogQueryOptions.None)
  6. Dim collInstanceId = (From n In collections
  7.                      Where n.Resource.DisplayName = "nome collection"
  8.                      Select n.Resource.Properties("InstanceId")).FirstOrDefault()

E’ evidente che se non abbiamo l’instance identifier e dobbiamo recuperarlo con il precedente pezzo di codice, abbiamo anche tutte le informazioni culla collection senza dover utilizzare l’istanza di TfsTeamProjectCollection ottenuta con il metodo GetTeamProjectCollection.

Supponiamo, per un attimo, di avere l’instace id senza dover accedere ai nodi della CatalogeNode dell’istanza di TfsConfigurationServer. In questo caso, per ottenere l’istanza di TfsTeamProjectCollection è sufficiente:

  1. Dim tfs = TfsConfigurationServerFactory.GetConfigurationServer(New Uri("http://server:8080/tfs"),
  2.                                                                 New UICredentialsProvider())
  3. Dim tfsColl = tfs.GetTeamProjectCollection(New Guid(collInstanceId))

dove InstanceId è la stringa che identifica l’instance Id della collezione.

Il metodo GetTeamProjectCollection si comporta in maniera analoga a quanto visto per la TfsConfigurationServerFactory nel precedente post:

  • se l’istanza di TfsConfigurationServer su cui è richiamato è stata generata tramite la TfsConfigurationServerFactory, allora l’istanza restituita dal metodo sarà sempre la stessa;
  • se l’istanza di TfsConfigurationServer su cui è richiamato è stata istanziata utilizzando il costruttore, allora l’istanza restituita dal metodo sarà diversa per ogni chiamata.

Due altri modi per recuperare l’istanza della TfsTeamProjectCollection sono:

  • utilizzare il costruttore della classe TfsTeamProjectCollection:
  1. Dim tfsColl = New TfsTeamProjectCollection(New Uri("http://server:8080/tfs/nomecollection"),
  2.                                            New UICredentialsProvider())
  • utilizzare la classe factory TfsTeamProjectCollectionFatctory:
  1. Dim tfsColl = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(New Uri("http://server:8080/tfs/nomecollection"),
  2.                                                                         New UICredentialsProvider())

Osserviamo che, l’url della collection è ottenuto concatenando il nome della colection all’url del server.

Se utilizziamo la factory, otterremo sempre la stessa istanza della TfsTeamProjectCollection, mentre il costruttore ci consente di avere ogni volta un’istanza differente.

Nel momento in cui abbiamo a disposizione l’istanza per accedere alla componente server della project collection, le informazioni della stessa sono recuperabili accedendo direttamente alla proprietà CatalogNode ed in particolare alla proprietà Resource:

  1. Dim collName = tfsColl.CatalogNode.Resource.DisplayName
  2. Dim collDescription = tfsColl.CatalogNode.Resource.Description
  3. Dim collInstanceId = tfsColl.CatalogNode.Resource.Properties("InstancreId")

Un ulteriore modo per recuperare le informazioni relative alle collection presenti nel nostro server è quello di richiedere, all’istanza di TfsConfigurationServer, il servizio ITeamProjectCollectionService tramite l’istruzione:

  1. Dim tfs = TfsConfigurationServerFactory.GetConfigurationServer(New Uri("http://rma-mbnb01-dev:8080/tfs"),
  2.                                                                         New UICredentialsProvider())
  3.  
  4. Dim temProSrv = CType(tfs.GetService(Of ITeamProjectCollectionService)(), ITeamProjectCollectionService)

e, quindi, richiamare il metodo GetCollections:

  1. Dim collections = temProSrv.GetCollections()

Il risultato di questo è una IList(Of TeamProjectCollection). La TeamProjectCollection è una classe presente nel namespace Microsoft.TeamFoundation.Framework.Client e contiene delle informazioni relative alla project collection e poco di più.

 

Commenti

Post popolari in questo blog

VB.NET: Convertire un file DOC in RTF e PDF con office interop

In questo post vorrei proporvi del codice per poter convertire un file .doc in un file .rtf oppure .pdf utilizzando le API di interoperabilità di Office.Creeremo una classe, DocConverter, che esporrà le due funzionalità sopra citate.Cominciamo con il prevedere un attributo privato della classe che rappresenterà l’applicazione Word che utilizzeremo per la conversione. Creeremo l’istanza dell’attributo privato all’interno del costruttore della classe:PublicSubNew()
IfNot CreateWordApp() Then
ThrowNew ApplicationException("Assembly di interoperabilità con Office non trovato!")
EndIf
EndSub
Private _wordApp As Word.ApplicationClass
ProtectedFunction CreateWordApp() AsBoolean
Dim retval = True
Try
_wordApp = New Word.ApplicationClass()
_wordApp.Visible = False
Catch ex As System.Exception
_wordApp = Nothing
retval = False
EndTry
Return retval
EndFunction

La conversione del file doc sarà effettuata aprendo il file stesso ed eseguendo un’operazione di SaveAs:

Pr…

Creare uno shortcut con VB.NET

Prendendo spunto da un post comparso sul forum MSDN vorrei proporvi un tip su come creare uno shortcut utilizzando VB.NET.Per poter creare uno shortcut possiamo procedere in due modi: o ci studiamo la struttura del file .lnk e scriviamo una classe che è in grado di ricreare tale struttura oppure utilizziamo Windows Scripting Host.La prima soluzione è percorribile ma laboriosa perchè la struttura di un file lnk non è banale. Chi fosse interessato a vedere come è composto, internamente, un file lnk può scaricare la seguente reference guide (link).Io vorrei proporvi la seconda strada e realizzerò una classe che incapsula l’utilizzo di Windows Scripting Host.L’object model di Windows Scripting Host è contenuto nella dll IWshRuntimeLibrary che può essere referenziata, nel nostro progetto, utilizzando il tab COM della finestra di aggiunta delle reference:Tra gli oggetti che troviamo all’interno della libreria utilizzeremo la classe WshShell e la classe WshShortcut.La prima delle due rappres…

Cambiare la lingua di Visual Studio 2008

Oggi ho avuto qualche problema installando Windows Mobile 6 Professional SDK Refresh e Windows Mobile 6 Standard SDK Refresh.Scaricati i file di installazione e installati, ho provato a creare un progetto di tipo Windows Mobile 6.0 e mi sono beccato questo errore:Dopo qualche smanettamento abbiamo scoperto (e ringrazio il mitico Matteo per l’aiuto) che il mio Visual Studio 2008, pur essendo in Inglese (prova ne era il fatto che gli hotfix e la SP installata erano nella lingua di Albione) aveva come lingua impostata quella del sistema operativo (italiano).Ovviamente, non avrebbe mai potuto trovare la cartella 1040 (italiano) visto che l’installazione dell’SDK aveva supposto che la lingua del Visual Studio fosse Inglese (1033).La soluzione del problema è duplice:1) Duplicate la cartella 1033 presente nel percorso evidenziato dall’errore e la rinominate 10402) cambiate la lingua di Visual Studio.Per questa ultima eventualità basta andare nel menù Strumenti/Opzioni:e cambiare il linguaggi…