Let There Be Code RSS 2.0
# Sunday, May 02, 2010

logo_bowie[1] Cette semaine j’ai publié une nouvelle version de BOWIE.

La précédente version était une beta qui fonctionnait pour TFS 2010 RC, celle-ci supporte TFS 2010 RTM.

En plus de supporter TFS 2010 RTM, cette nouvelle version corrige les bugs qui avaient été remontés sur la Beta. Au niveau des nouveautés, vous pouvez maintenant gérer vos alertes comme dans Visual Studio :

 ProjectSettings manageProjectAlerts

BOWIE 2010 fonctionne pour TFS 2008/2010 et Outlook 2007. Il est compatible Outlook 2010. Cependant je travaille actuellement sur une nouvelle version qui fonctionnera exclusivement sur Outlook 2010 afin de bien s’intégrer au nouveau Ribbon.

Sunday, May 02, 2010 9:25:44 PM (Romance Daylight Time, UTC+02:00)  #    Voir Commentaires
Outlook Work Items Extension | TFS | TFS SDK | VSTO
# Monday, February 15, 2010

Hier je me suis attaqué à l’upgrade de BOWIE sur la version RC de TFS 2010, qui sera disponible sur Codeplex en fin de semaine.

Pour cette occasion, voici une interview menée par Patrice Lamarche et qui présente les fonctionnalités de BOWIE 2010.

Si vous ne connaissez pas encore cet addin TFS pour Outlook c’est l’occasion de le découvrir en images!

Monday, February 15, 2010 7:11:36 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Interview | Outlook Work Items Extension | TFS | TFS SDK | VSTO
# Wednesday, February 03, 2010

bowie2010

Comme l’indique clairement le titre, la version 2010 de mon addin TFS pour Outlook est disponible en version beta. Il fonctionne pour Outlook 2007 et 2010 et TFS 2008 et 2010 beta 2. Quelques uns de mes collègues me servent actuellement de beta testeur (merci Lio et Io).

Vous retrouverez sur la page d’accueil du projet codeplex la liste des fonctionnalités disponibles.

Pour le télécharger, ça se passe par là ---> http://bowie.codeplex.com

N’hésitez pas à m’envoyer vos remarques, suggestions, bugs…

Wednesday, February 03, 2010 2:38:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Outlook Work Items Extension | TFS | TFS SDK | VSTO
# Friday, January 29, 2010

Depuis quelques temps je me suis remis au développement de BOWIE. Voulant absolument découvrir l’API de gestion des Builds du SDK de TFS, je me suis creusé les méninges afin de trouver une fonctionnalités intéressantes pour pouvant s’intégrer de façon originale dans Outlook.

Sachant qu’une Build :

  • s’exécute à un temps T1
  • se termine à un temps T2
  • et possède un certain status (Accepted, Failed…),

une Build peut donc être représentée dans un calendrier Outlook par un rendez-vous avec :

  • une date de début
  • une date de fin
  • une catégorie représentant le status
  • une zone permettant d’afficher le détail de la Build, comme dans Visual Studio

On peut également aller plus loin en représentant dans le calendrier les définitions de Build. Dans certain cas, nous créons des définitions de Build récurrentes. Ces définitions de Build récurrentes définissent :

  • un pattern de récurrence (journalier, hebdomadaire…)

Ce type de définition de Build peut donc être représentée par un rendez-vous récurrent dans un calendrier Outlook. Nous pourrions par exemple en ouvrant le rendez-vous, proposer une interface permettant d’éditer la définition, ou encore de démarrer une nouvelle Build.

Après avoir mis à plat toutes ces idées, il ne reste plus qu’à trouver les points d’entrées dans le TFS SDK. Tout d’abord nous avons besoin des références suivantes :

  • TeamFoundation.Client
  • TeamFoundation.Build.Client
  • TeamFoundation.Build.Common

La récupération de toutes les Builds d’un projet nécessite une instance de la classe TeamFoundationServer que l’on obtient à l’aide de la classe TeamFoundationFactory.

Ensuite il faut récupérer l’API du serveur de Build via la méthode GetService<IBuildServer>(). Enfin il ne reste qu’à appeler la fonction QueryBuilds(string projectName) en lui spécifiant un nom de Team Project :

TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer("http://ServerUri");
IBuildServer bserver = tfs.GetService<IBuildServer>();
IBuildDetail[] details = bserver.QueryBuilds("TeamProjectName");

Maintenant que nous avons nos Builds, il nous faut les parcourir et créer des rendez-vous dans le calendrier pour chacune d’elle… et ne pas oublier de stocker l’Uri de la Build dans les UserProperties de l’Appointment :

AppointmentItem appt = folder.Items.Add(OlItemType.olAppointmentItem) as AppointmentItem;
appt.Start = item.StartTime;
appt.End = item.FinishTime;
appt.Subject = item.BuildDefinition.Name + " - " + item.Status.ToString();
appt.ReminderSet = false;
appt.UserProperties.Add("BuildUri", OlUserPropertyType.olText);
appt.UserProperties["BuildUri"].Value = item.Uri.ToString();

Après quelques petits efforts on arrivera facilement à faire un petit formulaire dans ce style :

image

Pour l’affichage du rapport d’exécution d’une Build on peut utiliser une FormRegion dans le formulaire d’un Appointment.

On récupère l’Uri de la Build dans les UserProperties de l’Appointment. Puis toujours avec l’API du serveur de Build on récupère les détails d’exécution via la méthode GetAllBuildDetails(Uri buildUri) :

TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer("http://TeamServerUri");
IBuildServer bserver = tfs.GetService<IBuildServer>();
IBuildDetail details = bserver.GetAllBuildDetails(new Uri("BuildUri"));
Un objet BuildDetail, comme son nom l’indique, contient toutes les informations d’une Build : l’heure d’exécution, le temps d’exécution, le numéro de build, les étapes de la build, le work item

éventuellement créé, le status, le chemin du fichier de log, la liste des erreurs, des warnings, la configuration… bref vraiment toutes les infos.

Le code ci-dessous nous montre comment récupérer certaines de ces informations :

// Numéro de la Build
lblBuildNumber.Text = details.BuildNumber;

// Emplacement du Log
lnkLogPath.Text = details.DropLocation;

// Dernière Modification
lblSummary.Text = string.Format("Build last modified by {0} {1:0.0} hours ago \r\n", details.LastChangedBy, (DateTime.Now - details.LastChangedOn).TotalHours);

// Plateforme
lblErros.Text += configuration.Fields[InformationFields.Platform] + " | " + configuration.Fields[InformationFields.Flavor] + "\r\n";

// Nombre d'erreurs et de warnings
lblErros.Text += configuration.Fields[InformationFields.TotalCompilationErrors] + "error(s), " + configuration.Fields[InformationFields.TotalCompilationWarnings] + "warning(s) \r\n";

// WorkItem créé
foreach (IBuildInformationNode node in details.Information.GetNodesByType(InformationTypes.OpenedWorkItem, true))
{
	lnkBug.Text = string.Format("Bug {0}", node.Fields[InformationFields.WorkItemId]);
    lblState.Text = string.Format("Current state is {0}, currently assigned to {1} \r\n", node.Fields[InformationFields.Status], node.Fields[InformationFields.AssignedTo]);
}

// Le détail des erreurs (fichier, numéro de ligne, message)
foreach (IBuildInformationNode item in details.Information.GetNodesByType(InformationTypes.BuildError, true))
{
	lblErros.Text += "    " + item.Fields[InformationFields.File] + " (" + item.Fields[InformationFields.LineNumber] + "): " + item.Fields[InformationFields.Message] + " \r\n\r\n";
}

Le code précédent donne le résultat suivant :

image

Friday, January 29, 2010 5:40:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Outlook Work Items Extension | TFS SDK
# Monday, December 21, 2009

Pour continuer la découverte du TFS SDK, je vous propose de découvrir comment retrouver l’adresse du Team System Web Access (TSWA) d’un serveur Team grâce au TFS SDK. Pour info je n’ai trouvé aucune documentation concernant cette partie du SDK sur la MSDN.

Pourquoi avoir besoin de récupérer les URL ? Tout simplement lorsque l’on étend les fonctionnalités de TFS vers d’autres outils tiers. Par exemple, dans une fonctionnalité de BOWIE 2010 d’envoie de Work Items par mail, je voulais, pour chacun des work items, avoir un lien qui pointe vers la page d’édition du work item comme indiqué ci-dessous :

image

Pour cela nous avons besoin d’une instance de la classe TeamFoundationServer que l’on trouve dans l’assembly Microsoft.TeamFoundation.Client.dll. Il faut ensuite récupérer une instance de la classe TswaClientHyperlinkService via la méthode GetService de l’objet TeamFoundationServer :

