Gestion de stratégies d'informations (policy)

Création d'une custom policy (gestion de stratégies d'informations)

02/20/2009 3 109 lectures 1 commentaire 4.5/5 (2 votes) Sébastien Sougnez

La structure interne ainsi que le design d'AreaProg ont récemment été modifiés.
Suite à cela, le format de certains articles a été perturbé. Le problème est connu et en cours de résolution. Merci de votre compréhension.

Dans ce cours, nous allons aborder la gestion de stratégies d'informations. Avant de passer au développement d'une personnelle, nous allons voir comment utiliser une stratégie déjà existante. Pretez également attention au fait que la gestion des stratégies d'informations n'est disponible que sous MOSS et non sous WSS. A l'installation de MOSS, plusieurs stratégies sont installées. Nous allons expliquer ce que c'est à l'aide de l'utilisation d'une stratégie pré-existante, cela vous permettra de mieux comprendre l'intêret. Quand vous développez un Event Handler, vous n'avez pas forcément envie de l'appliquer à toute les listes, ou vous aimeriez peut-être désactiver temporairement un Event Handler d'une liste pour l'activer un peu plus tard. La gestion de statégies d'informations va nous aider à réaliser cela. Créez une nouvelle custom list dans SharePoint et allez dans les paramètres de cette listes (Settings > List settings). Cliquez ensuite sur Information management policy settings pour voir l'écran suivant apparaître :
 

Image


Nous avons donc le choix de définir une stratégie dans cet écran. Laissez donc la deuxième option cochée et cliquez sur OK. Nous allons activer une stratégie qui permet d'insérer un code-barre avec un élément d'une liste. Cochez donc la dernière stratégie :
 

Image


Cliquez maintenant sur OK pour appliquer la stratégie. Revenez maintenant dans votre liste et ajoutez un nouvel élément à cette dernière. Une fois cet élément ajoutez, cliquez dessus pour afficher son contenu, vous devriez obtenir quelque chose dans ce style :
 

Image


Comme vous le voyez, un code barre a bien été créé et joint à l'élément que nous venons de créer. C'est bien la stratégie qui nous a permit d'activer cette fonctionnalité. Si vous créez une autre liste dans laquelle vous n'activez pas cette stratégie, aucun code-barre ne sera généré. Nous allons maintenant voir comment créer notre propre stratégie. Cette stratégie sera très simple. Elle permettra de lier une liste à un Event Handler permettant de modifier le titre des éléments ajoutés à une liste. Nous allons voir que ce n'est pas très compliqué. C'est légéremment fastidieux mais en fin de compte c'est très pratique. Commencez par créer un nouveau projet WSP Builder vide à l'aide de Visual Studio 2008. Ajoutez ensuite une feature vide (click droit sur le projet > Add > New Item. Cliquez sur WSP Builder et choisissez Blank Feature). Nommez cette feature "RenameItemPolicy". Dans l'écran permettant de définir le scope de la feature, choisissez Farm pour que la stratégie soit active sur toute la ferme SharePoint.. Maintenant que le squelette de notre feature est créé, nous allons ajouter le code permettant de renommer l'item de la liste. Ajoutez donc une nouvelle classe à votre projet et nommez la RenameItemEventHandler. Nous allons devoir ajouter une référence à l'API SharePoint pour pouvoir accéder à l'object model et modifier le titre de l'élément de la liste. Cliquez donc avec le bouton droit sur le dossier Références de votre projet et cliquez sur Add Reference. Dans la liste, choisissez Windows SharePoint Services. Dans votre classe, ajoutez également la directive :
 

using Microsoft.SharePoint; 


Maintenant, nous allons devoir faire dériver notre classe de SPItemEventReceiver et surcharger la méthode ItemAdding. Le squelette de votre classe devrait donc ressembler à celui-ci :
 

class RenameItemEventHandler : SPItemEventReceiver
{
	public override void ItemAdding(SPItemEventProperties properties)
	{

	}
}


Nous allons maintenant modifier le code de cette méthode pour modifier le titre de l'élément ajouté :
 

using (SPSite site = new SPSite(properties.WebUrl))
{
	using (SPWeb web = site.OpenWeb())
	{
		properties.AfterProperties["Title"] = "Item " + (web.Lists[properties.ListId].ItemCount + 1);
	}
}


