La seconde étape consiste à développer le désassembleur qui va héberger la classe développée précédemment. Pour avoir plus de détails sur les types de pipelines je vous conseille
ce site msdn.
Vous pouvez créer un tel composant à la main en partant d'un projet BizTalk vierge ou bien vous pouvez installer le
Biztalk Server Pipeline Component Wizard.
Une fois l'installation effectuée un nouveau projet nommé
Biztalk Server Pipeline Component Project est accessible depuis Visual Studio 2005. Dès que l'utilisateur choisi ce type de projet un wizard se lance et lui demande si le composant va être utilisé par un pipeline de réception ou d'émission et à quelle étape du traitement il est susceptible d'intervenir. Dans notre cas il va être utilisé en réception (dans le troisième article nous verrons le cas d'un composant utilisé en émission) à l'étape du désassemblage (ces étapes vont être décrites un peu plus loin) :
La dernière étape du wizard consiste à préciser les paramètres qui seront accessibles aux utilisateurs de notre composant. Nous allons créer les variables ci-dessous et verrons leur utilité au fur et à mesure de notre avancée dans cet article et ceux à venir :
Toutes les variables sont simples (booléen, chaînes de caractères) sauf
Schemas qui est de type
SchemaList. Cette classe représente la liste des schémas donnés en paramètre par l'utilisateur et qui vont être utilisés pour extraire les fragments du document XML.
La classe
SchemaList de l'assembly
Microsoft.BizTalk.Component.Utilities.dll contient des éléments de type
Schema et non
System.Xml.XmlSchema que nous avons l'habitude d'utiliser sous .Net. Nous verrons un peu plus loin comment utiliser ces classes.
A la fin de toutes les étapes le wizard lève une exception mais nous pouvons l'ignorer car elle n'est nullement pénalisante pour la suite.
Si on regarde le code généré, le wizard créé essentiellement une classe qui implémente les interfaces suivantes :
[ComponentCategory(CategoryTypes.CATID_PipelineComponent)]
[System.Runtime.InteropServices.Guid("a06fc47a-8349-4ed0-a3b3-e2de3f13beaa")]
[ComponentCategory(CategoryTypes.CATID_DisassemblingParser)]
public class XmlDecomposer :
Microsoft.BizTalk.Component.Interop.IDisassemblerComponent,
IBaseComponent, IPersistPropertyBag, IComponentUI
{
- IBaseComponent : contient trois propriétés qui donnent des informations sur le nom, la version et la description du composant.
- IComponentUI : a deux fonctions dont une pour valider la configuration du composant et une autre qui donne l'icône. Cette interface est notamment utilisée par le designer de Visual Studio.
- IPersistPropertyBag : permet entre autres de sauvegarder et de recharger les valeurs des paramètres donnés au composant à l'aide d'un PropertyBag.
- IDisassemblerComponent : la méthode Disassemble est responsable du traitement du message reçu. Pour un message en entrée elle génère un ou plusieurs messages en sortie. La fonction GetNext retourne ces messages un par un et elle est appelée par BizTalk jusqu'à ce qu'elle retourne null.
Les methodes
Load et
Save sont déjà implémentées pour les types simples (chaînes de caractères par exemple) mais un
#error avec un message adéquat est créé pour les types complexes tels que
SchemaList :
public virtual void Save(Microsoft.BizTalk.Component.Interop.IPropertyBag pb, bool fClearDirty, bool fSaveAllProperties)
{
this.WritePropertyBag(pb, "EnforeValidatation", this.EnforeValidatation);
this.WritePropertyBag(pb, "MessagePropertyName", this.MessagePropertyName);
this.WritePropertyBag(pb, "PartPropertyName", this.PartPropertyName);
this.WritePropertyBag(pb, "MessagePropertyNameSpace", this.MessagePropertyNameSpace);
this.WritePropertyBag(pb, "PartPropertyNameSpace", this.PartPropertyNameSpace);
#error please implement IPersistPropertyBag.Save for property "Schemas"
}
La méthode
Disassemble retourne par défaut le message reçu en entrée. C'est là que nous allons intervenir par la suite. Vous noterez que cette méthode ajoute le message dans une queue qui est parcourue dans la méthode
GetNext. Ainsi, si nous avons plusieurs messages, il suffit de les insérer dans cette queue afin qu'ils soient dépilés plutard :
public void Disassemble(Microsoft.BizTalk.Component.Interop.IPipelineContext pc,
Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
{
//
// TODO: implement message retrieval logic
//
_msgs.Enqueue(inmsg);
}
Si vous commentez les
#error des méthodes
Load et
Save et que vous essayez de compiler ce projet alors cela échoue car il manque une référence à l'assembly
Microsoft.BizTalk.Component.Utilities.dll qui se trouve dans le GAC. Si comme pour moi cette dll n'est pas visible dans la liste quand on fait
Add Reference dans Visual Studio il est possible de l'ajouter en pointant l'assembly comme suit :
%WINDOWS%\assembly\GAC_MSIL\Microsoft.BizTalk.Component.Utilities\3.0.1.0__31bf3856ad364e35\Microsoft.BizTalk.Component.Utilities.dll :