<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>Software Factories</title>
        <link>http://geekswithblogs.net/jlavin/category/6742.aspx</link>
        <description>Ramblings about Software Factories. What goes into them, how to build them and how to use 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>Adventures in Extending the Service Factory - Part 2</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/11/19/116981.aspx</link>
            <description>&lt;p&gt;Here's a handy tip when you are trying to learn how the components of the Service Factory works. I've found it very useful over the last couple of weeks.&lt;/p&gt; &lt;p&gt;Since the Service Factory now gets registered under the Visual Studio Experimental Hive you can configure the solution so you can debug it. If you are familiar with debugging DSLs, this should be nothing new. Just follow the steps below:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Set the Service Factory Guidance Package as the Start-Up Project by right-clicking on the project and selecting "Set as Start-Up Project".&lt;/li&gt; &lt;li&gt;Change the Service Factory Guidance Package Project's debug settings to launch Visual Studio under the Experimental Hive:&lt;/li&gt; &lt;ol&gt; &lt;li&gt;Right click on the Service Factory Guidance Package Project and select "Properties".&lt;/li&gt; &lt;li&gt;Select the Debug Tab&lt;/li&gt; &lt;li&gt;Configure the Start Action to Start External Program and &lt;strong&gt;&lt;em&gt;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe&lt;/em&gt;&lt;/strong&gt; or where ever you have installed Visual Studio for the program.&lt;/li&gt; &lt;li&gt;Set the Start Options, Command Line Arguments to &lt;strong&gt;&lt;em&gt;/rootsuffix Exp&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt; &lt;p&gt;Now you can set breakpoints in the Service Factory code and press &lt;strong&gt;&lt;em&gt;F5&lt;/em&gt;&lt;/strong&gt; to walk through the code in the debugger.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=116981"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=116981" 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/116981.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/11/19/116981.aspx</guid>
            <pubDate>Tue, 20 Nov 2007 05:36:19 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/116981.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/11/19/116981.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/116981.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/116981.aspx</trackback:ping>
        </item>
        <item>
            <title>Adventures in Extending the Service Factory</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/11/14/116839.aspx</link>
            <description>&lt;p&gt;I've been trying to add a couple of additional projects and item templates to the Service Factory for workflows and workflow activities. I thought I’d try to use the same techniques that the Service Factory was using to dynamically bind the menu options using the ProjectIsInRoleReference helper in the Binding.xml recipe.&lt;/p&gt; &lt;p&gt;So I did the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Added new roles WorkflowRole and ActivitiesRole to the file WSSF\Modeling.CodeGeneration\Source\Enums\ServiceFactoryRoleType.cs. I did this so that the Project Mapping helpers would incorporate the new roles into the ProjectMappingTable and get picked up by the ProjectIsInRoleReference helper. &lt;/li&gt; &lt;li&gt;Added the project templates to Templates\Projects.&lt;/li&gt; &lt;li&gt;Added the projects to the WCF and ASMX.vstemplate files.&lt;/li&gt; &lt;li&gt;Added new item templates to Templates\Items to use when the user selects the menu option to create a workflow or activity.&lt;/li&gt; &lt;li&gt;Added unbound recipes to unfold the templates. I used the CreateTranslator recipe as an example.&lt;/li&gt; &lt;li&gt;Added actions to the Binding.xml using the RefCreator and the ProjectIsInRoleReference just like the action for the CreateTranslator recipe.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;When I created a new ASMX or WCF Implementation project, the new projects templates got unfolded without issue. But when I right clicked on either the workflow or activities project I did not see the menu options to launch the recipes on the context menu.&lt;/p&gt; &lt;p&gt;At first I thought maybe the ProjectIsInRoleReference helper was not working, but I added debug output to indicate whether it found a match or not and everything was showing up correctly. &lt;/p&gt; &lt;p&gt;So I was at a loss as to why the menu options didn’t show up. I even tried to bind the recipes to the projects but still no luck. I dug out the older Extensibility Walkthroughs from the Service Factory CTP and there was an example for adding a new recipe through the binding.xml file. It seems that because we are testing in the Experimental Hive you need to run the following command to reset the context menus:  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;devenv /rootsuffix Exp /Setup&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Once I ran the command and then restarted Visual Studio under the experimental hive the menu options showed up.  This behavior is not really apparent and I couldn't find anything in the GAX/GAT documentation. I think that has a lot to do with the fact that running under the experimental hive is rather new for GAX/GAT and until the Service Factory you had to use the Clarius SFT to run under the experimental hive. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=116839"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=116839" 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/116839.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/11/14/116839.aspx</guid>
            <pubDate>Wed, 14 Nov 2007 09:53:36 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/116839.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/11/14/116839.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/116839.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/116839.aspx</trackback:ping>
        </item>
        <item>
            <title>Guidance Development Tools</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/09/19/115459.aspx</link>
            <description>&lt;p&gt;Guidance includes so many different types of documents; Help, How-Tos, FAQs, Checklists, Code Examples, Design Patterns, and Guidelines to name just a few that coming up with a standard way to develop the needed guidance is a hard task to do from scratch. Luckily Microsoft's patterns &amp;amp; practices group has a tool that can simplify a lot of this for you.&lt;/p&gt; &lt;p&gt;The Microsoft patterns &amp;amp; practice's Guidance Explorer provides a one stop shop for discovering, developing and publishing high quality development guidance. The project web site is located at &lt;a href="http://www.codeplex.com/guidanceExplorer" target="_blank"&gt;http://www.codeplex.com/guidanceExplorer&lt;/a&gt;. There you can find the latest release of the tool as well as links to existing guidance examples developed by the team.&lt;/p&gt; &lt;p&gt;The tool includes an editor which provides standardized templates for many of the types of guidance you may want to include in your factory. The editor also includes the ability to add custom data to each guidance item for filtering by Technology, Category, Topic and Rule Type.&lt;/p&gt; &lt;p&gt;How I see this tool being used is pretty simple. As part of the factory development process the guidance developer creates the various guidance items using Guidance Explorer and then exports them to HTML for inclusion into the factory contents. The factory developer then includes links to the files as part of the recipes using the &amp;lt;DocumentationLinks&amp;gt; tag. Now when ever a consumer of the factory invokes a recipe the Guidance Navigator can navigate to the document relating to the action just taken. This could be anything; a checklist of what steps need to be taken in the process; a how-to article on the use of a model just created or even code examples of how to use the library just added to the project.&lt;/p&gt; &lt;p&gt;Another way to apply this tool to factory development is by incorporating the web edition of the tool. It provides a read-only version of the Guidance Explorer that can utilize an on-line store allowing all of your guidance to be in one place. The web edition could be launched in a separate pane within Visual Studio to provide the full guidance library to the factory consumer as they use the factory. They can perform searches for specific topics, filter on a particular category or use the Guidance Navigation pane to browse all of the sections at their leisure.&lt;/p&gt; &lt;p&gt;In my opinion this is a must have tool in any factory developers toolkit, check it out.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=115459"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=115459" 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/115459.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/09/19/115459.aspx</guid>
            <pubDate>Wed, 19 Sep 2007 17:13:10 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/115459.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/09/19/115459.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/115459.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/115459.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>Its All About Reuse</title>
            <link>http://geekswithblogs.net/jlavin/archive/2007/06/27/113508.aspx</link>
            <description>&lt;p&gt;When I look at Software Factories I see a chance to reuse resources in a major way. If you think about it, many of the foundations that Software Factories are built on are rooted in reuse initiatives.&lt;/p&gt; &lt;p&gt;When viewing Software Factories from a reuse perspective, what artifacts should a factory contain besides executable code? Should we include resources from all of the phases that make up the software development life cycle or should we limit the resources to just those needed to produce executable code? I am of the opinion that a Software Factory should include resources from all of the phases of the development lifecycle. Why not reuse the analysis and design artifacts? Their use would help to make the process more repeatable and consistent. Also, by reusing artifacts from the entire lifecycle process, we are helping to accelerate the completion of the entire project from analysis to steady state support. Not only can we provide the code, but we could provide starting point documents for the requirements, design, installation, and run-time support as well.&lt;/p&gt; &lt;p&gt;A list of the type of artifacts I could see being included are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Requirements  &lt;/li&gt;&lt;li&gt;Traceability Matrices  &lt;/li&gt;&lt;li&gt;Business Rules Definitions  &lt;/li&gt;&lt;li&gt;Use Case Scenarios  &lt;/li&gt;&lt;li&gt;Design Diagrams  &lt;/li&gt;&lt;li&gt;Unit Tests  &lt;/li&gt;&lt;li&gt;Integration Tests  &lt;/li&gt;&lt;li&gt;Acceptance Tests  &lt;/li&gt;&lt;li&gt;Hardware Deployment Configurations  &lt;/li&gt;&lt;li&gt;Deployment Steps  &lt;/li&gt;&lt;li&gt;Application Trouble-Shooting Guides  &lt;/li&gt;&lt;li&gt;Help-Desk Procedures&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Thinking of the contents of Software Factories in this way means we have to think about the big picture. We need to look at everything produced during the development life cycle and decide how it fits in the factory schema and how we provide those artifacts in such a way that they are of value to the end-user. &lt;/p&gt; &lt;p&gt;Do we have our factory generate the artifacts in a series of documents or do we provide the ability to generate the output in several formats to allow it to be consumed by the various life cycle tools that are in use today? How do we store this information to allow it to be reused in so many different ways? Do we use text documents, XML, databases or do we need a repository to store it all?&lt;/p&gt; &lt;p&gt;If we look at how the Guidance Automation Toolkit (GAT) treats artifacts today, a source file has no significance until it is acted upon at runtime. The GAT treats it as an object, it doesn't compile it, it doesn't treat it in any special way, its just a file on the file system. In all reality, the GAT takes no special notice of it until it executes a recipe that references it and then the recipes and actions are the ones who understand its significance. They may use it as a template to generate a source file, they may add it to a project or they may even read it and use the data contained within it to pass to other actions or recipes.&lt;/p&gt; &lt;p&gt;Using this same principle, we should be able to do the same with all of the other lifecycle artifacts. Where appropriate, we can store the raw data in XML files and use T4 Templates to transform the data into any format we need for our life cycle tools. Graphical data can be exported to various standardized formats that can then be read in by our tools as well. We should be thinking of the GAT as a transformation engine and our artifacts as raw data that the recipes and actions transform in to format we need.&lt;/p&gt; &lt;p&gt;As you start to include more and more artifacts from the development lifecycle into your Software Factory, its complexity and size will increase. To handle this, you need to think about how you will standardize their format and transformation. Taking the time up front to define how you will store the information and what formats you'll provide for consumption will help you develop a library of recipes and actions you can reuse through out your projects.&lt;/p&gt; &lt;p&gt;To me, the use of XML data files to hold the raw data and the use of T4 Templates to output the data are probably the best way to do this at this point in time. It is very easy to read in a XML data source and then format it for output using the tools provided in GAT. Over my next few posts, I'll provide some examples of how to take a simple XML data file and transform it using T4 Templates.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:875128c7-f9b2-4a1a-8f3f-41ea077a249e" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &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=113508"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=113508" 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/113508.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jim Lavin</dc:creator>
            <guid>http://geekswithblogs.net/jlavin/archive/2007/06/27/113508.aspx</guid>
            <pubDate>Wed, 27 Jun 2007 18:55:13 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/jlavin/comments/113508.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/jlavin/archive/2007/06/27/113508.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/jlavin/comments/commentRss/113508.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/jlavin/services/trackbacks/113508.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>