Ce code est assez simple. Il commence par créer un objet SPSite à l'aide de la valeur de la propriété WebUrl de l'objet properties. Cette propriété contient l'adresse du site contenant la liste qui contient l'élément qui a déclenché l'événement. Nous ouvrons ensuite le site racine et nous plaçons la référence à celui-ci dans un objet de type SPWeb. Ensuite, nous nous contentons de modifier la valeur du champ Title de l'élément par "Item suivi du nombre d'élément contenu dans la liste identifiée par le GUID contenu dans la propriété ListId de l'objet properties. Nous allons maintenant créer une deuxième classe. Cette classe va nous permettre de définir le comportement de notre stratégie (en anglais : Policy). Créez donc une nouvelle classe que vous nommerez RenameItemPolicy et ajoutez-y la directive :
 

using Microsoft.SharePoint; 


Nous allons également devoir ajouter une autre directive pour pouvoir utiliser les stratégies. Commencez par cliquer avec le bouton droit de votre souris sur le dossier References et cliquez sur Add References. Cliquez alors sur Browse pour aller chercher le fichier DLL requis sur le disque dur. Ce fichier est le suivant : C:\Program Files\Common Files\Microsoft Shared\Web server extensions\12\ISAPI\Microsoft.Office.Policy.dll.

Une fois cette référence ajoutée, ajoutez cette directive :
 

using Microsoft.Office.RecordsManagement.InformationPolicy; 


Nous allons maintenant devoir implémenter une interface à notre classe pour pouvoir utiliser les policy. Faites donc dériver votre classe de l'interface IPolicyFeature. Une fois cela fait, placez votre curseur sur IPolicyFeature jusqu'à ce qu'un petit rectangle apparaisse. Cliquez dessus et cliquez sur Implement Interface "IPolicyFeature". Au final, votre code devrait être le suivant :
 

class RenameItemPolicy : IPolicyFeature
{
	public void OnCustomDataChange(PolicyItem policyItem, SPContentType ct)
	{
		throw new Exception("The method or operation is not implemented.");
	}

	public void OnGlobalCustomDataChange(PolicyFeature feature)
	{
		throw new Exception("The method or operation is not implemented.");
	}

	public bool ProcessListItem(SPSite site, PolicyItem policyItem, SPListItem listItem)
	{
		throw new Exception("The method or operation is not implemented.");
	}

	public bool ProcessListItemOnRemove(SPSite site, SPListItem listItem)
	{
		throw new Exception("The method or operation is not implemented.");
	}

	public void Register(SPContentType ct)
	{
		throw new Exception("The method or operation is not implemented.");
	}

	public void UnRegister(SPContentType ct)
	{
		throw new Exception("The method or operation is not implemented.");
	}
}


Ces 6 fonctions ont un role bien définit. Quand nous définissons une stratégie, il nous est possible de définir des options pour celle-ci, la fonction OnCustomDataChange permet d'enregistrer la valeur de ces options et la méthode OnGlobalCustomDataChange nous permet d'enregistrer les paramètres globaux liés à cette stratégie. Nous n'utiliserons pas ces deux fonctions, supprimez en donc le contenu et uniquement le contenu. Nous avons ensuite deux méthodes qui devraient normalement être utiles, si seulement elles fonctionnaient. La méthode ProcessListItem permet d'appliquer notre stratégie aux éléments déjà présents dans la liste alors que la méthode ProcessListItemOnRemove permet d'exécuter du code à la suppression de la stratégie pour la liste. J'ai essayé d'utiliser ces fonctions de plusieurs manières possibles et j'ai effectué des recherches sur celles-ci, mais elles ne semblent pas être appelées au moment ou elles devraient l'être. Je suis actuellement en train de me renseigner, je modifierai ce cours si j'ai du nouveau. Tant que maintenant, ces deux fonctions doivent renvoyer un bool, ne serait-ce que pour permettre à Visual Studio de compiler notre solution. Tapez donc :
 

return true; 


Dans ces deux fonctions. Nous avons ensuite deux fonctions importantes. La méthode Register va nous permettre d'exécuter des instructions lorsque nous lions notre stratégie à la liste, alors que la méthode UnRegister nous permet d'exécuter des instructions lorsque nous supprimons la liaison entre la stratégie et la liste. Nous allons modifier ces deux fonctions. La fonction Register nous permettra d'associer l'Event handler à la liste alors que la fonction UnRegister nous permettra de supprimmer cette association. Avant de continuer, compilez votre projet pour générer le DLL de ce dernier. Tapez ensuite le code suivant dans la fonction Register :
 

SPEventReceiverDefinition def = ct.ParentList.EventReceivers.Add();
def.Assembly = "RenameItemPolicy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=82e7e162cfaa4875";
def.Class = "RenameItemPolicy.RenameItemEventHandler";
def.Name = "Renommer l'item";
def.Type = SPEventReceiverType.ItemAdding;
def.SequenceNumber = 1000;
def.Update(); 


La première ligne nous permet d'ajouter un Event Handler à la liste. Le paramètre de cette fonction est un content type. Il possède donc une propriété ParentList qui permet de récupérer la référence à la liste à laquelle nous lions notre policy. Nous ajoutons ensuite un élément à la collection d'Event Handler de cette liste. Nous récupérons la référence à cet Event Handler dans l'objet def. Nous allons maintenant devoir modifier quelques propriétés de cet objet. La première de ces propriétés est Assembly. Celle-ci devra contenir la signature de l'assembly contenant le code de l'Event Handler. Cet assembly est celui dans lequel nous travaillons actuellement. Ouvrez donc Reflector (outils abordés dans le cours sur le Matériel et l'installation de SharePoint), et allez rechercher le fichier DLL correspondant à votre projet (binDebug). Une fois ce DLL ouvert, il s'ajoute à la liste de Reflector, cliquez dessus et placez le contenu du champ Name dans le presse-papier. Collez ensuite cette valeur en tant que valeur de la propriété Assembly de l'objet def. Après avoir défini l'assembly, nous allons définir la classe contenant le code de l'Event Handler. Dans notre cas, il s'agit de la classe RenameItemEventHandler du namespace RenameItemPolicy. Nous modifions ensuite la propriété Name pour donner un nom à notre Event handler. Nous définissions ensuite le type de cet Event Handler en modifiant sa propriété Type sur l'élément ItemAdding de l'énumération SPEventReceiverType. Effectivement, nous ne surveillons que cet événement. Enfin, nous modifions la propriété SequenceNumber pour définir la priorité de cet Event Handler sur les autres. Nous appelons ensuite la fonction Update de cet Event Handler pour enregistrer les modifications. Etant donné que nous lions notre Event Handler à la liste lors de la liaison entre celle-ci et notre policy, nous devrons faire l'inverse dans la fonction UnRegister. Tapez donc ce code :
 

if (ct != null)
{
	foreach (SPEventReceiverDefinition def in ct.ParentList.EventReceivers)
	{
		if (def.Name == "Renommer l'item")
		{
			def.Delete(); break;
		}
	}
}


Ce code n'a rien de bien compliqué. Nous commençons par vérifier que le paramètre de la fonction est bien différent de null. Si c'est le cas, nous parcourons la liste des Event Handler de la liste parent du content type passé en paramètre. Si la propriété Name de l'Event Handler examiné lors de l'itération courante de la liste est égale au nom que nous avons donné à notre Event handler précédemment, nous supprimons celui-ci et nous quittons la boucle. Nous n'avons pas encore terminé avec notre policy. Nous allons maintenant devoir créer un fichier XML permettant d'enregistrer la policy dans SharePoint. Créez donc ce fichier dans le dossier contenant les deux autres fichiers XML de votre feature et nommez le Policy.xml. Tapez ceci dedans :
 

<?xml version="1.0" encoding="utf-8" ?>
<PolicyFeature id="RenameItemPolicy.RenameItemEventHandler" xmlns="urn:schemas-microsoft-com:office:server:policy">
	<Name>Renomme l'item</Name>
	<Description>Permet de renommer l'item pour lui donner son index dans la liste majoré de 1</Description>
	<Publisher>AreaProg</Publisher>
	<AssemblyName>RenameItemPolicy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=82e7e162cfaa4875</AssemblyName>
	<ClassName>RenameItemPolicy.RenameItemPolicy</ClassName>
</PolicyFeature>


Ce fichier n'est pas bien compliqué. Tout d'abord, nous avons le prologue XML, ensuite, nous ouvrons l'élément PolicyFeature pour définir les propriétés de notre policy. Nous définissons d'abord l'id de celle-ci. L'id permettra d'identifier uniquement votre policy, nous verrons que cela nous servira. Généralement, je met le chemin complet vers l'Event Handler. Nous définissions ensuite l'urn du fichier. Cet argument doit toujours avoir la même valeur. Nous définissons ensuite plusieurs propriétés de notre policy. Le premier est son nom, c'est celui-ci qui apparaitra dans l'interface de SharePoint lorsque vous voudrez lier votre stratégie à la liste. L'élément Description nous permet quant à lui de donner une description de la stratégie. L'élément Publisher permet de définir l'auteur de la policy. Ensuite, nous avons les habituels élément AssemblyName et ClassName qui doivent contenir respectivement la signature de l'assembly contenant le code à exécuter par la policy et le chemin d'accès complet vers la classe contenant ce code. C'est en fait le chemin vers la classe dérivant de IPolicyFeature. Passons maintenant à la dernière étape qui va nous permettre d'ajouter la policy à SharePoint lors de l'activation de la feature. Ajoutez donc une nouvelle classe à votre projet que vous nommerez RenameItemFeatureActivator. Commencez par rajouter les directives suivantes :
 

