<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>DSLs</title>
        <link>http://geekswithblogs.net/jlavin/category/6750.aspx</link>
        <description>Ramblings about Domain Specific Languages and how to build them.</description>
        <language>en-US</language>
        <copyright>Jim Lavin</copyright>
        <managingEditor>jlavin@jimlavin.net</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Posted: Industry Vertical Episode 001</title>
            <link>http://geekswithblogs.net/jlavin/archive/2008/11/04/126600.aspx</link>
            <description>I am proud to present the first episode of Industry Vertical the twice monthly net cast about industrializing software development with Software Factories, Guidance Automation and Domain Specific Languages at http://tinyurl.com/6gjlgl. This episode starts out with the basics of Software Factories and trys to answer the question "What is a Software Factory".&lt;span class="entry-content"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=126600"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=126600" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/jlavin/aggbug/126600.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2008/11/04/126600.aspx</guid>
            <pubDate>Tue, 04 Nov 2008 13:06:04 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/126600.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2008/11/04/126600.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/126600.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/126600.aspx</trackback:ping>
        </item>
        <item>
            <title>How to Create a Custom Editor for a Domain Model Element Property</title>
            <link>http://geekswithblogs.net/jlavin/archive/2008/07/05/123599.aspx</link>
            <description>&lt;p&gt;Sometimes when defining a property for a domain model element you may need to use a complex type that has more than one property or can't easily be displayed using a single text field or drop down in the property editor. A good example might be a class that holds a list of strings for a GUI interface or a Rich Text editor for a custom text field required by your framework. &lt;/p&gt;  &lt;p&gt;To resolve this you can create a custom editor and hook it into your domain model that will provide a proper user interface to specify information for your property.&lt;/p&gt;  &lt;p&gt;There are three steps you need to take in order to wire your domain property to display a custom editor:&lt;/p&gt;  &lt;p&gt;1. Create a class derived from &lt;strong&gt;System.Drawing.Design.&lt;/strong&gt;UITypeEditor that will launch the custom dialog box as below:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Need to add a reference to System.Drawing DLL.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Drawing.Design;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Permissions;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling.Design;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; XXX.UIProcessDesigner.UIEditors&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;// FxCop rule: must have same security demands as parent class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    [PermissionSet(SecurityAction.LinkDemand, Name = &lt;span class="str"&gt;"FullTrust"&lt;/span&gt;), PermissionSet(SecurityAction.InheritanceDemand, Name = &lt;span class="str"&gt;"FullTrust"&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; FormPromptUITypeEditor : System.Drawing.Design.UITypeEditor&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="rem"&gt;/// Overridden to specify that our editor is a modal form&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; UITypeEditorEditStyle.Modal;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// Called by VS whenever the user clicks on the ellipsis in the &lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="rem"&gt;/// properties window for a property to which this editor is linked.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="provider"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="value"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; EditValue(&lt;/pre&gt;

  &lt;pre class="alt"&gt;            System.ComponentModel.ITypeDescriptorContext context,&lt;/pre&gt;

  &lt;pre&gt;            IServiceProvider provider,&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// Get a reference to the underlying property element&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            ElementPropertyDescriptor descriptor = context.PropertyDescriptor &lt;span class="kwrd"&gt;as&lt;/span&gt; ElementPropertyDescriptor;&lt;/pre&gt;

  &lt;pre&gt;            ModelElement underlyingModelElent = descriptor.ModelElement;&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// context.Instance also returns a model element, but this will either&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// be the shape representing the underlying element (if you selected&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// the element via the design surface), or the underlying element &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// itself (if you selected the element via the model explorer)&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            ModelElement element = context.Instance &lt;span class="kwrd"&gt;as&lt;/span&gt; ModelElement;&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            FormPromptUITypeEditorForm theForm = &lt;span class="kwrd"&gt;new&lt;/span&gt; FormPromptUITypeEditorForm();&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            theForm.Value = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (theForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;value&lt;/span&gt; = theForm.Value;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;2. Create a Windows Form dialog that will be displayed when the editor is invoked, such as the one below:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/HowtoCreateaCustomEditorforaDomainModelE_AAD9/SampleWindowsForm_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="132" alt="SampleWindowsForm" src="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/HowtoCreateaCustomEditorforaDomainModelE_AAD9/SampleWindowsForm_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;3. Set the Custom Attributes for the Domain Property to reference the UITypeEditor class you have created.&lt;/p&gt;

&lt;p&gt;The text is as follows: [System.ComponentModel.Editor(typeof(&lt;b&gt;XXX.UIProcessDesigner.UIEditors.FormActionTypeUITypeEditor&lt;/b&gt;),typeof(System.Drawing.Design.UITypeEditor))]&lt;/p&gt;

&lt;p&gt;The bold faced text is the full namespace of your class that derives from UITypeEditor.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/HowtoCreateaCustomEditorforaDomainModelE_AAD9/SamplePropertiesForm_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="SamplePropertiesForm" src="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/HowtoCreateaCustomEditorforaDomainModelE_AAD9/SamplePropertiesForm_thumb.png" width="205" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I normally store all code that I add to a DSL Designer in various folders such as; CustomCode, UIEditors, Validators, etc. That way it is easy to find when I am trying to reference it. &lt;/p&gt;

&lt;p&gt;Also, you can debug the UITypeEditor and Dialog by setting breakpoints in the code before you start debugging.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:388a4aef-d445-4437-9a78-7cea896d5b11" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/DSL" rel="tag"&gt;DSL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Domain%20Specific%20Languages" rel="tag"&gt;Domain Specific Languages&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Software%20Factories" rel="tag"&gt;Software Factories&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123599"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123599" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/jlavin/aggbug/123599.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2008/07/05/123599.aspx</guid>
            <pubDate>Sat, 05 Jul 2008 17:09:11 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/123599.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2008/07/05/123599.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/123599.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/123599.aspx</trackback:ping>
        </item>
        <item>
            <title>Extending the Service Factory v3</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/09/15/115376.aspx</link>
            <description>&lt;p&gt;I've been needing a tailored version of the Web Service Software Factory to simplify the design and creation of web services for my development team. Not that the Service Factory isn't easy to use, but my team has to design and build services that use industry standard schemas as well as invoke workflows. So, I figured extending the the service factory would allow me to tailor it to my team's needs and by using some of the new features in the v3b117 Alpha I could keep the modifications simple. Granted, things will change between now and the final release, but half of the fun with being on the bleeding edge is taking things apart to get a good understanding of how they work.&lt;/p&gt; &lt;h2&gt;Technology Extensions&lt;/h2&gt; &lt;p&gt;What I needed was a way for the person designing the service to indicate if an operation should invoke a workflow or not. To do this I needed a new property on the operation contract model element in the service designer. Normally, you would have to modify the DSL model to add the new property, recompile and distribute the new version of the DSL. This is not always the best way to do things because you end up having various versions of the DSL laying about taking up space. Not anymore! By using the extensions provided in the service factory you can extend the model specifically for the purposes of the factory without having to modify the DSL. This is really nice! The new extensions are a really big step towards the reuse of DSLs for factory building.&lt;/p&gt; &lt;p&gt;In order to target the models for a specific implementation technology the team has added a Technology Extensions library which allows you to dynamically extend the model at runtime. If you look at the service designer model properties you'll see a property for implementation technology and you have a choice of either ASMX or WCF. &lt;/p&gt; &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/ExtendingtheServiceFactoryv3_AF/ServiceModelPropertiesCutout.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="193" alt="ServiceModelPropertiesCutout" src="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/ExtendingtheServiceFactoryv3_AF/ServiceModelPropertiesCutout_thumb.png" width="323" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This property dynamically loads up a set of model extensions that provides additional properties and actions that are specific for the selected technology. Once the extension is loaded then the properties for the model elements show the additional properties for the specific technology extension.&lt;/p&gt; &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/ExtendingtheServiceFactoryv3_AF/ModelElementPropertiesCutout.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="309" alt="ModelElementPropertiesCutout" src="http://geekswithblogs.net/images/geekswithblogs_net/jlavin/WindowsLiveWriter/ExtendingtheServiceFactoryv3_AF/ModelElementPropertiesCutout_thumb.png" width="322" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;h2&gt;Tailoring the Factory to Invoke a Workflow&lt;/h2&gt; &lt;p&gt;It just so happens that just like there are two ways to create web services within .Net there are two ways to host workflows within a web service. You can use the native ASMX hosting method provided with Windows Workflow or you can instantiate the workflow runtime in a WCF web service and invoke the workflow using the ManualWorkflowScheduler. This allows us to use the existing Technology Extensions to tailor the hosting method based on the selected implementation technology in the service model.&lt;/p&gt; &lt;h2&gt;Extending the Object Model&lt;/h2&gt; &lt;p&gt;First we need to extend the OperationContract ObjectExtender with a new property called InvokesWorkflow that will be presented to the DSL user once they have selected an implementation technology.&lt;/p&gt; &lt;p&gt;Below is a sample of the code I added to the WCFOperationContract:&lt;/p&gt;&lt;pre&gt;        private bool invokesWorkflow = false;

        [Category(ServiceContractWCFExtensionProvider.ExtensionProviderPropertyCategory),
         Description("Specifies the if the operation should invoke a workflow to handle the request."),
         ReadOnly(false),
         BrowsableAttribute(true)]
        [XmlElement("InvokesWorkflow")]
        public bool InvokesWorkflow
        {
            get { return invokesWorkflow; }
            set { invokesWorkflow = value; }
        }
&lt;/pre&gt;
&lt;p&gt;That's all we have to do to add our new property to the DSL. Now as our designers are working on a service's design they can indicate if the operation should invoke a workflow or not. This is so much simpler than having to modify the DSL and republish it.&lt;/p&gt;
&lt;h2&gt;Modifying the Implementation Specific Text Templates&lt;/h2&gt;
&lt;p&gt;Next we need to modify the code generation templates to add the technology specific implementations to the code. You'll find the templates under the ServiceContractDSL project in a folder called TextTemplates. They have created one for each technology extension, I am assuming the Service Factory Team did this to keep things simple. If I find out differently, I'll let you know in a later post.&lt;/p&gt;
&lt;p&gt;I modified the WCF specific service implementation template to do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add using statements for the various workflow assemblies. 
&lt;/li&gt;&lt;li&gt;Add a new method called GetWCFImplementation which inserts the hosting code to the generated classes methods. 
&lt;/li&gt;&lt;li&gt;Parse out the parts of the request and add them to a Dictionary that is passed to the workflow when it is invoked. 
&lt;/li&gt;&lt;li&gt;Instantiate the response message class. 
&lt;/li&gt;&lt;li&gt;Parse out the parts of the response and assigned their return values from the Dictionary after the workflow has completed. 
&lt;/li&gt;&lt;li&gt;Return the response message class.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Below is the modified template:&lt;/p&gt;&lt;pre&gt;&amp;lt;#@ Template Language="C#" Inherits="Microsoft.Practices.Modeling.CodeGeneration.Strategies.TextTemplating.ModelingTextTransformation" #&amp;gt;
&amp;lt;#@ Import Namespace="System.Text" #&amp;gt;
&amp;lt;#@ Import Namespace="System.Globalization" #&amp;gt;
&amp;lt;#@ Import Namespace="System.Collections.Generic" #&amp;gt;
&amp;lt;#@ Import Namespace="System.ServiceModel" #&amp;gt;
&amp;lt;#@ Import Namespace="Microsoft.Practices.ServiceFactory.ServiceContracts" #&amp;gt;
&amp;lt;#@ Import Namespace="Microsoft.Practices.ServiceFactory.DataContracts" #&amp;gt;
&amp;lt;#@ Import Namespace="Microsoft.Practices.ServiceFactory.Extenders.DataContract.Wcf" #&amp;gt;
&amp;lt;#@ Import Namespace="Microsoft.VisualStudio.Modeling" #&amp;gt;
&amp;lt;#@ Assembly Name="Microsoft.Practices.ServiceFactory.DataContracts.Dsl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d6a471ce3d28564" #&amp;gt;
&amp;lt;#@ Assembly Name="Microsoft.Practices.ServiceFactory.Extenders.DataContract.Wcf, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d6a471ce3d28564" #&amp;gt;
&amp;lt;#@ Assembly Name="Microsoft.Practices.ServiceFactory.ServiceContracts.Dsl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d6a471ce3d28564" #&amp;gt;
&amp;lt;#@ Assembly Name="System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" #&amp;gt;
&amp;lt;#@ ModelInjector processor="ModelInjectorDirectiveProcessor" #&amp;gt;
&amp;lt;#@ include file="TextTemplates\WCF\CS\CommonTextTransformation.tt" #&amp;gt;
//------------------------------------------------------------------------------
// &lt;auto-generated&gt;
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// &lt;/auto-generated&gt;
//------------------------------------------------------------------------------

using System;
using System.Workflow;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Activities;
using WCF = global::System.ServiceModel;

namespace &amp;lt;#=CurrentExtender.ArtifactLink.Namespace#&amp;gt;
{	
	/// &lt;summary&gt;
	/// Service Class - &amp;lt;#= CurrentElement.Name #&amp;gt;
	/// &lt;/summary&gt;
	[WCF::ServiceBehavior(Name = "&amp;lt;#= CurrentElement.Name #&amp;gt;", 
		Namespace = "&amp;lt;#= CurrentExtender.Namespace #&amp;gt;", 
		InstanceContextMode = WCF::InstanceContextMode.&amp;lt;#= CurrentExtender.InstanceContextMode.ToString() #&amp;gt;, 
		ConcurrencyMode = WCF::ConcurrencyMode.&amp;lt;#= CurrentExtender.ConcurrencyMode.ToString() #&amp;gt; )]
	public abstract class &amp;lt;#= CurrentElement.Name #&amp;gt;Base &amp;lt;#= BuildInheritedServiceContract(CurrentElement.ServiceContract) #&amp;gt;
	{
&amp;lt;#
		if (CurrentElement.ServiceContract != null) {
#&amp;gt;
		#region &amp;lt;#= CurrentElement.ServiceContract.Name #&amp;gt; Members
&amp;lt;#
		foreach(Operation operation in CurrentElement.ServiceContract.Operations)
		{
			WCFOperationContract wcfOperation = GetObjectExtender&lt;wcfoperationcontract&gt;(operation);
            if(wcfOperation.GenerateCode)
            {
			    if (!wcfOperation.AsyncPattern)
			    {

#&amp;gt;

		public virtual &amp;lt;#= GetResponseElement(operation.Response) #&amp;gt; &amp;lt;#= operation.Name #&amp;gt;(&amp;lt;#= GetRequestElement(operation.Request) #&amp;gt;)
		{
			&amp;lt;#= GetImplementation(operation.Request) #&amp;gt;
		}

&amp;lt;#
			    }
			    else
			    {

#&amp;gt;

		public virtual IAsyncResult Begin&amp;lt;#=operation.Name#&amp;gt;(&amp;lt;#= GetRequestElement(operation.Request,UseComma.Yes) #&amp;gt;AsyncCallback callback, object state)
		{
			return null;
		}

		public virtual &amp;lt;#= GetResponseElement(operation.Response) #&amp;gt; End&amp;lt;#=operation.Name#&amp;gt;(IAsyncResult result)
		{
			&amp;lt;#= GetImplementation(operation.Request) #&amp;gt;
		}

&amp;lt;#			    } // close if AsyncPattern
            } // close if Generatecode

		} // close Operations foreach
#&amp;gt;
		#endregion		
&amp;lt;#
	} // end if
#&amp;gt;		
	}
	
	public partial class &amp;lt;#= CurrentElement.Name #&amp;gt; : &amp;lt;#= CurrentElement.Name #&amp;gt;Base
	{
&amp;lt;#
		if (CurrentElement.ServiceContract != null) {
#&amp;gt;
		#region &amp;lt;#= CurrentElement.ServiceContract.Name #&amp;gt; Members
&amp;lt;#
		foreach(Operation operation in CurrentElement.ServiceContract.Operations)
		{
			WCFOperationContract wcfOperation = GetObjectExtender&lt;wcfoperationcontract&gt;(operation);
            if(wcfOperation.GenerateCode)
            {
			    if (!wcfOperation.AsyncPattern)
			    {

#&amp;gt;

		public override &amp;lt;#= GetResponseElement(operation.Response) #&amp;gt; &amp;lt;#= operation.Name #&amp;gt;(&amp;lt;#= GetRequestElement(operation.Request) #&amp;gt;)
		{
			&amp;lt;#= GetWCFImplementation(operation) #&amp;gt;
		}

&amp;lt;#
			    }
			    else
			    {

#&amp;gt;

		public override &amp;lt;#= GetResponseElement(operation.Response) #&amp;gt; End&amp;lt;#=operation.Name#&amp;gt;(IAsyncResult result)
		{
			&amp;lt;#= GetWCFImplementation(operation) #&amp;gt;
		}

&amp;lt;#			    } // close if AsyncPattern
            } // close if Generatecode

		} // close Operations foreach
#&amp;gt;
		#endregion		
&amp;lt;#
	} // end if
#&amp;gt;		
	}
	
}

&amp;lt;#+
	private string BuildInheritedServiceContract(ServiceContract serviceContract)
	{
		if (serviceContract == null)
		{
			return string.Empty;
		}
		else
		{
			return ": " + ResolveServiceContractNameAndAddProjectRef(serviceContract);
		}
	}
	
	private string ResolveServiceContractNameAndAddProjectRef(ServiceContract contract)
	{
		WCFServiceContract wfcSc = GetObjectExtender&lt;wcfservicecontract&gt;(contract);
		if(wfcSc == null)
		{
			return "I" + contract.Name;
		}
		AddProjectReference(wfcSc.ArtifactLink);
		return wfcSc.ArtifactLink.Namespace + ".I" + contract.Name;
	}

	private string GetWCFImplementation(Operation operation)
	{
		if(operation.Response != null)
		{
			string result = "";
    		WCFOperationContract wcfOc = GetObjectExtender&lt;wcfoperationcontract&gt;(operation);

            if(wcfOc.InvokesWorkflow)
            {
				string nl = "\r\n\t\t\t"; 
                result = "// Build the parameters for the Workflow" + nl;
                result += "Dictionary&lt;string object=""&gt; parameters = new Dictionary&lt;string object=""&gt;();" + nl;

                foreach(MessagePart mPart in operation.Request.MessageParts)
                { 
                    result += "parameters.Add(\"" + mPart.Name +"\", " + operation.Request.Name + "." + mPart.Name+ ");" + nl; 
                }

                result += "// Execute the Workflow" + nl;
                result += "// TODO: change myWorkflow to the name of the workflow to execute" + nl;
                result += "WFHost.ExecuteWorkflow(typeof(myWorkflow), parameters);" + nl;
                result += "// Build the response based on the parameters" + nl;
                result += GetResponseElement(operation.Response) + " response = new " + GetResponseElement(operation.Response) + "();" + nl;

                foreach(MessagePart mPart in operation.Response.MessageParts)
                { 
                    if(mPart is DataContractMessagePart)
                    {
                        DataContractMessagePart dcmPart = (DataContractMessagePart)mPart;
                        result += "response." + mPart.Name + " = (" + dcmPart.Type + ")parameters[\"" + mPart.Name + "\"];" + nl; 
                    }
                    else if(mPart is XsdElementMessagePart)
                    {
                        XsdElementMessagePart xsdmPart = (XsdElementMessagePart)mPart;
                        int nPos = xsdmPart.Element.IndexOf('?');
                        string strTemp = xsdmPart.Element.Substring(nPos + 1, (xsdmPart.Element.Length - (nPos + 1)));
                        result += "response." + mPart.Name + " = (" + strTemp + ")parameters[\"" + mPart.Name + "\"];" + nl; 
                    }
                }

                result += "return response;" + nl;
            }
            else
            {
                result = "return null;";
            }

			return result;
		}

		return string.Empty;
	}
#&amp;gt;
&lt;/string&gt;&lt;/string&gt;&lt;/wcfoperationcontract&gt;&lt;/wcfservicecontract&gt;&lt;/wcfoperationcontract&gt;&lt;/wcfoperationcontract&gt;&lt;/pre&gt;
&lt;p&gt;Below is the generated code based on the template changes:&lt;/p&gt;&lt;pre&gt;//------------------------------------------------------------------------------
// &lt;auto-generated&gt;
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// &lt;/auto-generated&gt;
//------------------------------------------------------------------------------

using System;
using System.Workflow;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Activities;
using WCF = global::System.ServiceModel;

namespace WCF.ServiceImplementation
{	
	/// &lt;summary&gt;
	/// Service Class - MyService
	/// &lt;/summary&gt;
	[WCF::ServiceBehavior(Name = "MyService", 
		Namespace = "WCF.ServiceImplementation", 
		InstanceContextMode = WCF::InstanceContextMode.PerSession, 
		ConcurrencyMode = WCF::ConcurrencyMode.Single )]
	public abstract class MyServiceBase : WCF.ServiceContracts.IMyServiceContract
	{
		#region MyServiceContract Members

		public virtual WCF.MessageContracts.Response MyOperation(WCF.MessageContracts.Request request)
		{
			return null;
		}

		#endregion		
		
	}
	
	public partial class MyService : MyServiceBase
	{
		#region MyServiceContract Members

		public override WCF.MessageContracts.Response MyOperation(WCF.MessageContracts.Request request)
		{
			// Build the parameters for the Workflow
			Dictionary&lt;string object=""&gt; parameters = new Dictionary&lt;string object=""&gt;();
			parameters.Add("RequestPayload", Request.RequestPayload);
			// Execute the Workflow
			// TODO: change myWorkflow to the name of the workflow to execute
			WFHost.ExecuteWorkflow(typeof(myWorkflow), parameters);
			// Build the response based on the parameters
			WCF.MessageContracts.Response response = new WCF.MessageContracts.Response();
			response.ResponsePayload = (ServiceResponse)parameters["ResponsePayload"];
			return response;
			
		}

		#endregion		
		
	}
	
}
&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;
&lt;p&gt;I made similar changes for the ASMX implementation but tailored them towards using the native workflow hosting methods. As you can see, you can make some minor modifications to the new version of the Service Factory, and provide a lot of additional functionality without much work. &lt;/p&gt;
&lt;p&gt;If you decide you want to keep the original Technology Extensions intact, you can always create another Technology Extension based on one of the original extensions with just your changes. This way you can offer users of the service factory multiple custom implementations.&lt;/p&gt;
&lt;p&gt;I think the direction the Service Factory Team has taken this new version of the service factory is really promising and I hope to see them apply these new extensions to the rest of the factories. Keep up the good work!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=115376"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=115376" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/jlavin/aggbug/115376.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/09/15/115376.aspx</guid>
            <pubDate>Sat, 15 Sep 2007 09:59:56 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/115376.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/09/15/115376.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/115376.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/115376.aspx</trackback:ping>
        </item>
        <item>
            <title>Its All About Reuse - Part 2</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/08/14/114632.aspx</link>
            <description>&lt;p&gt;In my last post I discussed some of the other life cycle artifacts that I thought should be included in a Software Factory. In this post I'll show how to use T4 templates to generate a Use Case document from an XML data file.&lt;/p&gt; &lt;p&gt;To do this we can invoke a Custom Directive from within a Text Template to parse the XML file and reformat in to an HTML Document. The MSDN's DSL Tools documentation provides a great example on how to create a &lt;a title="Custom Text Template Directive Processor" href="http://msdn2.microsoft.com/en-us/library/bb126315(VS.90).aspx" rel="tag"&gt;Custom Text Template Directive Processor&lt;/a&gt;  &lt;/p&gt; &lt;p&gt;I've modified the class, provided in the sample, a little to just include the code required to use the XML DOM:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;using System;&lt;br /&gt;using System.CodeDom;&lt;br /&gt;using System.CodeDom.Compiler;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Globalization;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;using Microsoft.VisualStudio.TextTemplating; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;namespace XMLDirectiveProcessor&lt;br /&gt;{&lt;br /&gt;    class XMLDirectiveProcessor : DirectiveProcessor&lt;br /&gt;    {&lt;br /&gt;        //this buffer stores the code that is added to the &lt;br /&gt;        //generated transformation class after all the processing is done &lt;br /&gt;        //---------------------------------------------------------------------&lt;br /&gt;        private StringBuilder codeBuffer; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        //Using a Code Dom Provider creates code for the &lt;br /&gt;        //generated transformation class in either Visual Basic or C#.&lt;br /&gt;        //If you want your directive processor to support only one language, you&lt;br /&gt;        //can hard code the code you add to the generated transformation class.&lt;br /&gt;        //In that case, you do not need this field.&lt;br /&gt;        //--------------------------------------------------------------------------&lt;br /&gt;        private CodeDomProvider codeDomProvider; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        //this stores the full contents of the text template that is being processed&lt;br /&gt;        //--------------------------------------------------------------------------&lt;br /&gt;        private String templateContents; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        //These are the errors that occur during processing. The engine passes &lt;br /&gt;        //the errors to the host, and the host can decide how to display them,&lt;br /&gt;        //for example the the host can display the errors in the UI&lt;br /&gt;        //or write them to a file.&lt;br /&gt;        //---------------------------------------------------------------------&lt;br /&gt;        private CompilerErrorCollection errorsValue; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public new CompilerErrorCollection Errors&lt;br /&gt;        {&lt;br /&gt;            get { return errorsValue; }&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        //Each time this directive processor is called, it creates a new property.&lt;br /&gt;        //We count how many times we are called, and append "n" to each new&lt;br /&gt;        //property name. The property names are therefore unique.&lt;br /&gt;        //-----------------------------------------------------------------------------&lt;br /&gt;        private int directiveCount = 0; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override void Initialize(ITextTemplatingEngineHost host)&lt;br /&gt;        {&lt;br /&gt;            //we do not need to do any initialization work&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override void StartProcessingRun(CodeDomProvider languageProvider, String templateContents, CompilerErrorCollection errors)&lt;br /&gt;        {&lt;br /&gt;            //the engine has passed us the language of the text template&lt;br /&gt;            //we will use that language to generate code later&lt;br /&gt;            //----------------------------------------------------------&lt;br /&gt;            this.codeDomProvider = languageProvider;&lt;br /&gt;            this.templateContents = templateContents;&lt;br /&gt;            this.errorsValue = errors; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;            this.codeBuffer = new StringBuilder();&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        //Before calling the ProcessDirective method for a directive, the &lt;br /&gt;        //engine calls this function to see whether the directive is supported.&lt;br /&gt;        //Notice that one directive processor might support many directives.&lt;br /&gt;        //---------------------------------------------------------------------&lt;br /&gt;        public override bool IsDirectiveSupported(string directiveName)&lt;br /&gt;        {&lt;br /&gt;            if (string.Compare(directiveName, "XMLDirective", StringComparison.OrdinalIgnoreCase) == 0)&lt;br /&gt;            {&lt;br /&gt;                return true;&lt;br /&gt;            } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;            return false;&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override void ProcessDirective(string directiveName, IDictionary&amp;lt;string, string&amp;gt; arguments)&lt;br /&gt;        {&lt;br /&gt;            if (string.Compare(directiveName, "XMLDirective", StringComparison.OrdinalIgnoreCase) == 0)&lt;br /&gt;            {&lt;br /&gt;                string fileName; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                if (!arguments.TryGetValue("FileName", out fileName))&lt;br /&gt;                {&lt;br /&gt;                    throw new DirectiveProcessorException("Required argument 'FileName' not specified.");&lt;br /&gt;                } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                if (string.IsNullOrEmpty(fileName))&lt;br /&gt;                {&lt;br /&gt;                    throw new DirectiveProcessorException("Argument 'FileName' is null or empty.");&lt;br /&gt;                } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                //Now we add code to the generated transformation class.&lt;br /&gt;                //This directive supports either Visual Basic or C#, so we must use the&lt;br /&gt;                //System.CodeDom to create the code.&lt;br /&gt;                //If a directive supports only one language, you can hard code the code.&lt;br /&gt;                //-------------------------------------------------------------------------- &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                CodeMemberField documentField = new CodeMemberField(); &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                documentField.Name = "document" + directiveCount + "Value";&lt;br /&gt;                documentField.Type = new CodeTypeReference(typeof(XmlDocument));&lt;br /&gt;                documentField.Attributes = MemberAttributes.Private; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                CodeMemberProperty documentProperty = new CodeMemberProperty(); &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                documentProperty.Name = "Document" + directiveCount;&lt;br /&gt;                documentProperty.Type = new CodeTypeReference(typeof(XmlDocument));&lt;br /&gt;                documentProperty.Attributes = MemberAttributes.Public;&lt;br /&gt;                documentProperty.HasSet = false;&lt;br /&gt;                documentProperty.HasGet = true; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                CodeExpression fieldName = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), documentField.Name);&lt;br /&gt;                CodeExpression booleanTest = new CodeBinaryOperatorExpression(fieldName, CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null));&lt;br /&gt;                CodeExpression rightSide = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("XmlReaderHelper"), "ReadXml", new CodePrimitiveExpression(fileName));&lt;br /&gt;                CodeStatement[] thenSteps = new CodeStatement[] { new CodeAssignStatement(fieldName, rightSide) }; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                CodeConditionStatement ifThen = new CodeConditionStatement(booleanTest, thenSteps);&lt;br /&gt;                documentProperty.GetStatements.Add(ifThen); &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                CodeStatement s = new CodeMethodReturnStatement(fieldName);&lt;br /&gt;                documentProperty.GetStatements.Add(s); &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                CodeGeneratorOptions options = new CodeGeneratorOptions();&lt;br /&gt;                options.BlankLinesBetweenMembers = true;&lt;br /&gt;                options.IndentString = "    ";&lt;br /&gt;                options.VerbatimOrder = true;&lt;br /&gt;                options.BracingStyle = "C"; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;                using (StringWriter writer = new StringWriter(codeBuffer, CultureInfo.InvariantCulture))&lt;br /&gt;                {&lt;br /&gt;                    codeDomProvider.GenerateCodeFromMember(documentField, writer, options);&lt;br /&gt;                    codeDomProvider.GenerateCodeFromMember(documentProperty, writer, options);&lt;br /&gt;                } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;            }&lt;br /&gt;            //end XMLDirective &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;            //Track how many times the processor has been called.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            directiveCount++; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        }&lt;br /&gt;        //end ProcessDirective &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override void FinishProcessingRun()&lt;br /&gt;        {&lt;br /&gt;            this.codeDomProvider = null; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;            //important: do not do this:&lt;br /&gt;            //the get methods below are called after this method &lt;br /&gt;            //and the get methods can access this field&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            //this.codeBuffer = null;&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override string GetPreInitializationCodeForProcessingRun()&lt;br /&gt;        {&lt;br /&gt;            //Use this method to add code to the start of the &lt;br /&gt;            //Initialize() method of the generated transformation class.&lt;br /&gt;            //We do not need any pre-initialization, so we will just return "".&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            //GetPreInitializationCodeForProcessingRun runs before the &lt;br /&gt;            //Initialize() method of the base class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            return String.Empty;&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override string GetPostInitializationCodeForProcessingRun()&lt;br /&gt;        {&lt;br /&gt;            //Use this method to add code to the end of the &lt;br /&gt;            //Initialize() method of the generated transformation class.&lt;br /&gt;            //We do not need any post-initialization, so we will just return "".&lt;br /&gt;            //------------------------------------------------------------------&lt;br /&gt;            //GetPostInitializationCodeForProcessingRun runs after the&lt;br /&gt;            //Initialize() method of the base class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            return String.Empty;&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override string GetClassCodeForProcessingRun()&lt;br /&gt;        {&lt;br /&gt;            //Return the code to add to the generated transformation class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            return codeBuffer.ToString();&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override string[] GetReferencesForProcessingRun()&lt;br /&gt;        {&lt;br /&gt;            //This returns the references that we want to use when &lt;br /&gt;            //compiling the generated transformation class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            //We need a reference to this assembly to be able to call &lt;br /&gt;            //XmlReaderHelper.ReadXml from the generated transformation class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            return new string[]&lt;br /&gt;            {&lt;br /&gt;                "System.Xml",&lt;br /&gt;                this.GetType().Assembly.Location&lt;br /&gt;            };&lt;br /&gt;        } &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;        public override string[] GetImportsForProcessingRun()&lt;br /&gt;        {&lt;br /&gt;            //This returns the imports or using statements that we want to &lt;br /&gt;            //add to the generated transformation class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            //We need XMLDirectiveProcessor to be able to call XmlReaderHelper.ReadXml&lt;br /&gt;            //from the generated transformation class.&lt;br /&gt;            //-----------------------------------------------------------------&lt;br /&gt;            return new string[]&lt;br /&gt;            {&lt;br /&gt;                "System.Xml",&lt;br /&gt;                "XMLDirectiveProcessor"&lt;br /&gt;            };&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    //end class XMLDirectiveProcessor &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" color="#408080" size="2"&gt;    //-------------------------------------------------------------------------&lt;br /&gt;    // the code that we are adding to the generated transformation class &lt;br /&gt;    // will call this method&lt;br /&gt;    //-------------------------------------------------------------------------&lt;br /&gt;    public static class XmlReaderHelper&lt;br /&gt;    {&lt;br /&gt;        public static XmlDocument ReadXml(string fileName)&lt;br /&gt;        {&lt;br /&gt;            XmlDocument d = new XmlDocument(); &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font color="#408080"&gt;&lt;font face="Courier New" size="2"&gt;            using (XmlTextReader reader = new XmlTextReader(fileName))&lt;br /&gt;            {&lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    d.Load(reader);&lt;br /&gt;                }&lt;br /&gt;                catch (System.Xml.XmlException e)&lt;br /&gt;                {&lt;br /&gt;                    throw new DirectiveProcessorException("Unable to read the XML file.", e);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            return d;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/font&gt; &lt;/font&gt; &lt;/p&gt;&lt;p&gt;This class is part of a C# Class Library that can be used by the Text Template Engine inside of Visual Studio. In order to get Visual Studio to recognize the custom directive you need to add a registry entry. I've included a sample below:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;Windows Registry Editor Version 5.00 &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New" size="2"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\TextTemplating\DirectiveProcessors\XMLDirectiveProcessor]&lt;br /&gt;"Class"="XMLDirectiveProcessor.XMLDirectiveProcessor"&lt;br /&gt;"CodeBase"="&amp;lt;YourPath&amp;gt;\\XMLDirectiveProcessor\\bin\\Debug\\XMLDirectiveProcessor.dll"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;Next I created a new Class Library Project to use as a test harness for the Custom Directive Processor. I then created an XML file to hold the Use Case data. Below is the data I'll use:&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue"&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;Doc&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCases&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCase&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Project&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Delivery Service&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Project&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Login to Account&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseNumber&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;UC001&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseNumber&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseAuthor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Jim Lavin&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseAuthor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastRevised&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;11/10/2003&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastRevised&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;Used to authenticate and identify the user with the web application.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Sender&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Delivery Clerk&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Courier&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;SuD&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;DBMS&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Preconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Precondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user's information must exist in the DBMS.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Precondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Preconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;BasicCourse&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user navigates to the main web page.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user enters his/her email address in the Email field.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user enters his/her password in the Password field.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user clicks on the Submit icon.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD validates that the email address and password have been entered.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD queries the User Table for the user credentials.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD creates an instance of a User object stores it in the Session State.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD displays the message "Welcome, User Name" in place of the login fields.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD updates the user menu with appropriate menu options.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;BasicCourse&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exceptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;Either the email address or password has not been entered. The SuD redisplays the web page with an error indicating the missing field.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD cannot validate the user credentials. The SuD redirects the user to an error page indicating the information that is incorrect.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exceptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;A valid user object has been stored to the Session State.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The welcome message is displayed.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The proper menu is displayed for the user.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScreensReferenced&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Screen&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Login Page&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Screen&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;&lt;span style="color: #a31515"&gt;ScreensReferenced&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;DBMS&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;User Table&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Issues&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Issue&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Status&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Closed&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Status&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;OpenDate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;11/01/2003&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;OpenDate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;CloseDate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;11/02/2003&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;CloseDate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Owner&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Jim Lavin&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Owner&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Need to add fields to User Table&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;Need to add fields for the user's email address and password to the user table along with the appropriate indexes.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Comments&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Comment&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Commenter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Jim Lavin&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Commenter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DateEntered&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;11/02/2003&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DateEntered&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;CommentText&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;              &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;Added the requested fields to the user table definition.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;CommentText&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Comment&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Comments&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Issue&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Issues&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumption&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;All users who access the system will have access to a web browser.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumption&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCase&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCase&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Project&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Delivery Service&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Project&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Retrieve Lost Password&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseNumber&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;UC002&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseNumber&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseAuthor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Jim Lavin&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCaseAuthor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastRevised&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;11/10/2003&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastRevised&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;Process used to recover a lost user password. The password is reset and then sent via email.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Sender&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Delivery Clerk&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Courier&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;SuD&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;DBMS&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actor&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Actors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Preconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Precondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user must have an account on the System.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Precondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Preconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;BasicCourse&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user has entered an invalid password and has clicked on the link to retrieve a lost password.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;InitializationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user enters his/her email address and clicks on the submit icon.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD looks up the email address.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user clicks on the Submit icon.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD generates a new password.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD updates the user's record in the User Table&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD emails the new password to the user.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProcessSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;          &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD has found the user and sent a new password to the user.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationStep&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TerminationSteps&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;BasicCourse&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exceptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user did not enter an email address. The SuD redisplays the web page with an error indicating the field is required.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The SuD could not find the email address entered. The SuD redisplays the web page with an error page indicating the email address was not found.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exception&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Exceptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;The user's password has been set to a temporary password and it has been emailed to the user.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postcondition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Postconditions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GUIsReferenced&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Screen&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Retrieve Lost Password Page&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Screen&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;GUIsReferenced&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;SMTP Server&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;DBMS&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SystemInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;User Table&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterface&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DBMSInterfaces&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Issues&lt;/span&gt;&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumption&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;        &amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color: gray"&gt;All users who access the system will have access to a web browser.&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumption&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Assumptions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCase&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UseCases&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/Doc&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I then created the Text Template below to process the XML Data File and create an HTML document. The Text Template iterates through each UseCase and its sub-elements and then uses a switch statement based on the element name to emit the desired output. I handle embedded elements in the same way, first I iterate through the sub-elements and then use a switch statement to emit the desired output. You can use this same template to generate any type of document output by replacing the HTML with the formatting required by the document specification.&lt;/p&gt;
&lt;p&gt;The XMLDirective line is used to load the XMLDirectiveProcessor class and use it to load and access the DOM. The Class gives you access to the document via the Document0 property. You can then use any XmlDocument processing code you want to process the document.&lt;/p&gt;
&lt;p&gt;If you want to debug your template, remove the // from line 7 and it will cause the system to break and allow you to step through your template in the Visual Studio Debugger. This is a great resource if you are having problems with your template's output. Once you get the debugger started you can set breakpoints and watches, just like with your normal code.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#408080"&gt;&amp;lt;#@ assembly name="System.Xml" #&amp;gt;&lt;br /&gt;&amp;lt;#@ template debug="true" #&amp;gt;&lt;br /&gt;&amp;lt;#@ output extension=".html" #&amp;gt;&lt;br /&gt;&amp;lt;#  //This will call the custom directive processor. #&amp;gt;&lt;br /&gt;&amp;lt;#@ XMLDirective Processor="XMLDirectiveProcessor" FileName="&amp;lt;InsertPath&amp;gt;\UseCases.xml" #&amp;gt;&lt;br /&gt;&amp;lt;#  //Uncomment this line if you want to see the generated transformation class. #&amp;gt;&lt;br /&gt;&amp;lt;#  //System.Diagnostics.Debugger.Break(); #&amp;gt;&lt;br /&gt;&amp;lt;#  //This will use the results of the directive processor. #&amp;gt;&lt;br /&gt;&amp;lt;#  //The directive processor has read the XML and stored it in Document0. #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=windows-1252" /&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Use Case&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body lang="en-us"&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#408080"&gt;&amp;lt;#&lt;br /&gt;    //Get the root UseCases node&lt;br /&gt;    XmlNode node = Document0.DocumentElement.SelectSingleNode("UseCases");&lt;br /&gt;    // iterate through each child UseCase&lt;br /&gt;    foreach (XmlNode member in node.ChildNodes)&lt;br /&gt;    {&lt;br /&gt;#&amp;gt;&lt;/font&gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;table border="1" cellspacing="0" cellpadding="5" width="800" &amp;gt;&lt;br /&gt; &amp;lt;thead&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td colspan="2" valign="top" align="center"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;USE CASE&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/thead&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#&lt;br /&gt;        // iterate through each child element of the use case&lt;br /&gt;        foreach (XmlNode child in member.ChildNodes)&lt;br /&gt;        {&lt;br /&gt;            // emit different output based on the child element&lt;br /&gt;            switch(child.Name)&lt;br /&gt;            {&lt;br /&gt;            case "Project":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Project:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(child.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                break;&lt;br /&gt;            case "UseCaseName":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Use Case Name:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(child.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                break;&lt;br /&gt;            case "UseCaseNumber":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Use Case Number:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(child.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                break;&lt;br /&gt;            case "UseCaseAuthor":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Use Case Author:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(child.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                break;&lt;br /&gt;            case "LastRevised":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Last Revised:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(child.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                break;&lt;br /&gt;            case "Summary":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Summary:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(child.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                break;&lt;br /&gt;            case "Actors":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Actors:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#&lt;br /&gt;                // iterate through the child elements&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "Preconditions":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Preconditions:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through the child elements&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "BasicCourse":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Basic Course:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through the child elements&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;                    // emit different output based on the child element name&lt;br /&gt;                    switch(childnode.Name)&lt;br /&gt;                    {&lt;br /&gt;                    case "InitializationSteps":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Initialization Steps:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                        // iterate through each child element&lt;br /&gt;                        foreach(XmlNode step in child.ChildNodes)&lt;br /&gt;                        {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(step.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                        }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                        break;&lt;br /&gt;                    case "ProcessSteps":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Process Steps:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                        // iterate through each child element&lt;br /&gt;                        foreach(XmlNode step in child.ChildNodes)&lt;br /&gt;                        {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(step.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                        }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                        break;&lt;br /&gt;                    case "TerminationSteps":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Termination Steps:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                        // iterate through each child element&lt;br /&gt;                        foreach(XmlNode step in child.ChildNodes)&lt;br /&gt;                        {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(step.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                        }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                        break;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                break;&lt;br /&gt;            case "Exceptions":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exceptions:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child element&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "Postconditions":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Postconditions:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child element&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "ScreensReferenced":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Screens Referenced:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child element&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "SystemInterfaces":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;System Interfaces:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child element&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "DBMSInterfaces":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;DBMS Interfaces:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child element&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                }&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "Issues":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Issues:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;  &lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child issue&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;# &lt;br /&gt;                    // iterate through each child element within the issue&lt;br /&gt;                    foreach(XmlNode issue in childnode.ChildNodes)&lt;br /&gt;                    {&lt;br /&gt;                        // emit different output based on the element name&lt;br /&gt;                        switch(issue.Name)&lt;br /&gt;                        {&lt;br /&gt;                        case "Status":&lt;br /&gt;                            Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Status", issue.InnerText);&lt;br /&gt;                            break;&lt;br /&gt;                        case "OpenDate":&lt;br /&gt;                            Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Open Date", issue.InnerText);&lt;br /&gt;                            break;&lt;br /&gt;                        case "CloseDate":&lt;br /&gt;                            Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Close Date", issue.InnerText);&lt;br /&gt;                            break;&lt;br /&gt;                        case "Owner":&lt;br /&gt;                            Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Owner", issue.InnerText);&lt;br /&gt;                            break;&lt;br /&gt;                        case "Title":&lt;br /&gt;                            Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Title", issue.InnerText);&lt;br /&gt;                            break;&lt;br /&gt;                        case "Description":&lt;br /&gt;                            Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Description", issue.InnerText);&lt;br /&gt;                            break;&lt;br /&gt;                        case "Comments":&lt;br /&gt;                            Write("{0,11}:&amp;lt;br/&amp;gt;", "Comments");&lt;br /&gt;                            // iterate through each comment&lt;br /&gt;                            foreach(XmlNode comment in issue.ChildNodes)&lt;br /&gt;                            {&lt;br /&gt;                                // iterate through each element of the child&lt;br /&gt;                                foreach(XmlNode innercomment in comment.ChildNodes)&lt;br /&gt;                                {&lt;br /&gt;                                    // emit different output based on the element name&lt;br /&gt;                                    switch(innercomment.Name)&lt;br /&gt;                                    {&lt;br /&gt;                                    case "Commenter":&lt;br /&gt;                                        Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "Commenter", innercomment.InnerText);&lt;br /&gt;                                        break;&lt;br /&gt;                                    case "DateEntered":&lt;br /&gt;                                        Write("{0,11}: {1}&amp;lt;br/&amp;gt;", "DateEntered", innercomment.InnerText);&lt;br /&gt;                                        break;&lt;br /&gt;                                    case "CommentText":&lt;br /&gt;                                        Write("{0,11}: {1}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;", "Comment", innercomment.InnerText);&lt;br /&gt;                                        break;&lt;br /&gt;                                    } // end comment element switch&lt;br /&gt;                                } // end comment element foreach&lt;br /&gt;                            } // end comment foreach&lt;br /&gt;                            break;&lt;br /&gt;                        } // end issue element switch&lt;br /&gt;                    } // end issue element foreach&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                } // end issues child foreach&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#                &lt;br /&gt;                break;&lt;br /&gt;            case "Assumptions":&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Assumptions:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;   &amp;lt;ol&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                // iterate through each child element&lt;br /&gt;                foreach(XmlNode childnode in child.ChildNodes)&lt;br /&gt;                {&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;   &amp;lt;# Write(childnode.InnerText); #&amp;gt;&lt;br /&gt;&lt;/font&gt;   &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#            &lt;br /&gt;                } // end assumptions child foreach&lt;br /&gt;#&amp;gt;    &lt;br /&gt;&lt;/font&gt;    &amp;lt;/ol&amp;gt;            &lt;br /&gt;   &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#  &lt;br /&gt;                break;&lt;br /&gt;            } // end UseCaseElement switch&lt;br /&gt;        } // end UseCaseElement foreach            &lt;br /&gt;#&amp;gt;        &lt;br /&gt;&lt;/font&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;font color="#408080"&gt;&amp;lt;#&lt;br /&gt;    } // end UseCase foreach&lt;br /&gt;#&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/font&gt; 
&lt;/p&gt;&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The Custom Directive Processor and Text Template above is just one way you can reuse non-code artifacts within your Software Factory. To me this is a very important part of a Software Factory. And I believe a Software Factory should include all of the artifacts that relate to your Software Product Line or Framework, not just the code.&lt;/p&gt;
&lt;p&gt;For those of you who want a working sample of the code discussed above you can pull it from &lt;a href="http://www.jimlavin.net/XMLDirectiveProcessor.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114632"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114632" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/jlavin/aggbug/114632.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/08/14/114632.aspx</guid>
            <pubDate>Tue, 14 Aug 2007 10:09:10 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/114632.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/08/14/114632.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/114632.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/114632.aspx</trackback:ping>
        </item>
        <item>
            <title>Learning to Build Software Factories</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/06/24/113420.aspx</link>
            <description>&lt;p&gt;I've been involved in DSLs and Software Factories for about six months now, before that I dabbled in building DSLs trying to see how I could use them in enhancing the development experience for both developers and non-developers.&lt;/p&gt; &lt;p&gt;One of the big problems I came across is the lack of a single reference that provided the necessary background information required to assemble a Software Factory. &lt;/p&gt; &lt;p&gt;Granted the MSDN provides all of the documentation on-line and you have the various community sites, but there is nothing out there that ties it all together so you can gain the skills needed to easily assemble a Software Factory using DSLs, GAT and GAX.&lt;/p&gt; &lt;p&gt;So I'm in the process of putting together a series of articles that I think provides a pretty good overview of the information you need to understand before you start assembling a Software Factory using the current toolset. &lt;/p&gt; &lt;p&gt;As the tooling changes in the near future so will the required knowledge base, but for people wanting to take one of the existing Microsoft Patterns &amp;amp; Practices Software Factories and tailor it for their own uses or for those who need to assemble a Software Factory on their own, I think the topics I've selected can help get you off on the right foot.&lt;/p&gt; &lt;p&gt;So far the topics I'm working on are as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Guidance - What is it?  &lt;/li&gt;&lt;li&gt;Building DSLs  &lt;/li&gt;&lt;li&gt;EnvDTE - Microsoft Visual Studio Automation Primer  &lt;/li&gt;&lt;li&gt; &lt;div&gt;Visual Studio Templates&lt;/div&gt; &lt;/li&gt;&lt;li&gt;T4 Templates  &lt;/li&gt;&lt;li&gt;Actions  &lt;/li&gt;&lt;li&gt;Type Convertors  &lt;/li&gt;&lt;li&gt;Value Providers  &lt;/li&gt;&lt;li&gt;Menus  &lt;/li&gt;&lt;li&gt;Custom Wizard Pages  &lt;/li&gt;&lt;li&gt;Recipes&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I look forward to any feedback or additional topics you might feel are needed.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:d5aa3819-9ce4-42c9-a1c1-687ec1d30a60" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Domain%20Specific%20Languages" rel="tag"&gt;Domain Specific Languages&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Software%20Factories" rel="tag"&gt;Software Factories&lt;/a&gt;, &lt;a href="http://technorati.com/tags/GAT" rel="tag"&gt;GAT&lt;/a&gt;, &lt;a href="http://technorati.com/tags/GAX" rel="tag"&gt;GAX&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=113420"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=113420" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/jlavin/aggbug/113420.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/06/24/113420.aspx</guid>
            <pubDate>Sun, 24 Jun 2007 15:02:35 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/113420.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/06/24/113420.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/113420.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/113420.aspx</trackback:ping>
        </item>
    </channel>
</rss>