Générer des données de test pour My Network Dashlet

Dans son article sur My Network Dashlet, Richard Esplin (@esplinr) précise qu’il lui a été difficile de créer un jeu de test.

En effet, cette tâche, sans être difficile techniquement, est particulièrement longue : il faut d’abord créer des utilisateurs, puis, depuis Share et pour chaque utilisateur, suivre un certain nombre d’autres personnes. Fastidieux !

Lorsque j’ai développé et testé My Network Dashlet, j’ai bien entendu été confronté au même problème. Pour le contourner, je me suis lancé dans l’écriture d’un webscript pour générer mes utilisateurs de test et leurs relations.
Nouveau problème : l’API JavaScript d’Alfresco permet de créer des utilisateurs, mais pas les relations ! Heureusement, il est très facile d’ajouter de nouvelles fonctionnalités à l’API JavaScript.

Extension de l’API Javascript

Pour cela, il suffit d’écrire :

  • une classe Java qui étende BaseScopableProcessorExtension
  • un fichier -context.xml pour déclarer l’extension

et de déployer le tout sur dans notre installation d’Alfresco.

Classe Java pour étendre l’API Javascript

Notre classe Java a pour objectif d’exposer la méthode follow du SubscriptionService :

public class SubscriptionServiceScript extends BaseScopableProcessorExtension {
	private SubscriptionService subscriptionService;
	
	public void follow(String userId, String userToFollow) {
		this.subscriptionService.follow(userId, userToFollow);
	}

	public void setSubscriptionService(SubscriptionService subscriptionService) {
		this.subscriptionService = subscriptionService;
	}
}

Plutôt simple, non ?

Référencement Spring de l’extension Javascript

Le fichier de contexte Spring va déclarer un bean référençant notre classe et déclarant l’extension subscription :

<bean id="subscriptionServiceScript" 
	parent="baseJavaScriptExtension"
	class="net.torda.alfresco.repo.subscriptions.script.SubscriptionServiceScript">
	<property name="extensionName">
		<value>subscription</value>
	</property>

	<property name="subscriptionService">
		<ref bean="SubscriptionService" />
	</property>
</bean>

Grâce à cette déclaration, nous pourrons appeler la méthode subscription.follow(user1, user2) dans nos scripts.

Exemple de WebScript de génération des utilisateurs et de leurs relations

Il ne reste plus qu’à écrire notre WebScript pour générer les utilisateurs de test. Voici ce que ça donne en mode Quick & Dirty (on se l’autorise pour un test).

Déclaration du WebScript

Le fichier subscribe.get.desc.xml déclare le webscript et prévoit deux paramètres :

  • users : qui définit le nombre d’utilisateurs à générer
  • relations : qui définit le nombre total de relations à créer

L’exécution de ce webscript est réservée aux seuls administrateurs : <authentication>admin</authentication>

<webscript>
   <shortname>Test Users with relations</shortname>
   <description>Create tests users for My Network Dashlet</description>
   <family>Torda</family>
   <url>/torda/test/testusers/{users}/{relations}</url>
   <authentication>admin</authentication>
   <transaction allow="readwrite">required</transaction>
</webscript>

Code JavaScript à exécuter

Le code JavaScript va créer les utilisateurs et utiliser notre nouvelle extension de l’API pour tisser des liens entre ces utilisateurs.
Le code proposé ici n’a pas vocation à être (et n’est surtout pas) un modèle de clarté, ni un exemple de ce qu’il faut faire. Il s’agit juste d’un exemple d’utilisation de notre nouvelle extension.
Pour bien faire, il faudrait vérifier la cohérence entre le nombre d’utilisateurs et le nombre de relations à créer, vérifier que l’utilisateur n’existe pas avant de lancer la création, garantir la création du nombre de liens demandé, commenter le code, externaliser la liste des noms et des prénoms dans un fichier de configuration, etc.

script:
{
	var MAIL_DOMAIN = "domain";
	var firstNames = [ "Joe", "Jack", "John", "Bob", "Bill" ];
	var lastNames = [ "Doe", "Smith", "Martin", "Dupont", "Durand" ];
		
	var userNumber = url.templateArgs.users;
	var relationNumber = url.templateArgs.relations;
	
	/* Create users */
	var firstName, lastName, userName, email, personNode;
	var generatedPersons = [];
	for (var i = 0; i < userNumber; i++) {
		firstName = getRandomElement(firstNames);
		lastName = getRandomElement(lastNames);
		userName = firstName + "." + lastName;
		email = userName + "@" + MAIL_DOMAIN;
		personNode = people.createPerson(userName, firstName, lastName, email, userName, true);
		if (personNode != null) {
			generatedPersons.push(userName);
		}
	}

	/* Create relations */
	if (generatedPersons.length > 0) {
		var sourceUser, targetUser;
		var links = [];
		for (var i=0; i < relationNumber; i++) {
			sourceUser = getRandomElement(generatedPersons);
			targetUser = getRandomElement(generatedPersons);
			while (sourceUser == targetUser) {
				targetUser = getRandomElement(generatedPersons);
			}
			if (links[sourceUser] == null ||
			links[sourceUser].indexOf(targetUser) < 0) {
				subscription.follow(sourceUser, targetUser);
				if (links[sourceUser] == null) {
					links[sourceUser] = [];
				}
				links[sourceUser].push(targetUser);
			}
		}
	}
	
	model.persons = generatedPersons;
	model.links = links;
}

function getRandomElement(list) {
	return  list[Math.round(Math.random()*(list.length-1))];
}

Le compte rendu d’exécution

Le résultat de l’exécution du WebScript est une simple page HTML qui liste les utilisateurs créés et les liens générés :

<html>
<body>
Created users:
<ul>
<#list persons as person>
	<li>${person}</li>
</#list>
</ul>

Generated links:
<ul>
<#list links?keys as key>
	<li>${key} : 
		<ul>
		<#list links[key] as value>
			<li>${value}</li>
		</#list>
		</ul>
	</li>
</#list>
</ul>

</body>
</html>

Au final : de jolis réseaux de relations

Il n’y a plus qu’à exécuter le WebScript et à se connecter avec l’un des nouveaux utilisateurs pour pouvoir apprécier les opportunités offertes par My Network Dashlet :

Et pour vous permettre d’aller plus vite dans vos tests, voici :

Cette entrée a été publiée dans Non classé. Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam