weblogue Xerus

Aller au contenu | Aller au menu | Aller à la recherche

mercredi 19 mars 2008

Tests unitaires des interfaces utilisateurs sous Eclipse

Cela faisait longtemps que je recherchais de quoi tester mes vues et mes dialogues sous eclipse. swtbot permet de le faire simplement.

Exemple de test : (un dialogue avec un CLabel et un Tree)

public class ItemSelectionDialogTest extends TestCase {

	public void testConnected() throws Exception {
		SWTEclipseBot bot = new SWTEclipseBot();
		SWTBotShell botShell = bot.shell("Java - Eclipse SDK");
		Display display = Activator.getStandardDisplay();
		final ItemSelectionDialog itemSelectionDialog = new ItemSelectionDialog(
				(Shell) botShell.widget);
		UIThreadRunnable.asyncExec(display, new UIThreadRunnable.VoidResult() {
			public void run() {
				itemSelectionDialog.open();
			}
		});
		bot.shell("Item Selection").activate();
		SWTBotTree botTree = bot.tree();
		assertTrue(botTree.rowCount() > 1);
		SWTBotCLabel botCLabel = bot.clabel("none");
		assertNull(botCLabel.getImage());
		botTree.getTreeItem("Alfresco2").expand().select("Guest Home");
		botCLabel = bot.clabel("Guest Home");
		assertNotNull(botCLabel.getImage());
		bot.button("OK").click();
		Item item = itemSelectionDialog.getSelectedItem();
		assertNotNull(item);
		assertEquals("Guest Home", item.getName());
	}
}

SWTBot est encore récent mais il parait vraiment bien fait. L'auteur a présenté SWTBot à l'eclipsecon2008

dimanche 12 novembre 2006

Pratique de .NET 2 et C#2

Je conseille vivement ce bouquin de Patrick Smacchia. C'est un bouquin qui ne reste pas à la surface des choses. Il explique assez précisément des points pointus de C# et dotnet. Quelques exemples de points qui m'ont vraiment plu :

  • Introduction au langage IL. Quelques pages qui permettent d'avoir un premier aperçu
  • le chapitre sur la gestion de la sécurité (CAS). Pas facile à digérer mais une bonne référence à mon avis
  • l'explication sur les méthodes anonymes et la notion de variable capturée, de fermeture.
  • dans la même veine, l'explication des itérateurs avec le mot clé yield
  • le chapitre sur les transactions qui explique la gestion des transactions sous .net et windows
  • la manipulation des pointeurs en C#. A ne pas utiliser tous les jours mais c'est intéressant à connaître.

Bon, bien sûr tout n'est pas parfait :

  • très nombreuses fautes d'orthographes à tel point que cela gêne parfois la lecture
  • une demi-page à peine sur Mono : le bouquin est clairement orienté .net sous windows
  • la comparaison C# 2.0/Cpp. L'auteur s'adresse souvent aux développeurs Cpp pour mettre en avant les différences avec le Cpp. On sent que l'auteur est un ancien développeur Cpp mais cela n'apporte finalement pas grand chose.

D'autres thèmes sont abordés mais moins détaillés et c'est heureux car d'autres livres y sont consacrés : msbuild, les windows Forms, XML, asp.net 2.0, les services webs

mardi 7 novembre 2006

Sécurité et Sharepoint 2007

On va voir ici comment rechercher un utilisateur et assigner à cet utilisateur des rôles pour un document donné.

Voici le code en question, qui serait expliqué plus bas :

SPSite spSite = SPControl.GetContextSite(Context);
using (SPWeb spWeb = spSite.RootWeb)
{
   SPFile spFile = spWeb.GetFile("Documents/Proposal for my company.doc");
   SPListItem spListItem = spFile.Item;
   bool reachMaxCount;
   IList<SPPrincipalInfo> principalInfos = SPUtility.SearchPrincipals(spWeb, "cédric", SPPrincipalType.All, SPPrincipalSource.All, null, 100, out reachMaxCount);
   if (principalInfos.Count == 1)
   {
       SPPrincipalInfo spPrincipalInfo = principalInfos0;
       string loginName = spPrincipalInfo.LoginName;
       string email = spPrincipalInfo.Email;
       string name = spPrincipalInfo.DisplayName;
       string notes = string.Empty;
       SPRoleAssignment roleAssignment = new SPRoleAssignment(loginName, email, name, notes);
       SPRoleDefinition roleDefinition1 = spWeb.RoleDefinitions.GetByType(SPRoleType.Contributor);
       SPRoleDefinition roleDefinition2 = spWeb.RoleDefinitions.GetByType(SPRoleType.WebDesigner);
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition1);
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition2);
       if (!spListItem.HasUniqueRoleAssignments)
       {
           spListItem.BreakRoleInheritance(true);
       }
       spListItem.RoleAssignments.Add(roleAssignment);
       spListItem.Update();
    }
}