using Microsoft.SharePoint;
using Microsoft.Office.RecordsManagement.InformationPolicy;
using System.Xml; 


Nous devons ensuite faire dériver notre classe de SPFeatureReceiver :
 

class RenameItemFeatureActivator : SPFeatureReceiver 


Continuez ensuite en surchageant deux méthodes de la clasese que nous n'utiliserons pas :
 

public override void FeatureInstalled(SPFeatureReceiverProperties properties) { }
public override void FeatureUninstalling(SPFeatureReceiverProperties properties) { } 


Nous n'avons pas besoin d'intercepter l'événement lancé lors de l'installation et la désinstallation de la feature, nous ne fournissons donc pas de code à ces deux fonctions. Par contre, nous allons devoir ajoutez la policy à SharePoint lors de l'activation de cette feature. Surchargez donc la fonction FeatureActivated de cette manière :
 

SPSecurity.RunWithElevatedPrivileges(delegate()
{
	XmlDocument doc = new XmlDocument();
	doc.Load(properties.Feature.Definition.RootDirectory + "Policy.xml");
	PolicyFeatureCollection.Add(doc.InnerXml);
}); 


Premièrement nous utilisons RunWithElevatedPrivileges pour exécuter ce code avec les privilèges relatifs au pool d'application de SharePoint. Nous verrons cela dans un autre cours, sachez juste que cela vous permet d'exécuter du code avec des privilèges plus importants que ceux d'un simple utilisateur. Nous créons ensuite un nouvel objet XmlDocument qui devra contenir le contenu de notre fichier Policy.xml. Pour cela, nous utilisons la méthode Load de celui-ci. Nous utilisons la propriété RootDirectory de la feature qui permet de récupérer le répertoire d'installation de la feature. Enfin, nous ajoutons le contenu XML de cet objet à la collection des policy de SharePoint. Il va également falloir surcharger la méthode FeatureDeactivating pour supprimer la policy de SharePoint lors de la désactivation de la feature :
 

SPSecurity.RunWithElevatedPrivileges(delegate()
{
	PolicyFeatureCollection.Delete("RenameItemPolicy.RenameItemEventHandler");
}); 


Ici, nous utilisons encore une fois RunWithElevatedPrivileges pour nous donner les droits d'accès à la policy. Ensuite, nous utilisons simplement la méthode Delete de la collection de policy de SharePoint pour supprimer celle-ci. Nous passons l'ID de celle-ci en paramètre pour la localiser. Cet ID est celui définit dans le fichier Policy.xml. Il ne nous reste qu'une seule chose à faire, c'est lier le fichier feature.xml à son Event Handler. Pour cela, ouvrez le fichier feature.xml et rajoutez ces deux attributs :
 

ReceiverAssembly="RenameItemPolicy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=82e7e162cfaa4875"
ReceiverClass="RenameItemPolicy.RenameItemFeatureActivator" 


Ainsi, nous avons lié notre Event Handler à notre feature. Compilez et déployez maintenant votre solution. Une fois ceci fait, créez une custom list dans votre site SharePoint. Allez dans Settings > List Settings > Information management policy settings. Laissez Define a policy et vous devriez voir apparaître votre policy dans la liste :
 

Image


Cochez donc notre police et validez. Ajoutez maintenant un élément dans votre liste. Si tous se passe bien, le titre de cet élément se modifiera en Item 1. Vous pouvez à tous moment désactiver votre policy pour retrouver un comportement normal de votre liste.

Noter

Veuillez vous identifier ou vous inscrire pour donner une note à cet article.

Commentaires / Questions

Adrien M (06/07/2010 - 16:32)

Sympa!

Veuillez vous identifier ou vous inscrire pour réagir à cet article.

Avatar

Sébastien Sougnez

Envoyer un mail Site web Windows live messenger LinkedIn Twitter Facebook MVP Administrateur

25754 points