Wat?
Dit artikel gaat in op het ontwikkelen van een codegenerator op basis van XSLT. De codegenerator, GenerationZ genoemd, is ontwikkeld als een add-in voor Visual Studio. Zodoende kan er eenvoudig binnen de ontwikkelomgeving code gegenereerd worden. GenerationZ is inclusief de sourcecode beschikbaar gesteld door InfoSupport.
Waarom?
Aanleiding tot dit artikel is het feit dat er binnen elk project wel gebruik gemaakt wordt van een codegenerator. Deze codegenerator neemt herhaalbaar, en dus vervelend, werk uit handen van de developer.
Er zijn verschillende manieren om code te genereren. Een veel voorkomende manier is het genereren van code op basis van het datamodel. Dit is het soort generator dat we in dit artikel zullen bekijken. Hier is dus geen sprake van codegeneratie vanuit een Model (Model Driven Architecture), zogenaamde software generators. Deze manier van code genereren komt veel voor in migratie trajecten. Hier wordt dan de code vervangen, bijvoorbeeld omdat het platform verandert, maar het datamodel blijft daarbij hetzelfde.
De voordelen van een codegenerator zijn voor de hand liggend:
Helaas is de werking van deze generatoren niet gebaseerd op standaarden. Veelal wordt er gebruik gemaakt van een eigen template taal die men zich eerst eigen moet maken. Deze template talen ondersteunen variabele substitutie met de MetaData van de database, loops, etc. Erger nog, vaak ligt de gegenereerde code definitie vast in de code van de generator, niet herbruikbaar/aanpasbaar voor de eigen architectuur dus!
GenerationZ gebruikt hiervoor echter standaard XSLT en maakt hiermee code generatie flexibel. In de praktijk krijg je meestal geen tijd om zoiets netjes en generiek op te zetten. Daarom is GenerationZ ontwikkeld en inmiddels ook met succes is ingezet bij een van onze klanten.
Een ander nadelig argument bij bestaande generatoren is nog dat er voor de meeste generatoren betaald moet worden. Wij van Info Support bieden u GenerationZ kosteloos aan. Wij tekenen daarbij wel uitdrukkelijk aan dat wij iedere aansprakelijkheid uitsluiten voor schade die u onverhoopt lijdt als gevolg van gebruik of installatie van GenerationZ en dat wij derhalve ook geen enkele verantwoordelijkheid aanvaarden voor eventuele onvolkomenheden in deze publicatie of in GenerationZ. Iedere installatie en ieder gebruik van GenerationZ geschiedt dan ook voor uw eigen risico.
Werking van GenerationZ
De werking ziet er globaal als volgt uit: Database ->definitie in XML -> XSLT -> Code.

Fig. 1: Principe van codegeneratie
Elk XSLT file levert dus één gegenereerd code-file op .
De template variabelen zijn beschikbaar in de vorm van XSLT parameters (xsl:param). Het is mogelijk om een oneindig aantal eigen variabelen mee te geven (custom parameters) voor het gebruik van bijvoorbeeld projectnaam, auteursnaam, etc.
Door zelf de XSLT template aan te passen wordt er andere code gegenereerd. Elk willekeurige taal kan dus met deze tool gegenereerd worden.
Voorbeeld van een XML definitie file (METADATA)
Dit file wordt door GenerationZ in de temp directory opgeslagen, zodat deze klaar staat om door de transformatie gebruikt te worden.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
namespace
{
///
///
///
/// MetaData class voor
///
///Copyright InfoSupport, Veenendaal
public class MetaData
{
///
/// Table name
///
public const string c =
"";
///
/// Fields
///
class Fields
{
}
}
}
///
/// veldnaam
///
public const string
c =
"";
Voorbeeld van een XSLT file (MetaData.xsl)
Deze transformatie levert het volgende file op:
Namespace ClassLibrary1
{
///Rudi van den Belt
///Test
///
/// MetaData class voor authors
///
///Copyright InfoSupport, Veenendaal 2003
public class authorsMetaData
{
///
/// Table name
///
public const string cauthors = "authors";
///
/// Fields
///
class Fields
{
///
/// veldnaam au_lname
///
public const string cau_lname = "au_lname";
///
/// veldnaam au_fname
///
public const string cau_fname = "au_fname";
///
/// veldnaam phone
///
public const string cphone = "phone";
///
/// veldnaam address
///
public const string caddress = "address";
///
/// veldnaam city
///
public const string ccity = "city";
///
/// veldnaam state
///
public const string cstate = "state";
///
/// veldnaam zip
///
public const string czip = "zip";
///
/// veldnaam contract
///
public const string ccontract = "contract";
}
}
}
Voorbeeld van een resulterende class
Toepassen van GenerationZ
GenerationZ is geïmplementeerd als een add-in voor Visual Studio .NET(2002). Installatie van GenerationZ gebeurt d.m.v. van de MSI; accepteer daarbij de standaard installatie opties.
Binnen GenerationZ selecteer je een database d.m.v. de add-in settings in Visual Studio (Tools/Options).

Fig. 2: Settings voor GenerationZ
Voeg in dit window eigen custom parameters toe die als dusdanig doorgegeven worden aan de XSLT template zoals projectnaam, auteursnaam etc.
Zorg ervoor dat in de solution explorer de folder (of een file in de folder) geselecteerd is waarin het te genereren bestand terecht dient te komen.
Selecteer een database tabel (of meerdere). Binnen de tabel kan ook nog gekozen worden welke kolommen er meegenomen moeten worden in de generatie. Druk vervolgens op de rechter muistoets. Er verschijnt een lijst met te genereren classes , zgn. generatie items. Selecteer de juiste. De genereerde classes worden nu toegevoegd aan het project.

Fig. 3: GenerationZ in actie
Als resultaat van deze actie is er nu een Business class bij gekomen in het project met de naam PreauthorsBusiness.cs .
Waarom is het nu juist deze bestandsnaam geworden?
Het aantal/type classes dat op deze manier gegenereerd kan worden, is eenvoudig aan te passen m.b.v. het file GenerateItems.xml in de installatie directory (default c:\program files\InfoSupport\GenerationZ) :
BusinessClass
Pre
Business.cs
BusinessClass.xsl
MetaData
MetaData.cs
MetaData.xsl
Per “Generatie Item” kan dus opgegeven worden waarmee het file moet beginnen (PreFix) en waarmee het file moet eindigen (PostFix). In het midden komt altijd de tabelnaam te staan. De tag XslFile geeft vervolgens de bestandsnaam van het XSLT file aan. Deze dient ook in de
installatie directory te staan.
Een aantal voorbeelden van XSLT files is standaard mee geleverd. Deze templates kunnen naar eigen inzicht en naar de eigen architectuur worden uitgebreid/aangepast.
Extra parameters:
De volgende parameters worden altijd doorgegeven aan de XSLT templates: