lunedì 24 gennaio 2011

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ù.

 

Nessun commento: