<?xml version="1.0" encoding="UTF-8" ?> <!-- C1873 SRU Hospitality adl2entityclass.xsl (c) 2007 Cygnet Solutions Ltd Transform ADL into entity classes $Author: af $ $Revision: 1.1 $ $Date: 2008-01-09 15:01:45 $ --> <!-- WARNING WARNING WARNING: Do NOT reformat this file! Whitespace (or lack of it) is significant! --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="UTF-8" method="text"/> <!-- The locale for which these entities are generated TODO: Entities should NOT be locale specific. Instead, the entity should generate messages based on the client's locale. However, there may still need to be a concept of a 'default locale', for when we don't have messages which suit the client's locale --> <xsl:param name="locale" select="en-UK"/> <!-- The C# namespace within which I shall generate controllers --> <xsl:param name="controllerns" select="Unset"/> <!-- The C# namespace within which I shall generate entities --> <xsl:param name="entityns" select="Unset"/> <xsl:template match="application"> <xsl:apply-templates select="entity"/> </xsl:template> <xsl:template match="application"> <xsl:apply-templates select="entity"/> </xsl:template> <xsl:template match="entity"> <!-- what's all this about? the objective is to get the revision number of the transform into the output, /without/ getting that revision number overwritten with the revision number of the generated file if the generated file is stored to CVS --> <xsl:variable name="transform-rev1" select="substring( '$Revision: 1.1 $', 11)"/> <xsl:variable name="transform-revision" select="substring( $transform-rev1, 0, string-length( $transform-rev1) - 1)"/> /* ---- [ cut here: next file '<xsl:value-of select="@name"/>.auto.cs'] ---------------- */ //------------------------------------------------------------- // // Application Description Framework // <xsl:value-of select="@name"/>.auto.cs // // (c)2007 Cygnet Solutions Ltd // // Automatically generated from application description using // adl2entityclass.xsl version <xsl:value-of select="$transform-revision"/> // // This file is automatically generated; DO NOT EDIT IT. // //------------------------------------------------------------- namespace <xsl:value-of select="$entityns"/> { using System; using System.Configuration; using System.Collections; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using ADL.Exceptions; using Iesi.Collections.Generic; /// <summary> /// Automatically generated from description of entity <xsl:value-of select="@name"/> /// using adl2entityclass.xsl. Note that manually maintained parts of this /// class may be defined in a separate file called <xsl:value-of select="@name"/>.cs, q.v. /// /// DO NOT EDIT THIS FILE! /// </summary> public partial class <xsl:value-of select="@name"/> : Entity { /// <summary> /// Auto-generated no-args constructor; does nothing (but probably should /// ensure ID slot is initialised correctly) /// </summary> public <xsl:value-of select="@name"/>() : base(){ <xsl:call-template name="initialise-lists"/> } /// <summary> /// Auto-generated one-arg constructor; initialises Id slot and also all /// one-to-many slots /// </summary> public <xsl:value-of select="@name"/>( int key) { <xsl:call-template name="initialise-lists"/> <xsl:choose> <xsl:when test="@natural-key"> /* natural primary key exists - not initialising abstract key */ </xsl:when> <xsl:otherwise> _<xsl:value-of select="@name"/>Id = key; </xsl:otherwise> </xsl:choose> } <xsl:choose> <xsl:when test="@natural-key"> /* natural primary key exists - not generating abstract key */ </xsl:when> <xsl:otherwise> /// <summary> /// Auto-generated iv/property for Id slot /// </summary> private int _<xsl:value-of select="@name"/>Id = -1; public virtual int <xsl:value-of select="@name"/>Id { get { return _<xsl:value-of select="@name"/>Id; } set { _<xsl:value-of select="@name"/>Id = value; } } /// <summary> /// Auto-generated overridden property for the Key slot, maps onto /// _<xsl:value-of select="@name"/>Id /// </summary> public override int Key { get { return _<xsl:value-of select="@name"/>Id; } } </xsl:otherwise> </xsl:choose> /// <summary> /// A user readable distinct identifying string /// </summary> public override string UserIdentifier { get { StringBuilder result = new StringBuilder(); <xsl:choose> <xsl:when test="property[@distinct='user']"> <xsl:for-each select="property[@distinct='user']"> <xsl:choose> <xsl:when test="@type='entity'"> <!-- TODO: this is dangerous and could potentially give rise to infinite loops; find a way of stopping it running away! --> result.Append( <xsl:value-of select="concat( @name, '.UserIdentifier')"/>); </xsl:when> <xsl:otherwise> result.Append(<xsl:value-of select="concat( '_', @name)"/>); </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="position() = last()"/> <xsl:otherwise> result.Append( ", "); </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:when> <xsl:otherwise> result.AppendFormat( "<xsl:value-of select="@name"/>#{0}[", _<xsl:value-of select="@name"/>Id); </xsl:otherwise> </xsl:choose> return result.ToString(); } } <xsl:apply-templates select="property"/> } } </xsl:template> <xsl:template match="property[@concrete='false']"> <!-- generate nothing for non-concrete properties --> </xsl:template> <xsl:template match="property"> // auto generating iv/property pair for slot with name <xsl:value-of select="@name"/> <xsl:apply-templates select="help"/> <xsl:variable name="defined-type"> <xsl:choose> <xsl:when test="@type='defined'"> <xsl:variable name="definition"> <xsl:value-of select="@definition"/> </xsl:variable> <xsl:value-of select="/application/definition[@name=$definition]/@type"/> </xsl:when> </xsl:choose> </xsl:variable> <xsl:variable name="type"> <xsl:choose> <xsl:when test="@type = 'link'"> ICollection<<xsl:value-of select="@entity"/>> </xsl:when> <xsl:when test="@type = 'list'"> ICollection<<xsl:value-of select="@entity"/>> </xsl:when> <xsl:when test="@type = 'date'">DateTime</xsl:when> <xsl:when test="@type = 'time'">DateTime</xsl:when> <xsl:when test="@type = 'string'">String</xsl:when> <xsl:when test="@type = 'text'">String</xsl:when> <xsl:when test="@type = 'boolean'">bool</xsl:when> <xsl:when test="@type = 'timestamp'">TimeStamp</xsl:when> <xsl:when test="@type = 'integer'">int</xsl:when> <xsl:when test="@type = 'real'">double</xsl:when> <xsl:when test="@type = 'money'">Decimal</xsl:when> <xsl:when test="@type = 'entity'"> <xsl:value-of select="@entity"/> </xsl:when> <xsl:when test="@type='defined'"> <!-- MUCH more complicated... find the right definition, then map its type onto a C# type --> <xsl:choose> <!-- DefinableDataTypes are string|integer|real|money|date|time|timestamp --> <xsl:when test="$defined-type = 'string'">String</xsl:when> <xsl:when test="$defined-type = 'integer'">int</xsl:when> <xsl:when test="$defined-type = 'real'">double</xsl:when> <xsl:when test="$defined-type = 'money'">Decimal</xsl:when> <xsl:when test="$defined-type = 'date'">DateTime</xsl:when> <xsl:when test="$defined-type = 'time'">DateTime</xsl:when> <xsl:when test="$defined-type = 'timestamp'">TimeStamp</xsl:when> </xsl:choose> </xsl:when> <xsl:otherwise>[unknown?]</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="nullable-decoration"> <xsl:choose> <xsl:when test="@required='true'"/> <!-- when required is 'true' null is not permitted anyway; otherwise... --> <xsl:when test="$type = 'int'">?</xsl:when> <xsl:when test="@type = 'boolean'">?</xsl:when> <xsl:when test="$type = 'double'">?</xsl:when> <xsl:when test="$type = 'Double'">?</xsl:when> <xsl:when test="$type = 'DateTime'">?</xsl:when> <xsl:when test="$type = 'TimeStamp'">?</xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:variable> <xsl:variable name="initialiser"> <xsl:choose> <xsl:when test="@default"> <xsl:choose> <xsl:when test="$type = 'String'"> = "<xsl:value-of select="@default"/>"</xsl:when> <xsl:otherwise> = <xsl:value-of select="@default"/></xsl:otherwise> </xsl:choose> </xsl:when> <xsl:when test="$nullable-decoration = '?'"> = null</xsl:when> <xsl:when test="@type = 'boolean'"> = false</xsl:when> <xsl:when test="$type = 'int'"> = 0</xsl:when> <xsl:when test="$type = 'double'"> = 0.0</xsl:when> <xsl:when test="$type = 'Decimal'"> = 0.0M</xsl:when> <xsl:when test="$type='String'"> = null</xsl:when> </xsl:choose> </xsl:variable> <xsl:variable name="validationpattern"> <xsl:choose> <xsl:when test="@type='defined'"> <xsl:variable name="definition"> <xsl:value-of select="@definition"/> </xsl:variable> <xsl:value-of select="/application/definition[@name=$definition]/@pattern"/> </xsl:when> </xsl:choose> </xsl:variable> <xsl:if test="string-length( $validationpattern) > 0"> private Regex <xsl:value-of select="@name"/>Validator = new Regex( "<xsl:value-of select="$validationpattern"/>"); </xsl:if> private <xsl:value-of select="$type"/><xsl:value-of select="$nullable-decoration"/> _<xsl:value-of select="@name"/> <xsl:value-of select="$initialiser"/>; public virtual <xsl:value-of select="$type"/><xsl:value-of select="$nullable-decoration"/><xsl:text> </xsl:text> <xsl:value-of select="@name"/> { get { return _<xsl:value-of select="@name"/>; } set { <xsl:if test="@required='true'"> if ( value == null) { throw new DataRequiredException( <xsl:choose> <xsl:when test="ifmissing[@locale=$locale]"> <xsl:apply-templates select="ifmissing"/> </xsl:when> <xsl:otherwise> "The value for <xsl:value-of select="@name"/> may not be set to null" </xsl:otherwise> </xsl:choose> ); } </xsl:if> <xsl:if test="@type='defined'"> <xsl:variable name="definition"> <xsl:value-of select="@definition"/> </xsl:variable> <xsl:variable name="maximum"> <xsl:value-of select="/application/definition[@name=$definition]/@maximum"/> </xsl:variable> <xsl:variable name="minimum"> <xsl:value-of select="/application/definition[@name=$definition]/@minimum"/> </xsl:variable> <xsl:if test="string-length( $maximum) > 0"> if ( value > <xsl:value-of select="$maximum"/>) { throw new DataRangeException( "The maximum permitted value for <xsl:value-of select="@name"/> is <xsl:value-of select="$maximum"/>"); } </xsl:if> <xsl:if test="string-length( $minimum) > 0"> if ( value < <xsl:value-of select="$minimum"/>) { throw new DataRangeException( "The minimum permitted value for <xsl:value-of select="@name"/> is <xsl:value-of select="$minimum"/>"); } </xsl:if> <xsl:if test="string-length( $validationpattern) > 0"> if ( value != null && ! <xsl:value-of select="@name"/>Validator.IsMatch( value)) { throw new DataFormatException( string.Format( "The value supplied ({0}) does not match the format required by <xsl:value-of select="@name"/>", value)); } </xsl:if> </xsl:if> <xsl:if test="@size and $type='String'"> if ( value != null && value.Length > <xsl:value-of select="@size"/>) { value = value.Substring( 0, <xsl:value-of select="@size"/>); } </xsl:if> _<xsl:value-of select="@name"/> = value; } } </xsl:template> <xsl:template match="help"> <xsl:if test="@locale=$locale"> <!-- might conceivably be more than one line --> <xsl:text> /* </xsl:text><xsl:apply-templates/> */ </xsl:if> </xsl:template> <xsl:template match="ifmissing"> <xsl:if test="@locale=$locale"> "<xsl:value-of select="normalize-space(.)"/>" </xsl:if> </xsl:template> <xsl:template name="initialise-lists"> <!-- initialise all cocrete lists and links --> <xsl:for-each select="property[@type='list']"> <xsl:choose> <xsl:when test="@concrete='false'"/> <xsl:otherwise> _<xsl:value-of select="@name"/> = new HashedSet<<xsl:value-of select="@entity"/>>(); </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:for-each select="property[@type='link']"> <xsl:choose> <xsl:when test="@concrete='false'"/> <xsl:otherwise> _<xsl:value-of select="@name"/> = new HashedSet<<xsl:value-of select="@entity"/>>(); </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet>