Des numéros de versions personnalisés

Récemment, je lisais sur les forums Alfresco la question suivante :

Je voudrai savoir s’il existe une fonction javascript qui me permettra de limiter le versioning d’un document à des versions majeures « 1.0, 2.0, 3.0 »

Bonne question !
Elle permet de s’intéresser à la façon dont sont gérées les versions. Voici donc en quelques étapes comment répondre à cette interrogation.

Qu’est ce qu’un numéro de version ?

De manière « traditionnelle » dans les systèmes ECM, il s’agit d’un groupement de deux nombres séparés par un point. Le premier chiffre est le numéro de version majeure, le second le numéro de version mineure.
C’est ce principe d’identification qu’a choisit Alfresco, mais on peut en imaginer bien d’autres : utilisation de lettres majuscules et minuscules, numérotation séquentielle, utilisation des noms de planètes (à chaque nouvelle version, on s’éloigne un peu du Soleil…. la question du nommage de la neuvième version se pose alors) !
Fort heureusement pour cet article, ce type de nommage est tout à fait possible avec Alfresco.
En effet, Alfresco ne s’appuie pas sur le concept de « numéro » de version, mais de « label » de version. Dans son modèle de données, un label de version est définit comme (aspect versionable dans contentModel.xml) :

<property name="cm:versionLabel">
	<title>Version Label</title>
	<type>d:text</type>
	<protected>true</protected>
</property>

On y apprend que :

  1. le champ est du texte : d:text
  2. il n’y a pas de contrainte particulière

Il est donc potentiellement possible de définir les labels de versions comme bon nous semble.

Comment sont construits les labels de versions Alfresco ?

Lorsqu’une version doit être créée, un appel à la méthode createVersion du VersionService est réalisé. L’implémentation native de ce service, Version2ServiceImpl, va faire un appel à la méthode protected invokeCalculateVersionLabel.
Cette méthode va vérifier si un (et un seul) behaviour est associé à la policy CalculateVersionLabelPolicy et, s’il existe, en exécute la méthode calculateVersionLabel. Dans le cas contraire, le calcul du label de version est confié à la méthode calculateVersionLabel de la classe SerialVersionLabelPolicy.
Cette dernière est justement une implémentation de CalculateVersionLabelPolicy. Son enregistrement est réalisée au travers des beans registerContentWithVersionService (pour les noeuds cm:content) et registerMLContainerWithVersionService (pour les noeuds cm:mlContainer).

Et maintenant, comment on fait ?

On a vu plus haut que le calcul du label de version est confié à un behaviour. En définissant notre propre behaviour, il nous sera donc possible de définir notre propre label. Mieux encore ! On va pouvoir écrire notre behaviour avec une combinaison de XML et de JavaScript et ainsi coller au plus près de la question initiale.
Sauf que… « il ne peut y en avoir qu’un » !
Il faut donc que l’on désactive les beans registerContentWithVersionService et registerMLContainerWithVersionService pour laisser la place au nôtre.

Désactiver un bean Spring

Pour cela, je ne connais pas beaucoup de solutions. Celle qui me semble la plus « propre » est de surcharger la définition du bean et de lui affecter une classe « nulle ».
Un exemple de définition de cette classe, une NullFactoryBean pour être précis, peut être trouvée ici.
Après avoir packagé cette classe dans un jar déposé dans le dossier alfresco/WEB-INF/lib, il est possible d’écrire les lignes suivantes dans un fichier -context.xml :

<bean id="registerContentWithVersionService" class="fr.amexio.alfresco.spring.NullFactoryBean" />
<bean id="registerMLContainerWithVersionService" class="fr.amexio.alfresco.spring.NullFactoryBean"/>

Enregistrer notre behaviour

On reste dans notre fichier -context.xml pour ajouter quelques lignes pour enregistrer notre propre CalculateVersionLabelPolicy et l’associée à un JavaScript.
L’exemple suivant permet de définir le script à exécuter lorsque qu’un label de version doit être affecté à un cm:content.

<bean id="onIncreaseVersion"
	class="org.alfresco.repo.policy.registration.ClassPolicyRegistration"
	parent="policyRegistration">
	<property name="policyName">
		<value>{http://www.alfresco.org}calculateVersionLabel</value>
	</property>
	<property name="className">
		<value>{http://www.alfresco.org/model/content/1.0}content</value>
	</property>
	<property name="behaviour">
		<bean class="org.alfresco.repo.jscript.ScriptBehaviour"
			parent="scriptBehaviour">
			<property name="location">
				<bean class="org.alfresco.repo.jscript.ClasspathScriptLocation">
					<constructor-arg>
						<value>alfresco/extension/scripts/calculteVersion.js</value>
					</constructor-arg>
				</bean>
			</property>
		</bean>
	</property>
</bean>

Calculer notre propre numéro de version

Il ne reste maintenant plus qu’à écrire notre JavaScript. Pour ne plus avoir à gérer de version mineure, on peut envisager quelque chose comme :

function calculateVersionLabel() {
	var versionNumber = 0;
	if (behaviour.args[1] !== null)  {
		versionNumber = parseInt(behaviour.args[1].getVersionLabel());
	}
	versionNumber = 1 + versionNumber;
	return versionNumber + '';
}
calculateVersionLabel();

Voila qui est fait pour la version sérieuse. Pour jouer un peu, on va pouvoir mettre en place notre concept de numérotation à base de planète du système solaire :

var planetes = ["Mercure", "Venus", "Terre", "Mars", "Jupiter", "Saturne", "Uranus", "Neptune", "Pluton"];
function calculateVersionLabel() {
	var index = 0;
	if (behaviour.args[1] !== null)  {
		var curPlanete = behaviour.args[1].getVersionLabel();
		var planeteIndex = planetes.indexOf(curPlanete + '');
		index = (planeteIndex == -1) ? planetes.length + 1 : planeteIndex + 1;
	} 
	if (index < planetes.length) {
		return planetes[index];
	} else {
		return "Vous avez quitté le système solaire";
	}
}
calculateVersionLabel();

(oui, je sais, Pluton, tout ça….)

Finalisation et test

Il n’y a plus qu’à redémarrer Alfresco et jouer avec les documents pour en créer plusieurs versions.
Attention : l’aspect versionable doit être positionné sur le document.

Pour aller plus loin

On pourrait se pencher sur la question d’avoir des labels de versions propres à chaque typologie documentaire, ou encore chercher à utiliser les versions mineures… vous avez toutes informations nécessaire pour découvrir comment le faire par vous-même ;-)
Dans un prochain billet, nous prendrons le temps de modifier Share pour éviter que l’utilisateur soit invité à choisir entre version majeure et version mineure.

Cette entrée a été publiée dans Alfresco, Technique, avec comme mot(s)-clef(s) , . Vous pouvez la mettre en favoris avec ce permalien.

2 réponses à Des numéros de versions personnalisés

  1. Ping : Customiser Share 3.4.d pour nos numéros de versions personnalisés | ECM & Co

  2. Ping : Customiser Share 4.0.c pour nos numéros de versions personnalisés | ECM & Co

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