StoredQueryCollection vs QueryHierarchy

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 :

windowslivewriter_queryhierarchydansletfssdk2010_809f_querycombo_thumb

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 :

windowslivewriter_queryhierarchydansletfssdk2010_809f_teamexplorerqueryhierarchy_thumb

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.

windowslivewriter_queryhierarchydansletfssdk2010_809f_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(@"serverNamecollectionName");
            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.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s