TeamFoundationServer server = TeamFoundationServerFactory.GetServer("http://localhost:8080/tfs/DefaultCollection");
TswaClientHyperlinkService tswa = server.GetService<TswaClientHyperlinkService>();
Grâce à cette classe nous allons pouvoir récupérer les url du Team System Web Access. Dans mon cas, pour récupérer l’url d’un work item à partir de son Id, il suffit d’utiliser la méthode GetWorkItemEditorUrl(int id) :

int wiId = 3;
Uri wiUri = tswa.GetWorkItemEditorUrl(wiId);

On obtient une URL du style : http://localhost:8080/tfs/web/wi.aspx?pcguid=7e6d1e34-000d-4adb-ad5e-93db70187570&id=3

Cette URL permet d’accéder à la page suivante :

image

Voici quelques unes des méthodes de la classe TswaClientHyperlinkService permettant de récupérer les url d’objets TFS:

  • GetChangesetDetailsUrl(int changeSetId)
  • GetHomeUrl(Uri projectUri)
  • GetShelvesetDetailsUrl(string shelvesetName, string shelvesetOwner)
  • GetSourceExplorerUrl(string serverItemPath)
  • GetViewBuildDetailsUrl(Uri buildUri)
  • GetWorkItemQueryEditorUrl(Uri projectUri, string queryPath)

La prochaine fois je vous ferai découvrir l’API de Build du TFS SDK, via le type IBuildServer.

Monday, December 21, 2009 8:17:37 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Outlook Work Items Extension | Team System Web Access | TFS SDK
# Thursday, November 05, 2009

Après les collections de projets, une autre évolution de TFS 2010 c’est la possibilité d’organiser les requêtes d’un projet dans un arbre de répertoires.

SDK TFS 2008 et la classe StoredQueryCollection :

Avec TFS 2008, nous avons juste la possibilité de ranger les requêtes par “Team Queries” et My Queries”. Il est donc assez facile de créer une combobox présentant la liste des requêtes d’un projet afin d’en sélectionner une et d’en afficher le résultat :

queryCombo

La récupération des requêtes se fait depuis la classe Project par la propriété StoredQueries qui nous retourne une instance de StoredQueryCollection :

WorkItemStore store = new WorkItemStore("serverName");
Project project = store.Projects["projectName"];
StoredQueryCollection storedQueries = project.StoredQueries;

Pour remplir notre combobox il suffit de parcourir une première fois la liste StoredQueryCollection afin de récupérer les requêtes publique (Team Queries) puis une seconde fois pour récupérer les requêtes privées (My Queries) :

this.comboBox1.Items.Add(new QueryItem("  ----- Team Queries -----"));
foreach (StoredQuery query in storedQueries)
{
	if (query.QueryScope == QueryScope.Public)
    {
    	this.comboBox1.Items.Add(new QueryItem(query));
    }
}

this.comboBox1.Items.Add(new QueryItem("  ----- Private Queries -----")); 
foreach (StoredQuery query2 in storedQueries)
{
	if (query2.QueryScope != QueryScope.Public)
    {
	    this.comboBox1.Items.Add(new QueryItem(query2));
    }
}

SDK TFS 2010 et la classe QueryHierarchy :

Aujourd’hui avec TFS 2010 nous avons la possibilité de mieux ordonner les requêtes d’un projet. Le treeview du TeamExplorer illustre bien la nouvelle organisation des requêtes :

TeamExplorerQueryHierarchy

Dans cet exemple nous allons recréer ce treeview. Mais tout d’abord, intéressons-nous au modèle objets du TFS SDK 2010.

Le diagramme ci-dessous montre que le modèle objets des requêtes est basé sur le pattern Composite. En effet, on retrouve une classe abstraite QueryItem, une classe spécialisée QueryFolder, héritant de QueryItem et possédant une liste de QueryItem et une classe QueryDefinition, qui est la feuille de l’arbre, c’est à dire une requête. Il ne reste plus qu’à parcourir ce graphe d’objets afin de se créer son Treeview.

 

classDiagramQueryHierarchy 

Première chose, récupérer la hiérarchie de requêtes. De la même façon que l’on récupérait la liste des StoredQueries avec le TFS SDK 2008, on va récupérer l’objet QueryHierarchy depuis une instance de Project, puis parcourir cette hiérarchie :

WorkItemStore store = new WorkItemStore(@"serverName\collectionName");
Project project = store.Projects["projectName"];
QueryHierarchy queryHierarchy = project.QueryHierarchy;
LoadQueries(queryHierarchy, null);

La méthode LoadQueries crée d’abord un noeud représentant le répertoire courant puis parcours les sous-éléments. On retrouve ici un appel récursif dans le cas où l’on itère sur un objet de type QueryFolder :

public void LoadQueries(QueryFolder queryFolder, TreeNode parentNode)
{
	TreeNode folderNode = CreateQueryItemNode(queryFoldern parentNode);
	foreach (var item in queryFolder)
    {
    	if (item is QueryFolder)
    		LoadQueries((QueryFolder)item, folderNode);
	    else
    	    CreateQueryItemNode(item, folderNode);
	}
}

La méthode CreateQueryItemNode est assez simple. Il suffit juste de créer un noeud dans le treeview :

private void CreateQueryItemNode(QueryItem query, TreeNode parentNode)
{
	TreeNode queryNode = new TreeNode(query.Name);
	if (parentNode != null)
	    parentNode.Nodes.Add(queryNode);
	else
		this.treeview1.Nodes.Add(queryNode);

	return queryNode;
}

On obtient un treeview semblable à celui du TeamExplorer. Il ne reste plus qu’à ajouter les icônes et à modifier les ImageIndex de chaque noeud. Pour l’améliorer on préférera également un chargement asynchrone et des objets TreeNode spécialisé tel que FolderNode et QueryNode :

image

Tout ceci sera bien sûr disponible dans mon addin Outlook WorkItems Extension en version 2010 prévu (normalement) pour fin novembre.

Thursday, November 05, 2009 9:32:30 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
C# | Outlook Work Items Extension | TFS SDK
# Monday, November 02, 2009

Dans la nouvelle version de TFS, c’est à dire 2010, plusieurs nouveautés sont apparues. Ces nouveautés ont forcément engendré quelques modifications au niveau du SDK de TFS et on peut voir notamment que certaines classes du SDK 2008 sont maintenant obsolètes.

Comme je le disais dans un précédent post, je suis en train de réécrire une nouvelle version de mon addin TFS pour Outlook, Outlook Work Items Extension, pour 2 raisons : ajouter des nouvelles fonctionnalités, mais surtout faire en sorte qu’il fonctionne pour TFS 2010 et TFS 2008. Eh oui, j’ai essayé de l’utiliser en me connectant sur un serveur 2010 et là j’ai eu quelques soucis… Je vais donc essayer de vous expliquer quels sont les points bloquants et comment je migre mon code.

1ère étape : Mise à jour des références

Dans les projets référençant le SDK, supprimer les références du TFS SDK 2008 (version 9.0) par les assembly du SDK 2010 (version 10.0). Après installation de VS 2010 vous trouverez les assemblies dans le GAC, dans \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies et dans \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0.

Dans mon cas, j’utilise les assemblies suivantes :

  • Microsoft.TeamFoundation.dll
  • Microsoft.TeamFoundation.Client.dll
  • Microsoft.TeamFoundation.WorkItemTracking.Clients.dll
  • Microsoft.TeamFoundation.WorkItemTracking.Controls.dll

Remarque intéressante : les applications utilisant le SDK 2010 vont pouvoir s’exécuter en 64bits puisque contrairement aux SDK 2008, les assemblies de 2010 sont disponible en 32bits mais aussi en 64bits.

2ème étape : Compiler et parcourir les warnings

Cette étape consiste à retrouver tous les warnings concernant l’utilisation de types ou de méthodes obsolètes.

3ème étape : Mettre les mains dans le camboui !

Pour ma part j’utilisais le controle DomainProjectPicker, qui permet d’afficher la boite de dialogue de sélection de Team Projects. Dans la version 2010, cette classe est obsolète. En effet, maintenant dans TFS 2010 il y a la notion de collections de projets, qui n’existait pas dans 2008. Le contrôle de sélection d’un Team Project a donc changé et il faut maintenant utiliser le TeamProjectPicker.

Avec le SDK 2008 j’avais écrit le code suivant :

List<FavoriteTeamProject> favorites = FavoritesTeamProjectManager.GetFavoritesProjects();
using (DomainProjectPicker picker = new DomainProjectPicker(DomainProjectPickerMode.AllowMultiSelect | DomainProjectPickerMode.AllowProjectSelect))
{
	picker.SelectedServer = new TeamFoundationServer("serverName");
    WorkItemStore wis = new WorkItemStore(s);
    ArrayList list = new ArrayList();
    foreach (var project in item)
    {
    	list.Add(wis.Projects["projectName"].Uri.ToString());
	}
    picker.DefaultSelectedProjects = new SortedList();
    picker.DefaultSelectedProjects.Add(s.Uri.ToString(), list);
	
	if (picker.ShowDialog() == DialogResult.OK)
    {
    	var selectedProjects = picker.SelectedProjects;
	}
}
Avec le SDK de TFS 2010 il faut utiliser le contrôle TeamProjectPicker.

  • L’initialisation du serveur TFS sélectionné par défaut se fait via la propriété SelectedTeamProjectCollection, en lui fournissant le nom du serveur et la collection: serverName\collectionName.
  • L’initialisation des projets sélectionnés via une simple liste de ProjectInfo que l’on affecte à la propriété SelectedProjects du picker

using (TeamProjectPicker picker = new TeamProjectPicker(TeamProjectPickerMode.MultiProject, false))
{
	picker.SelectedTeamProjectCollection = new TeamFoundationServer(@"serverName\collectionName");
	List<ProjectInfo> list = new List<ProjectInfo>();
    ProjectInfo pi = new ProjectInfo("projectUri", "projectName", ProjectState.WellFormed);
    list.Add(pi);
	picker.SelectedProjects = list.ToArray();
    
	if (picker.ShowDialog() == DialogResult.OK)
    {
    	var selectedProjects = picker.SelectedProjects;
	}
}

Dans le prochain post nous verrons comment migrer l’utilisation des requêtes qui se faisait avec la classe StoredQuery avec le SDK 2008 et qui se fait maintenant avec les classes QueryHierarchy, QueryFolder et QueryDefinition pour le SDK 2010.

Monday, November 02, 2009 1:36:59 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
C# | Outlook Work Items Extension | TFS | TFS SDK
# Monday, October 26, 2009

Quoi de mieux pour démarrer mon blog que de présenter mon addin TFS pour Outlook ?

Cet outil, disponible sur Codeplex à cette adresse http://bowie.codeplex.com, permet d’intégrer TFS à Outlook.

Pour l’instant l’outil fonctionne avec Outlook 2007 et 2010 et TFS 2008. Je travaille actuellement sur une nouvelle version afin d’intégrer de nouvelles fonctionnalités et d’être compatible avec TFS 2010. Cette nouvelle version devrait être disponible fin Novembre et fonctionnera donc sur la Beta 2 de TFS 2010. N’hésitez pas à me contacter si vous avez des idées d’évolutions !

Voici la liste des fonctionnalités disponible actuellement :

Dans le Ribbon d’un email reçu :

  • Créer un nouveau Work Item depuis l’email
  • Attacher l’email à un Work Item existant (formats html, txt, msg…)
  • Télécharger les pièces jointes de l’email vers une librairie de documents d’un Team Project
  • Retrouver les Work Items attachés à ce mail

ReadMailRibbon 

Dans le Ribbon d’un email que vous rédigez :

  • Ajouter en pièces jointes des documents depuis les librairies de documents d’un Team Project
  • Ajouter en pièces jointes des reports d’un Team Project (formats pdf, excel, tiff…)
  • Ajouter les infos de Work Items dans le corps du mail

WriteMailRibbon

Dans le menu principal d’Outlook:

  • Menu Team –> Gérer mes favoris : permet d’ajouter les Team Projects avec lesquels vous voulez travailler et de définir un Team Project par défaut

Depuis le menu contextuel d’un répertoire de mails:

  • Définissez un lien entre un répertoire de mail et un Team Project. Ce lien permet de créer automatiquement des Work Items lorsque l’on déplace un mail dans ce répertoire. Vous pouvez définir le type de Work Item à créer, le mapping des champs, et d’autres paramètres comme par exemple attacher le mail ou ses pièces jointes au work item. L’image ci-dessous présente la fenêtre de paramétrage. L’onglet “WSS Portal” est une nouvelle fonctionnalité qui ne sera présente que pour la prochaine version.

LinkToTeamProject

Monday, October 26, 2009 5:09:48 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Outlook Work Items Extension | TFS | VSTO
Archive
<August 2010>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2010
Benoît Laut
Sign In
All Content © 2010, Benoît Laut
DasBlog theme 'Business' created by Christoph De Baene (delarou)