On fait attention à ne pas gaspiller les ressources :

using (SPWeb spWeb = spSite.RootWeb)

Voir à ce sujet http://msdn2.microsoft.com/en-us/library/ms778813.aspx

La recherche se fait par SPUtility.SearchPrincipals :

   IList<SPPrincipalInfo> principalInfos = SPUtility.SearchPrincipals(spWeb, "cédric", SPPrincipalType.All, SPPrincipalSource.All, null, 100, out reachMaxCount);

Cette méthode n'est pas (encore) documentée dans les MSDN.

  • SPWeb :
  • input

On recherche ici un utilisateur ou un groupe "cédric". Une recherche avec "a" aurait retourné tous les principals contenant la lettre "a".

SearchPrincipals est notamment utilisé par la fenêtre de recherche d'utilisateurs de sharepoint 2007.

  • SPPrincipalType

On a choisi ici de rechercher tous les types de principal mais on aurait pu se limiter aux utilisateurs par exemple (SPPrincipalType.User)

  • SPPrincipalSource

On utilise ici toutes les sources possibles mais on aurait pu se limiter aux utilisateurs Windows du domaine (SPPrincipalSource.Windows) ou à un membership provider (MembershipProvider) par exemple.

Un membership provider permet de mettre en place une authentification qui ne repose pas sur l'authentification windows mais sur des utilisateurs stockés en base de données par exemple). Voir à ce sujet l'article de Sahil Malik : Enabling Custom Authentication for SharePoint 2007

Le reste du code est déjà plus classique et est expliqué par exemple à http://www.sharepointblogs.com/ssa/archive/2006/11/04/15719.aspx

mardi 24 octobre 2006

Sharepoint & versioning

Sharepoint 2007 a une API qui est loin d'être claire. La documentation n'aide pas beaucoup.

La récupération des versions d'un document dans une document library n'est pas aisée ...

La version courante
  • le contenu : SPFile.OpenBinary()
  • les propriétés : SPFile.Item
  • le label de version : SPFile.UIVersionLabel
Les autres versions

Je pensais pouvoir récupérer le SPFile correspondant à la version en question et de là récupérer ses propriétés de la façon suivante :

SPFileVersion spFileVersion = spFile.Versions[0];
SPWeb spWeb = spFileVersion.File.Item.Web;
SPFile spVersionFile = spWeb.GetFile(spFileVersion.Url);

mais spVersionFile.Item est null ...

En fait il faut faire, à partir du spFileVersion :

  • le contenu : spFileVersion.OpenBinary()
  • les propriétés : spFileversion.File.Item.Versions[spFileVersion.ID]
  • le label de version : spFileVersion.VersionLabel

lundi 23 octobre 2006

wikipedia et Navigation popups

Pour ceux qui ne connaissent pas, les navigations popups dans wikipedia c'est plutôt pas mal : juste en plaçant son curseur sur le lien d'un article, le début de l'article est affiché en popup. Très pratique ...

Pour rajouter cette fonctionnalité il faut éditer la page monobook.js de son profil.

http://en.wikipedia.org/wiki/Wikipedia:Tools/Navigation_popups

samedi 21 octobre 2006

teamcity & delayed commit

En ce qui concerne l'intégration continue, je n'ai jamais eu l'occation de tester teamcity (http://www.jetbrains.com/teamcity/) mais il me semble qu'il a certaines fonctionnalités uniques particulièrement intéressantes dont le delayed commit :

delayed commit : le code soumis n'est pas commité immédiatement, tous les tests sont d'abord lancés et seulement si les tests ont passé, les modifications sont soumises au gestionnaire de source (cvs, subversion ...). Sinon le développeur est informé que son code n'a pas passé la série de tests.

Bon au boulot, le build complet prend une heure environ et certains tests échouent sans raison de temps en temps (tests Selenium) mais c'est quand même une très bonne idée et j'espère qu'elle sera reprise par les outils open-source

Installation de mon blog

J'ai installé mon serveur de blog. En fait j'ai hésité entre trois possibilités :

  • wordpress
  • dotclear
  • b2evolution

Les trois ont un ebuild gentoo (celui de dotclear est dans le bug tracker)

J'ai finalement choisi dotclear.

Sinon je me présente : Je m'appelle Cédric, j'ai 29 ans et je suis informaticien. Mon serveur est sous Linux Gentoo et je vais essayer de parler de programmation (java surtout, C#), de Linux ...