<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>On The Journey</title><link>http://blogs.msdn.com/dkaufman/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>RouterManager Sample and the SQL Server Modeling CTP</title><link>http://blogs.msdn.com/dkaufman/archive/2009/11/16/routermanager-sample-and-the-sql-server-modeling-ctp.aspx</link><pubDate>Tue, 17 Nov 2009 00:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9923290</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9923290.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9923290</wfw:commentRss><description>&lt;P&gt;I recently shifted positions slightly.&amp;nbsp; Previously, I had been working with ISVs adopting our divisions latest technologies such as “Oslo” which is &lt;A href="http://www.douglaspurdy.com/2009/11/10/from-oslo-to-sql-server-modeling/" mce_href="http://www.douglaspurdy.com/2009/11/10/from-oslo-to-sql-server-modeling/"&gt;now officially called&lt;/A&gt; the SQL Server Modeling.&amp;nbsp; My new team, the &lt;A href="http://blogs.msdn.com/dmcat" mce_href="http://blogs.msdn.com/dmcat"&gt;Data Modeling Customer Advisory Team(DM CAT)&lt;/A&gt; broadens my focus to work with customer all up on adoption of our Data Modeling technology including the &lt;A href="http://msdn.microsoft.com/en-us/oslo/default.aspx" mce_href="http://msdn.microsoft.com/en-us/oslo/default.aspx"&gt;SQL Server Modeling CTP&lt;/A&gt; and the &lt;A href="http://msdn.microsoft.com/en-us/library/bb399572(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb399572(VS.100).aspx"&gt;Entity Framework&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/cc668792(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc668792(VS.100).aspx"&gt;Data Services&lt;/A&gt;.&amp;nbsp; We will be engaging customers using this technology and publishing real-world guidance and key learning's to help the community adopt these products.&lt;/P&gt;
&lt;P&gt;As part of my work with the SQL Server Modeling CTP, I developed an end-to-end sample application which demonstrate model driven content based routing.&amp;nbsp; The &lt;A href="http://code.msdn.microsoft.com/RouterManager" mce_href="http://code.msdn.microsoft.com/RouterManager"&gt;RouterManager&lt;/A&gt; makes it simple to configure new WCF .NET 4 &lt;A href="http://msdn.microsoft.com/en-us/library/ee517422(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ee517422(VS.100).aspx"&gt;Routing Service&lt;/A&gt; by creating a domain specific language (DSL).&amp;nbsp; Routing configurations are stored in the SQL Modeling CTP’s Repository database.&amp;nbsp; The Entity Framework is used to read the router model data to configure the router.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;You can download the RouterManager sample on &lt;A href="http://code.msdn.microsoft.com/RouterManager" mce_href="http://code.msdn.microsoft.com/RouterManager"&gt;Code Gallery&lt;/A&gt;.&amp;nbsp; And &lt;A href="http://blogs.msdn.com/dmcat/archive/2009/11/16/model-driven-content-based-routing-using-sql-server-modeling-ctp-part-i.aspx" mce_href="http://blogs.msdn.com/dmcat/archive/2009/11/16/model-driven-content-based-routing-using-sql-server-modeling-ctp-part-i.aspx"&gt;read more&lt;/A&gt; about the details of the sample on our new &lt;A href="http://blogs.msdn.com/dmcat/default.aspx" mce_href="http://blogs.msdn.com/dmcat/default.aspx"&gt;team blog&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9923290" width="1" height="1"&gt;</description></item><item><title>The SQL Server Modeling CTP</title><link>http://blogs.msdn.com/dkaufman/archive/2009/11/11/the-sql-server-modeling-ctp.aspx</link><pubDate>Thu, 12 Nov 2009 07:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9921226</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9921226.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9921226</wfw:commentRss><description>&lt;p&gt;We announced earlier this week the transition of the name of the technology formerly know as “Oslo” to SQL Server Modeling.&amp;#160; Douglas Purdy discusses the change and some of our thinking behind this on his blog:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.douglaspurdy.com/2009/11/10/from-oslo-to-sql-server-modeling/" mce_href="http://www.douglaspurdy.com/2009/11/10/from-oslo-to-sql-server-modeling/"&gt;From “Oslo” to SQL Server Modeling&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.douglaspurdy.com/2009/11/12/on-dsls-and-a-few-other-things/" mce_href="http://www.douglaspurdy.com/2009/11/12/on-dsls-and-a-few-other-things/"&gt;On DSLs and a few other things…&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I personally am very excited about this announcement, as we now have a ship vehicle, schedule and a clear path to v1.&amp;#160; As you will hear and see at &lt;a href="http://microsoftpdc.com/" mce_href="http://microsoftpdc.com/"&gt;PDC09&lt;/a&gt; there has been a lot of work on the technology since the May CTP.&lt;/p&gt;  &lt;p&gt;Kraig Brockschmidt posted on the &lt;a href="http://blogs.msdn.com/modelcitizen/default.aspx" mce_href="http://blogs.msdn.com/modelcitizen/default.aspx"&gt;Model Citizens&lt;/a&gt; blog that we will be releasing a &lt;a href="http://blogs.msdn.com/modelcitizen/archive/2009/11/02/next-oslo-ctp-to-be-released-in-conjunction-with-pdc.aspx" mce_href="http://blogs.msdn.com/modelcitizen/archive/2009/11/02/next-oslo-ctp-to-be-released-in-conjunction-with-pdc.aspx"&gt;new version of the modeling CTP&lt;/a&gt; in conjunction with PDC.&amp;#160; I have been working with the new bits and created a cool end to end example that will also be released.&amp;#160;&amp;#160; But I will post more details about this project next week.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9921226" width="1" height="1"&gt;</description></item><item><title>Get Ready for PDC 2009</title><link>http://blogs.msdn.com/dkaufman/archive/2009/10/06/get-ready-for-pdc-2009.aspx</link><pubDate>Tue, 06 Oct 2009 03:05:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9903483</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9903483.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9903483</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://microsoftpdc.com/" target="_blank"&gt;PDC 2009&lt;/a&gt; is rapidly approaching.&amp;#160; If you haven’t made plans yet, what are you waiting for? (&lt;a href="http://microsoftpdc.com/Registration" target="_blank"&gt;register&lt;/a&gt; by Oct 13th for a discount)&amp;#160; There will be a lot of great Data and Modeling sessions at this years PDC including:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The “data &amp;amp; modeling keynote” with Don Box and Chris Anderson&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Sessions/P09-04"&gt;Data Programming and Modeling for the Microsoft .NET Developer&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Astoria and EF talks&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT12"&gt;ADO.NET Data Services- What’s new with the RESTful data services framework&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT10"&gt;Evolving ADO.NET Entity Framework in .NET 4 and Beyond&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“Oslo” talks&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT50"&gt;Building Data-Driven Applications Using Microsoft Project Code Name &amp;quot;Quadrant&amp;quot; and Microsoft Project Code Name &amp;quot;M&amp;quot;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Sessions/SVR19"&gt;Microsoft Project Code Name “Repository”: Using Metadata to Drive Application Design, Development, and Management&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT34"&gt;Microsoft Project Code Name “M”- The Data and Modeling Language&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Be sure to keep checking the &lt;a href="http://microsoftpdc.com/" target="_blank"&gt;PDC website&lt;/a&gt; as new sessions are added daily.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9903483" width="1" height="1"&gt;</description></item><item><title>From DSLs and Models to “Quadrant” using “Oslo” May CTP – Part III</title><link>http://blogs.msdn.com/dkaufman/archive/2009/06/24/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-iii.aspx</link><pubDate>Wed, 24 Jun 2009 10:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9801035</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9801035.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9801035</wfw:commentRss><description>&lt;P&gt;This is the 3rd and final part of our look at the “Oslo” May CTP.&amp;nbsp; In &lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx"&gt;Part I&lt;/A&gt;, we created a simple domain model for a fictional company’s employee information. In &lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx"&gt;Part II&lt;/A&gt;, we used the M language support to created a domain specific language (DSL) model that took a simple text input and generated model values for our previously created &lt;STRONG&gt;EmployeeInfo&lt;/STRONG&gt; domain model.&amp;nbsp; At the end of Part II we had compiled artifacts for our Employee Model and our Employee values (from the DSL input text).&amp;nbsp; In Part III we will load our Employee model and values into the Oslo Repository and inspect them using the Quadrant model viewer.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;First we need to the model and model data into the Repository.&amp;nbsp; To do this we execute the mx command.&amp;nbsp; The actual command will look like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;mx install Employee.mx -d:Repository&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This basically tells the mx command to install the &lt;STRONG&gt;Employee.mx&lt;/STRONG&gt; values and our Employee model (which if you remember when we compiled this in &lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx"&gt;Part II&lt;/A&gt;, we had to pass in a reference to our compiled model &lt;STRONG&gt;EmployeeModel.mx&lt;/STRONG&gt;)&amp;nbsp; into the Repository database.&amp;nbsp; Now that our model is in the Repository lets take a look at it using “Quadrant”. &lt;/P&gt;
&lt;P&gt;Oslo “Quadrant” is a visual tool for interacting with models and model data is included as part of the “Oslo” May CTP.&amp;nbsp; Quadrant itself is a great example of a model driven application.&amp;nbsp; We will make use of this fact a little later to customize the view of our model.&amp;nbsp; Let’s use Quadrant to take a look at our Employee model.&amp;nbsp; Launch Quadrant by clicking on the icon in the “&lt;EM&gt;Microsoft Codename Oslo Quadrant&lt;/EM&gt;” folder in the &lt;EM&gt;Start Menu&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;When Quadrant loads up, the Repository is displayed in a &lt;STRONG&gt;Tree Master/Detail&lt;/STRONG&gt; view.&amp;nbsp; Expand &lt;EM&gt;Catalog&lt;/EM&gt; and you will see our &lt;STRONG&gt;EmployeeInfo&lt;/STRONG&gt; domain holding our &lt;STRONG&gt;Employees&lt;/STRONG&gt; model.&amp;nbsp; Click on the &lt;STRONG&gt;Employees&lt;/STRONG&gt; model. Notice it displays a list of the first names of the employees that we specified in our DSL input text which is now in the Repository.&amp;nbsp; Remember this as we will come back to it shortly.&lt;/P&gt;
&lt;P&gt;Now drag the &lt;STRONG&gt;Employees&lt;/STRONG&gt; model onto the workspace.&amp;nbsp; Notice Quadrant displays our model values in a &lt;STRONG&gt;Table&lt;/STRONG&gt; view.&amp;nbsp; Let’s change this to a &lt;STRONG&gt;&lt;EM&gt;Master/Detail&lt;/EM&gt;&lt;/STRONG&gt; view to make it easier to see.&amp;nbsp; In the upper right of our Employees view, click on where it says &lt;STRONG&gt;&lt;EM&gt;Table.&lt;/EM&gt;&lt;/STRONG&gt;&amp;nbsp; A list of different viewers will be shown in the dropdown.&amp;nbsp; Select &lt;STRONG&gt;&lt;EM&gt;Master/Detail&lt;/EM&gt;&lt;/STRONG&gt;.&amp;nbsp; A picture of the view setting is shown below (I placed a red oval around the &lt;STRONG&gt;Master/Detail&lt;/STRONG&gt; setting you should select):&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_1512B/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_1512B/image_thumb.png" width=863 height=635&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;You will see Quadrant now shows the list of first names on the left and when you click on a name, it shows the detail on the right (in a property view). Notice, the &lt;STRONG&gt;Table&lt;/STRONG&gt; view was tagged in the dropdown as the &lt;EM&gt;Default&lt;/EM&gt; view.&amp;nbsp; Let’s make the &lt;STRONG&gt;Master/Detail&lt;/STRONG&gt; view the &lt;EM&gt;Default&lt;/EM&gt; view.&amp;nbsp; From the main menu select &lt;STRONG&gt;View|Set Default View&lt;/STRONG&gt;.&amp;nbsp; &lt;STRONG&gt;Master/Detail&lt;/STRONG&gt; will now be the default view for our model.&amp;nbsp; If we close the &lt;STRONG&gt;Employees&lt;/STRONG&gt; model and re-drag it from the Catalog, it should come up in our new default view.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_1512B/image6.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_1512B/image6_thumb.png" width=866 height=632&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;When Quadrant displays our &lt;STRONG&gt;Employees&lt;/STRONG&gt; model data, it shows the &lt;STRONG&gt;FirstName&lt;/STRONG&gt; field.&amp;nbsp; Quadrant looks at a model and grabs the first field it finds that contains “&lt;EM&gt;name&lt;/EM&gt;” as the default field to display.&amp;nbsp; Remember previously I said Quadrant was a great example of a model driven application.&amp;nbsp; Well, we can change this behavior for our &lt;STRONG&gt;Employees&lt;/STRONG&gt; model by updating one of Quadrant’s models, telling Quadrant what field we want it to display by default.&amp;nbsp; This is done by adding instance data for the &lt;STRONG&gt;ViewerHintCatalogTypes&lt;/STRONG&gt; in Quadrant’s own model Repository.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We can use M to insert this data.&amp;nbsp; Let’s have Quadrant display an Employee’s &lt;STRONG&gt;Number&lt;/STRONG&gt; instead of &lt;STRONG&gt;FirstName&lt;/STRONG&gt; as the default display value.&amp;nbsp; Below is what the M value looks like for our &lt;STRONG&gt;ViewerHintCatalogTypes&lt;/STRONG&gt;.&amp;nbsp; We tell Quadrant that our host is the localhost – “&lt;EM&gt;.&lt;/EM&gt;”, our the &lt;EM&gt;Catalog&lt;/EM&gt; where our Employees model is stored is called “&lt;EM&gt;Repository&lt;/EM&gt;”, the schema name for our model is call “&lt;EM&gt;EmployeeInfo&lt;/EM&gt;”, the type we want to modify the display for is “&lt;EM&gt;Employees&lt;/EM&gt;” and that when it displays the Employees model, it should show the “&lt;EM&gt;Number&lt;/EM&gt;” field.&amp;nbsp; Put the below M in a file called &lt;STRONG&gt;EmployeeConfiguration.m&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;module Quadrant.SchemaExtensions &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp; import Quadrant.SchemaExtensions;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; ViewerHintCatalogTypes &lt;BR&gt;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Host =&amp;gt; ".", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CatalogName =&amp;gt; "Repository", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SchemaName =&amp;gt; "EmployeeInfo", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TypeOrAssociationName =&amp;gt; "Employees", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewerHint =&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DescriptionProperty =&amp;gt; "Number", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GroupingProperty =&amp;gt; "", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SpatialProperty =&amp;gt; "" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Because we are inserting values into one of Quadrant’s models, we included an import of Quadrant’s &lt;STRONG&gt;SchemaExtensions&lt;/STRONG&gt; model.&amp;nbsp; Now we need to compile our &lt;STRONG&gt;EmployeeConfiguration&lt;/STRONG&gt; M.&amp;nbsp; We will need to pass the M compiler a reference to Quadrants models on the command line.&amp;nbsp; Quadrant’s models are compiled into a file called &lt;STRONG&gt;Quadrant.mx&lt;/STRONG&gt; which can be found in the Oslo install directory.&amp;nbsp; The command to compile our &lt;STRONG&gt;EmployeeConfiguration&lt;/STRONG&gt; is shown below:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;m EmployeeConfiguration.m /r:"C:\Program Files\Microsoft Oslo\1.0\bin\QuadrantModels.mx" &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The next step is to install our configuration values for our model into Quadrant’s repository.&amp;nbsp; To do this we first need to find out what Quadrants repository is named.&amp;nbsp; You can do this by loading up SQL Server Manager and looking at the databases or executing the command below from a command line:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;sqlcmd -s ./SQLSERVER -Q "select name from sys.databases"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;On my machine, Quadrant’s repository is contained in a database called &lt;STRONG&gt;Quadrant.3.0.1803.10.DKAUFMAN-OSLO&lt;/STRONG&gt; which is a combination of the name Quadrant, the Oslo version and the name of my computer.&amp;nbsp; Yours should be similar with a different computer name at the end.&amp;nbsp; We will use the mx command to install the configuration file, telling it to use the Quadrant repository and passing a reference to Quadrant’s compiled models.&amp;nbsp; The command looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;mx install EmployeeConfiguration.mx -d:Quadrant.3.0.1803.10.DKAUFMAN-OSLO.Administrator /r:"C:\Program Files\Microsoft Oslo\1.0\bin\QuadrantModels.mx"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Our customization is now installed. Close Quadrant and re-start it.&amp;nbsp; Notice now in the Repository Tree view when you click on our Employees model, a list of Employee &lt;STRONG&gt;Number&lt;/STRONG&gt; is displayed on the right instead of &lt;STRONG&gt;FirstName&lt;/STRONG&gt;.&amp;nbsp; Also, in our default model view for our Employees model, Employee Number is now shown on the left hand side in the &lt;STRONG&gt;Master/Detail&lt;/STRONG&gt; and clicking on the number shows the employee info on the right.&amp;nbsp; Below is a screenshot of Quadrant showing the visual customization for our Employees model:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_1512B/image1.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_1512B/image1_thumb.png" width=846 height=618&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;That’s it for our tour of the “Oslo” May CTP.&amp;nbsp; Through these posts, we saw how easy it was to build a model, create a DSL for getting data into our model, install our model into the Oslo Repository, display our model visually using Quadrant and customizing the view of our model.&amp;nbsp; You can download the Oslo artifacts for this example &lt;A href="http://cid-aed9d9fba267dd33.skydrive.live.com/self.aspx/.Public/Code/Oslo/Employee%20Model.zip" target=_blank&gt;here&lt;/A&gt;.&amp;nbsp; I included batch files to build, clean and install the example. Also, included is a batch file to re-build the default Oslo repository (&lt;U&gt;you might have to edit directories or the name of the Quadrant repository in the batch files to match your install&lt;/U&gt;).&lt;/P&gt;
&lt;P&gt;Now it’s your turn.&amp;nbsp; Install the latest &lt;A href="http://msdn.microsoft.com/oslo" target=_blank&gt;Oslo CTP&lt;/A&gt; and take it for a spin.&amp;nbsp; And please let me know about the applications you build as you experiment with this exciting new technology. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9801035" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Oslo/default.aspx">Oslo</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Repository/default.aspx">Repository</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Quadrant/default.aspx">Quadrant</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/M/default.aspx">M</category></item><item><title>From DSLs and Models to “Quadrant” using “Oslo” May CTP – Part II</title><link>http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx</link><pubDate>Fri, 05 Jun 2009 08:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9700832</guid><dc:creator>dskaufman</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9700832.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9700832</wfw:commentRss><description>&lt;P&gt;Welcome to Part II of our look at the “Oslo” May CTP.&amp;nbsp; In &lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx" target=_blank mce_href="http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx"&gt;Part I&lt;/A&gt;, we created a simple domain model for a fictional company’s employee information. In this installment, we will create a domain specific language (DSL) that will take a simple text input and generate model values for our previously created domain model.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;To re-cap, in Part I, we created a module called &lt;STRONG&gt;EmployeeInfo &lt;/STRONG&gt;that defined an entity called &lt;STRONG&gt;Employee&lt;/STRONG&gt; which has the following definition:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=3 face=Courier&gt;type Employee{ &lt;BR&gt;&amp;nbsp; FirstName: Text#50; &lt;BR&gt;&amp;nbsp; LastName: Text#50; &lt;BR&gt;&amp;nbsp; Number:Text#10; &lt;BR&gt;&amp;nbsp; id : Integer32 =&amp;gt; AutoNumber();&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;} where identity(id);&lt;/FONT&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;EmployeeInfo&lt;/STRONG&gt; also defined and extent called &lt;STRONG&gt;Employees&lt;/STRONG&gt; which contains zero or more &lt;STRONG&gt;Employee&lt;/STRONG&gt; instances.&lt;/P&gt;
&lt;P&gt;Now we will use M language support to create a very simple DSL called &lt;STRONG&gt;EmployeeGrammar&lt;/STRONG&gt; which describes an Employee.&amp;nbsp; Below is an example of the &lt;STRONG&gt;EmployeeGrammar&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;My name is Edward Brown, my employee number is 364321 &lt;BR&gt;My name is Joe Smith, my employee number is 342343&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The above input text is placed in a text file called &lt;STRONG&gt;Employee.txt&lt;/STRONG&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Now lets create the language used to parse the input text for our language. A grammar is a set of rules which determine if a sequence of characters conform to a language.&amp;nbsp; The grammar parser will parse the input text based on the rules of the grammar and build a syntax tree which is a hierarchy of data that was parsed.&amp;nbsp; The syntax tree can be used in a number of ways in your application including storing it (e.g. in the Repository or as XML) or by iterating through the tree in memory at runtime directly in your application.&amp;nbsp; For this example we will be using the M tool chain to generate the syntax tree as a set of model values and import it into the Oslo Repository.&lt;/P&gt;
&lt;P&gt;We can build our grammar in the Oslo Intellipad tool.&amp;nbsp;&amp;nbsp; For our grammar, first we need to specify the interleave for the language which indicates the rule for which values should be used as whitespaces.&amp;nbsp; For our language, whitespaces will be defined as spaces, tabs, carriage returns/linefeed and commas.&amp;nbsp; The interleave command looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;interleave Whitespace = ' ' | '\t' | '\n' | '\r' | ','; &lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Next we need to define tokens which are used to designate rules that defines the language.&amp;nbsp; The language parser will try to match the tokens in the input text.&amp;nbsp; The first token we define will be for the start text for our language which is “My name is”.&amp;nbsp; The token statement looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;token TkStart = "My name is"; &lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;We then define a token for name which can be any letter, lower or uppercase.&amp;nbsp; A name can be made up of one or more letters.&amp;nbsp; The definition for the name token looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;token TkName = ("A".."Z" | "a".."z")+; &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In the above token definition, the “+” is what indicates that the token is made up of one or more characters.&amp;nbsp; That takes care of tokens for the name part of the DSL but we still need to specify the tokens for the employee number.&amp;nbsp; The tokens for employee number section looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;token TkNumStart = "my employee number is";&amp;nbsp;&amp;nbsp; &lt;BR&gt;token TkEmpNum = ("0".."9")+;&lt;/FONT&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Now that we have the tokens we need to define the syntax of how the tokens should be used.&amp;nbsp; M language below is the syntax statement that tells how the tokens can be used to parse the input text.&amp;nbsp; All M language files must have a &lt;STRONG&gt;Main&lt;/STRONG&gt; syntax statement which is the starting point for the grammar rules.&amp;nbsp; Our will look like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;syntax Main =&amp;nbsp; EmployeeData*; &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The above indicates that the EmployeeData rule should be used for the grammar which means there needs to be a syntax statement for EmployeeData and that there will be one or more lines of the input textto be processed.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Next we need to define the syntax for EmployeeData which will consist of the start token, a token for first name, a token for last name, a token for the start of the employee num and finally the token for the employee number.&amp;nbsp; The EmployeeData syntax statement looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;syntax EmployeeData =&amp;nbsp; TkStart TkName TkName TkNumStart TkEmpNum; &lt;/FONT&gt;&lt;FONT face=Courier&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The complete text for our language so far is shown in Intellipad below.&amp;nbsp; Again we use the module name &lt;STRONG&gt;EmployeeInfo&lt;/STRONG&gt;.&amp;nbsp; Our language will be called &lt;STRONG&gt;EmployeeLanguage.&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_10.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_thumb_4.png" width=535 height=292&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Save the grammar in a file called &lt;STRONG&gt;EmployeeGrammar.mg&lt;/STRONG&gt;.&amp;nbsp; Now we can test it.&amp;nbsp; To do this we put Intellipad in MGrammar mode and load up our input text in the &lt;STRONG&gt;Employee.txt&lt;/STRONG&gt; file we created above.&amp;nbsp; With the &lt;STRONG&gt;EmployeeGrammar.mg&lt;/STRONG&gt; file loaded in Intellipad, press &lt;STRONG&gt;&amp;lt;CTRL&amp;gt; &amp;lt;SHIFT&amp;gt; T&lt;/STRONG&gt;.&amp;nbsp; Intellipad should prompt you to select the input text file and then it will go into Tree Preview Mode.&amp;nbsp; The input text will be shown on the left side, the grammar in the middle and the generated syntax tree will be on the right side.&amp;nbsp; At the bottom will be a window that will display parse errors.&amp;nbsp; Below is a screen shot of Intellipad in Tree Preview Mode:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_18.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_thumb_8.png" width=678 height=352&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;If you look at the generated syntax tree on the far right for our sample language input text you will notice that it seems rather ambiguous.&amp;nbsp; It also contains extra text such as the text of the static tokens. To fix this, we will use projections.&amp;nbsp; Projections specify how the values should be generated from the language input text should look.&amp;nbsp; The projection operator “=&amp;gt;” is used and immediately followed by the pattern we want to use in place of the default tree structure.&lt;/P&gt;
&lt;P&gt;Let start by cleaning up the &lt;STRONG&gt;EmployeeData&lt;/STRONG&gt; syntax.&amp;nbsp; You can reference the values of the tokens by prefacing the token with a &lt;STRONG&gt;&amp;lt;name&amp;gt;:&lt;/STRONG&gt;.&amp;nbsp; In this example we will reference the first name of &lt;STRONG&gt;TkName&lt;/STRONG&gt; with &lt;STRONG&gt;f&lt;/STRONG&gt;, the&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;last name with &lt;STRONG&gt;l &lt;/STRONG&gt;and the employee number as &lt;STRONG&gt;n&lt;/STRONG&gt;.&amp;nbsp; We will then use those references in the projection for instance indicated the first name should be output in the syntax tree as with the text “FirstName =” and the value of &lt;STRONG&gt;f &lt;/STRONG&gt;by writing&amp;nbsp; &lt;EM&gt;FirstName =&amp;gt; f. &lt;/EM&gt;The full definition for the &lt;STRONG&gt;EmployeeData&lt;/STRONG&gt; syntax should look like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;syntax EmployeeData =&amp;nbsp; TkStart f:TkName l:TkName TkNumStart n:TkEmpNum =&amp;gt;{FirstName =&amp;gt; f, LastName =&amp;gt; l, Number =&amp;gt;n}; &lt;/FONT&gt;&lt;FONT face=Courier&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Now let’s add a projection to the &lt;STRONG&gt;Main&lt;/STRONG&gt; syntax.&amp;nbsp; The values from the EmployeeData rule will be referenced in the production by the identifier &lt;STRONG&gt;e&lt;/STRONG&gt;.&amp;nbsp; We need to make sure the projection generates the name of our extent &lt;STRONG&gt;Employees&lt;/STRONG&gt; from the our previously defined model and we will use the &lt;STRONG&gt;valuesof&lt;/STRONG&gt; grammar keyword to remove an extra set of brackets that was being generated in the default projection.&amp;nbsp; The &lt;STRONG&gt;Main&lt;/STRONG&gt; syntax should look like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;syntax Main =&amp;nbsp; e:EmployeeData* =&amp;gt; Employees{valuesof(e)}; &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The complete text of our language is shown below:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;module EmployeeInfo{ &lt;BR&gt;language EmployeeLanguage{ &lt;BR&gt;&amp;nbsp;&amp;nbsp; syntax Main =&amp;nbsp; e:EmployeeData* =&amp;gt; Employees{valuesof(e)}; &lt;BR&gt;&amp;nbsp;&amp;nbsp; syntax EmployeeData =&amp;nbsp; TkStart f:TkName l:TkName TkNumStart n:TkEmpNum =&amp;gt;{FirstName =&amp;gt; f, LastName =&amp;gt; l, Number =&amp;gt;n}; &lt;BR&gt;&amp;nbsp;&amp;nbsp; token TkStart = "My name is"; &lt;BR&gt;&amp;nbsp;&amp;nbsp; token TkName = ("A".."Z" | "a".."z")+; &lt;BR&gt;&amp;nbsp;&amp;nbsp; token TkNumStart = "my employee number is"; &lt;BR&gt;&amp;nbsp;&amp;nbsp; token TkEmpNum = ("0".."9")+; &lt;BR&gt;&amp;nbsp;&amp;nbsp; interleave Whitespace = ' ' | '\t' | '\n' | '\r' | ','; &lt;BR&gt;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The generated syntax tree using the added projections looks much cleaner and now maps to our schema definition of &lt;STRONG&gt;Employee&lt;/STRONG&gt;.&amp;nbsp; Here is a screenshot of Intellipad with the new syntax tree displayed:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_16.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_thumb_7.png" width=662 height=281&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Now let’s use the M tool chain to compile our grammar and generate M values of our input text.&amp;nbsp; We compile the grammar using the &lt;STRONG&gt;m.exe&lt;/STRONG&gt; command, passing it our language file &lt;STRONG&gt;EmployeeGrammar.mg&lt;/STRONG&gt;.&amp;nbsp; The result will be&amp;nbsp; an mx file called&lt;STRONG&gt; EmployeeGrammar.mx&lt;/STRONG&gt;.&amp;nbsp; We then use the mgx.exe command to generate M values for our input text.&amp;nbsp; We pass the mgx command a the name of our input text file, use the &lt;STRONG&gt;/r&lt;/STRONG&gt; switch to reference the &lt;STRONG&gt;EmployeeGrammar.mx&lt;/STRONG&gt; file we generated previously and use the &lt;STRONG&gt;/m&lt;/STRONG&gt; switch to tell it that the module generated with the values should be &lt;STRONG&gt;EmployeeInfo&lt;/STRONG&gt; to be consistent with the modules we defined previous for our model schema.&amp;nbsp; The full command will looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;mgx Employee.txt /r:EmployeeGrammar.mx /m:EmployeeInfo&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This generates the following M values in a file called &lt;STRONG&gt;Employee.m&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;module EmployeeInfo { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Employees { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FirstName =&amp;gt; "Edward", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName =&amp;gt; "Brown", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number =&amp;gt; "364321" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FirstName =&amp;gt; "Joe", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName =&amp;gt; "Smith", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number =&amp;gt; "342343" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;We can then compile the newly generated M values from our input text using the m.exe command, which will generate a file called &lt;STRONG&gt;Employee.mx&lt;/STRONG&gt;.&amp;nbsp; To compile the newly generated M values from our input text we need to reference the &lt;STRONG&gt;Employee&lt;/STRONG&gt; model schema which we compiled previously which is in the &lt;STRONG&gt;EmployeeModel.mx&lt;/STRONG&gt; file.&amp;nbsp;&amp;nbsp; The command looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;m Employee.m /r:EmployeeModel.mx&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;And here is a screenshot of the commands executing: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_thumb_3.png" width=709 height=310 mce_src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLsandModelstoQuadrantusingOsloMayC_13F02/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;That’s it for Part II.&amp;nbsp; As you can see, creating new domain specific languages is very easy using the Oslo M tools.&amp;nbsp; In &lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/06/24/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-iii.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/06/24/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-iii.aspx"&gt;Part III&lt;/A&gt; we will install our Employee domain model and values into the “Oslo” Repository and then customize the visual view of our model using “Quadrant”.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9700832" width="1" height="1"&gt;</description></item><item><title>From DSLs and Models to “Quadrant” using “Oslo” May CTP – Part I</title><link>http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx</link><pubDate>Wed, 27 May 2009 08:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9643550</guid><dc:creator>dskaufman</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9643550.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9643550</wfw:commentRss><description>&lt;P&gt;The “Oslo” May CTP has just been released.&amp;nbsp; You can download the latest release of Oslo from the &lt;A title="Oslo Dev Center" href="http://msdn.microsoft.com/oslo" target=_blank mce_href="http://msdn.microsoft.com/oslo"&gt;Oslo Dev Center on MSDN&lt;/A&gt;.&amp;nbsp; I have been using this new version and want to give a little tour of the new bits.&amp;nbsp; This will be the first of three posts that take you through creating a simple domain model, building a DSL, importing the Model schema and instance data into the Repository and then exploring and customizing the view of the model using "Quadrant". &lt;/P&gt;
&lt;P&gt;For this example we’ll create a very simple domain model using MSchema that will contain information for a fictional company’s employee information.&amp;nbsp; The DSL will take a simple input text that will be parsed and stored as model instance data.&amp;nbsp; Lastly we will display and customize the view of the Employee model in Quadrant.&lt;/P&gt;
&lt;P&gt;The posts will be split as follows:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/05/27/from-dsl-and-models-to-quadrant-using-oslo-may-ctp-part-i.aspx"&gt;Part I – Creating the Model with MSchema&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx"&gt;Part II – Building a DSL with MGrammar&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/06/24/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-iii.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/06/24/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-iii.aspx"&gt;Part III – Viewing the Model in Quadrant&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The Module will be called &lt;STRONG&gt;EmployeeInfo &lt;/STRONG&gt;and the schema will contain the definition of an entity called &lt;STRONG&gt;Employee&lt;/STRONG&gt;.&amp;nbsp; An employee will have Text fields called &lt;EM&gt;&lt;STRONG&gt;FirstName&lt;/STRONG&gt;&lt;/EM&gt;, &lt;EM&gt;&lt;STRONG&gt;LastName&lt;/STRONG&gt;&lt;/EM&gt; and &lt;EM&gt;&lt;STRONG&gt;Number&lt;/STRONG&gt;&lt;/EM&gt; where &lt;EM&gt;&lt;STRONG&gt;Number&lt;/STRONG&gt;&lt;/EM&gt; is the fictional employee’s employee number .&amp;nbsp; The schema for &lt;STRONG&gt;Employee&lt;/STRONG&gt; looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=3 face=Courier&gt;type Employee{ &lt;BR&gt;&amp;nbsp; FirstName: Text#50; &lt;BR&gt;&amp;nbsp; LastName: Text#50; &lt;BR&gt;&amp;nbsp; Number:Text#10; &lt;BR&gt;&amp;nbsp; id : Integer32 =&amp;gt; AutoNumber();&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;} where identity(id);&lt;/FONT&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Also we include a field call &lt;STRONG&gt;&lt;EM&gt;id&lt;/EM&gt;&lt;/STRONG&gt; which is an integer which will contain a&amp;nbsp; number auto generated by “Oslo” that will be used as a unique identity field for each Employee.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; In the Oslo May CTP, the use of “=” has been deprecated.&amp;nbsp; Instead “=&amp;gt;” is used in MSchema and MGrammar.&amp;nbsp; You can read more about the May CTP language changes in the &lt;A title=Oslo href="http://msdn.microsoft.com/en-us/oslo/releasenotes.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/oslo/releasenotes.aspx"&gt;Oslo May CTP Release Notes&lt;/A&gt; and Shawn Wildermuth's blog post “&lt;A href="http://wildermuth.com/2009/05/22/M_Language_Changes_Coming_in_Next_CTP" mce_href="http://wildermuth.com/2009/05/22/M_Language_Changes_Coming_in_Next_CTP"&gt;M Language Changes Coming in Next CTP&lt;/A&gt;”&lt;/P&gt;
&lt;P&gt;Now that we have Employee defined, we still need an extent to hold a list of employees.&amp;nbsp; The line below will define and extent called Employees that contains zero or more Employee records:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Courier&gt;Employees:Employee*;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;That’s it, our simple Employee model is done.&amp;nbsp; Below is the full MSchema file for the Employee model. I used Oslo’s Intellipad editor to create the definition and saved it to an M file called &lt;STRONG&gt;EmployeeModel.m&lt;/STRONG&gt;.&amp;nbsp; Here is a picture of the Employee model Intellipad:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_6.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_thumb_2.png" width=682 height=487 mce_src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The final step will be to compile the Employee model.&amp;nbsp; We do this using the Domain Compiler - &lt;EM&gt;m.exe&lt;/EM&gt; that is part of the “Oslo” SDK from the May CTP and pass it the name of our M file – &lt;STRONG&gt;EmployeeModel.m&lt;/STRONG&gt;.&amp;nbsp; This will generate a file called &lt;STRONG&gt;EmployeeModel.mx&lt;/STRONG&gt; which contains our compiled model.&amp;nbsp; Below is a screenshot of the compilation step:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_10.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_thumb_4.png" width=704 height=310 mce_src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/FromDSLandModelsusingOsloMayCTPPartI_148AC/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That’s it for this installment, we now have our compiled Domain Model.&amp;nbsp; In &lt;A href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx" mce_href="http://blogs.msdn.com/dkaufman/archive/2009/06/05/from-dsls-and-models-to-quadrant-using-oslo-may-ctp-part-ii.aspx"&gt;Part II&lt;/A&gt; we will create a DSL that converts some easy to understand text into instance data for our Employee Model.&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9643550" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Oslo/default.aspx">Oslo</category></item><item><title>A BizTalk DSL using “Oslo”</title><link>http://blogs.msdn.com/dkaufman/archive/2009/03/02/oslo-dsl-for-biztalk.aspx</link><pubDate>Tue, 03 Mar 2009 00:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9455242</guid><dc:creator>dskaufman</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/9455242.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=9455242</wfw:commentRss><description>&lt;P&gt;It's been a while since my last post.&amp;nbsp; I recently started playing with the latest &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f2f4544c-626c-44a3-8866-b2a9fe078956&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f2f4544c-626c-44a3-8866-b2a9fe078956&amp;amp;displaylang=en"&gt;“Oslo” CTP&lt;/A&gt; release and wanted to share with you what I have built so far.&amp;nbsp; One of the cool features of the “Oslo” SDK is the ability to write new Domain Specific Languages (DSL) with MGrammar.&amp;nbsp; I had worked in the past with ISV's who wanted to generate BizTalk Orchestrations from their products, so I took some test code I had written that generates test ODX files and decided to try building an MGrammer for generating these files.&amp;nbsp; The idea is to build an easy to read language that when compiled would generate a BizTalk Orchestration .&lt;/P&gt;
&lt;P&gt;An example input file to my grammar for an Orchestration looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;Orchestration test &lt;BR&gt;&amp;nbsp; Receive rcvMsg &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where ReportToAnalyst = True &lt;BR&gt;&amp;nbsp; end&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;&amp;nbsp; If "x&amp;gt;2" then &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transform trnsfrmMsg1 end &lt;BR&gt;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transform trnsfrmMsg2 end &lt;BR&gt;&amp;nbsp; end &lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; Send sndMsg end &lt;BR&gt;end&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;The above creates an Orchestration that receives a message, makes a decision which message transform to run and then sends the message.&amp;nbsp; Also notice some shapes can contain other shapes and you can set parameters on the Shapes (eg. "where ReportToAnalyst = True&lt;EM&gt;"). &lt;/EM&gt;The syntax for the DSL is very easy to understand, most people could figure out what the process was trying to accomplish simply by looking at the input file.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Next, I need to be able to parse the new syntax.&amp;nbsp; I did this using the “Oslo” SDK and creating a grammar.&amp;nbsp; Below is a screenshot of the “Oslo” Intellipad editor in tree mode.&amp;nbsp; On the left is my input text.&amp;nbsp; The center pane is my MGrammar and the right pane is the parse tree of the input file:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title=Intellipad border=0 alt=Intellipad src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/Intellipad_thumb.png" width=528 height=377 mce_src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/Intellipad_thumb.png"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now that we can parse the input using MGrammar, I needed a way to generate the ODX file.&amp;nbsp; To do this, I built a commandline compiler in C# that uses Oslo’s&amp;nbsp; System.Dataflow library that walks the parse tree and generates the correct XML for the ODX file.&amp;nbsp; The compiler creates an in memory object for each shape and sets the correct properties and relationships between the shapes.&amp;nbsp; Each shape object knows how to render itself in XML and also knows it’s child shapes.&amp;nbsp; Below is the output from running the compiler (for debug purposes, I display the Orchestration shapes and their child relationships):&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/compiler_2.png" mce_href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/compiler_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title=compiler border=0 alt=compiler src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/compiler_thumb.png" width=509 height=295 mce_src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/compiler_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Now that I have the Orchestration file, I can load up the ODX in BizTalk and check out what was generated.&amp;nbsp; I used an empty BizTalk project and “Add Existing Item…” to add the Orchestration to the project and load it up:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/BizTalk_2.png" mce_href="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/BizTalk_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title=BizTalk border=0 alt=BizTalk src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/BizTalk_thumb.png" width=568 height=413 mce_src="http://blogs.msdn.com/blogfiles/dkaufman/WindowsLiveWriter/ABizTalkDSLusingOslo_956D/BizTalk_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Notice it generated the Receive, Decision, Construct/Transform and Send shapes all based on our original input.&amp;nbsp; The Orchestration still needs to be completed by the developer (for example message types have not been set) but you can see how “Oslo” makes it so even a non-programmer could describe a process flow and have that generated into something executable.&lt;/P&gt;
&lt;P&gt;MGrammar makes it easy to create and modify the language.&amp;nbsp; For instance, I want to make the syntax even more non-programmer friendly.&amp;nbsp; One simple way could be to change the “end” token to a period.&amp;nbsp; The syntax to create a shape would change from:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Receive msg1 end&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;to&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Receive msg1.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The key is that I can make that modification to the language without changing the parse tree.&amp;nbsp; Using the Projections functionality of MGrammar, I can make changes and additions to my language without the need to make major changes (if any) to my compiler.&lt;/P&gt;
&lt;P&gt;As you can see, one of the benefits of the Oslo technology is that it can make software development and customization much more approachable.&amp;nbsp; I talk with many ISVs who are excited&amp;nbsp; about using “Oslo” as a way to help their end users and system integrators adapt and configure the ISV's out of the box software to run in customer environments. &lt;/P&gt;
&lt;P mce_keep="true"&gt;I encourage you to download the &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f2f4544c-626c-44a3-8866-b2a9fe078956&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f2f4544c-626c-44a3-8866-b2a9fe078956&amp;amp;displaylang=en"&gt;Microsoft "Oslo" SDK - January 2009 CTP&lt;/A&gt; and try it out yourself.&amp;nbsp; And check out the great content on the &lt;A href="http://msdn.microsoft.com/en-us/oslo/default.aspx" mce_href="http://msdn.microsoft.com/en-us/oslo/default.aspx"&gt;Oslo Developer Center&lt;/A&gt; to help you get up to speed.&amp;nbsp; Let me know your experiences and thoughts on how you might use “Oslo” with your software.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9455242" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Oslo/default.aspx">Oslo</category></item><item><title>Oslo, Dublin and PDC</title><link>http://blogs.msdn.com/dkaufman/archive/2008/10/09/oslo-dublin-and-pdc.aspx</link><pubDate>Thu, 09 Oct 2008 21:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8993117</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/8993117.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=8993117</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://www.microsoftpdc.com/" mce_href="http://www.microsoftpdc.com/"&gt;PDC&lt;/A&gt; is rapidly approaching and there is a lot of exciting technology that is being created by CSD which will be unveiled at the conference.&amp;nbsp; Steve Martin posted a blog entry last week about &lt;A href="http://blogs.msdn.com/stevemar/archive/2008/10/01/the-road-to-pdc-net-framework-4-0-and-dublin.aspx" mce_href="http://blogs.msdn.com/stevemar/archive/2008/10/01/the-road-to-pdc-net-framework-4-0-and-dublin.aspx"&gt;Dublin&lt;/A&gt;, a technology that makes it easier to deploy, manage and scale WF/WCF based applications.&amp;nbsp; Dublin should be of great interest to anyone building and deploying applications based on WF or WCF.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://douglaspurdy.com/2008/09/06/what-is-oslo/" mce_href="http://douglaspurdy.com/2008/09/06/what-is-oslo/"&gt;Doug Purdy&lt;/A&gt; and &lt;A href="http://www.pluralsight.com/community/blogs/dbox/archive/2008/09/06/oslo.aspx" mce_href="http://www.pluralsight.com/community/blogs/dbox/archive/2008/09/06/oslo.aspx"&gt;Don Box&lt;/A&gt; a few weeks ago posted additional information on Oslo.&amp;nbsp; Both Doug and Don will be &lt;A href="http://douglaspurdy.com/2008/09/14/the-hottest-talk-at-pdc/" mce_href="http://douglaspurdy.com/2008/09/14/the-hottest-talk-at-pdc/"&gt;speaking on Oslo at PDC&lt;/A&gt; and I encourage you to see their talks.&lt;/P&gt;
&lt;P&gt;These technologies coupled with the enhancements we are making to &lt;A href="http://blogs.msdn.com/kavitak/archive/2008/10/07/pdc-here-we-come.aspx" mce_href="http://blogs.msdn.com/kavitak/archive/2008/10/07/pdc-here-we-come.aspx"&gt;WF and WCF for .Net 4.0&lt;/A&gt; has really excited the ISVs I am engaged with.&amp;nbsp; The work we are doing holds the promise of making the ISV solutions much easier to develop, customize, deploy and maintain.&amp;nbsp; These technologies have the opportunity to be truly transformational.&lt;/P&gt;
&lt;P&gt;But if you want to find out more in the near term, you'll just have to go to PDC. &lt;A href="http://microsoftpdc.com/Registration/" mce_href="http://microsoftpdc.com/Registration/"&gt;Registration&lt;/A&gt; is still open.&amp;nbsp; The PDC folks have thoughtfully even posted a &lt;A href="http://microsoftpdc.com/Letter.aspx" mce_href="http://microsoftpdc.com/Letter.aspx"&gt;sample letter to your boss&lt;/A&gt; about why you can't miss PDC (if I haven't given you enough ammunition already).&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8993117" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Oslo/default.aspx">Oslo</category><category domain="http://blogs.msdn.com/dkaufman/archive/tags/Dublin/default.aspx">Dublin</category></item><item><title>BizTalk 2006 R3 - TAP Program Accepting Nominations</title><link>http://blogs.msdn.com/dkaufman/archive/2008/07/11/biztalk-2006-r3-tap-program-accepting-nominations.aspx</link><pubDate>Sat, 12 Jul 2008 00:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8722091</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/8722091.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=8722091</wfw:commentRss><description>&lt;P&gt;In April, Steve Martin announced that we are working on BizTalk 2006 R3.&amp;nbsp; Some of the new investments for this release include:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;New web service registry capabilities with support for UDDI (Universal Description Discovery and Integration) version 3.0 &lt;/LI&gt;
&lt;LI&gt;Enhanced service enablement of applications (through new and enhanced adapters for LOB applications, databases, and legacy/host systems) &lt;/LI&gt;
&lt;LI&gt;Enhanced service enablement of “edge” devices through BizTalk RFID Mobile &lt;/LI&gt;
&lt;LI&gt;Enhanced interoperability and connectivity support for B2B protocols (like SWIFT, EDI, etc) &lt;/LI&gt;
&lt;LI&gt;SOA patterns and best practices guidance to assist our customer’s implementations&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;BizTalk 2006 R3 will also add support for our latest wave of technology releases including Windows Server 2008, .NET Framework 3.5, Visual Studio 2008 and SQL Server 2008.&amp;nbsp; If you are interested in this new version, the BizTalk 2006 R3 TAP Program is still accepting nominations. &lt;BR&gt;&lt;BR&gt;If you&amp;nbsp;are interested in this program, please visit our Connect site to sign-up.&lt;/P&gt;
&lt;P&gt;TAP Sign-up Instructions:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Please log on to &lt;A class="" href="http://connect.microsoft.com/" mce_href="http://connect.microsoft.com/"&gt;Connect&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Under Categories select &lt;STRONG&gt;Server&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Look for &lt;STRONG&gt;BizTalk TAP Programs&lt;/STRONG&gt; and select the "apply" link next to &lt;STRONG&gt;BizTalk Server 2006 R3&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Download and complete the BizTalk Server 2006 R3 TAP Nomination form and click the select button&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8722091" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/BizTalk/default.aspx">BizTalk</category></item><item><title>BizTalk and Secure FTP</title><link>http://blogs.msdn.com/dkaufman/archive/2008/06/16/biztalk-and-secure-ftp.aspx</link><pubDate>Mon, 16 Jun 2008 23:40:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8607045</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/8607045.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=8607045</wfw:commentRss><description>&lt;p&gt;I saw a link the other day to an interesting project on &lt;a href="http://www.codeplex.com/"&gt;Codeplex&lt;/a&gt;.&amp;#160; Mikael H&amp;#229;kanssons has published a project called the &lt;a href="http://www.codeplex.com/SftpAdapter"&gt;BizTalk Sftp Adapter&lt;/a&gt;.&amp;#160; You can find out more information on his &lt;a href="http://blogical.se/blogs/mikael"&gt;blog&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;There is a lot of confusion about what is &amp;quot;Secure FTP&amp;quot;.&amp;#160; Most people don't realize that there are primarily two different ways of securing FTP.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;FTPS&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/File_Transfer_Protocol"&gt;FTP&lt;/a&gt; over &lt;a href="http://en.wikipedia.org/wiki/Transport_Layer_Security"&gt;SSL&lt;/a&gt; uses the SSL/TLS layer to encrypt the FTP traffic.&amp;#160; It is similar to HTTPS which web browsers use to secure HTTP.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/File_Transfer_Protocol#FTP_over_SSH"&gt;SFTP&lt;/a&gt; or FTP over &lt;a href="http://en.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt; tunnels FTP sessions over an SSH connection. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So next time you're asked about secure FTP, be sure to find out which one they are referring to.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8607045" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/BizTalk/default.aspx">BizTalk</category></item><item><title>Hosting Multiple Service Implementations On The Same Port With WCF</title><link>http://blogs.msdn.com/dkaufman/archive/2008/06/13/hosting-multiple-service-implementation-on-the-same-port-with-wcf.aspx</link><pubDate>Fri, 13 Jun 2008 22:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8594927</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/8594927.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=8594927</wfw:commentRss><description>&lt;P&gt;Recently I have been playing around with WCF and Visual Studio 2008.&amp;nbsp; I was building a set of web services.&amp;nbsp; The project consisted of two difference service interfaces (IServiceA and IServiceB) each with their own implementation class (ServiceA and ServiceB).&amp;nbsp; I wanted to host them on the same port:&lt;/P&gt;
&lt;P&gt;http://localhost:8080/ServiceA&lt;/P&gt;
&lt;P&gt;http://localhost:8080/ServiceB&lt;/P&gt;
&lt;P&gt;I searched for an example of how to do this but came up empty.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The problem is that when creating a new ServiceHost() you need to pass it a reference to the implementation class.&amp;nbsp; You could then add a service endpoint for each of the services using&amp;nbsp; AddServiceEndpoint(), passing in the interface for the respective service, but those are tied to the same single implementation class set when creating the ServiceHost().&amp;nbsp; To get around this, you could create a facade class that combines both implementations, but that seems kind of messy if you have lots of interfaces.&lt;/P&gt;
&lt;P&gt;Another option is to create multiple service hosts.&amp;nbsp; One for each of the service implementations.&amp;nbsp; When doing this, you need to make sure not to set the BaseAddress Uri.&amp;nbsp; If you do, each ServiceHost has the same base address and an exception is thrown.&amp;nbsp; I got around this by not including a base URI when creating the service host and then specifying the full URI when adding the service endpoints.&amp;nbsp; This might not be the most ideal solution (for one thing, hardcoding the URI in the code is less than optimal, using the config file is the better way to go) but it worked for my simple project.&lt;/P&gt;
&lt;P&gt;The code for creating the ServiceHost from my simple console application is listed below:&lt;/P&gt;&lt;PRE class=csharpcode&gt;            Type serviceAServiceType = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(ServiceA);
            Type serviceAContractType = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IServiceA);

            Type serviceBServiceType = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(ServiceB);
            Type serviceBContractType = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(IServiceB);

            ServiceHost serviceAHost = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ServiceHost(serviceAServiceType);
            ServiceHost serviceBHost = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ServiceHost(serviceBServiceType);

            &lt;SPAN class=rem&gt;// Add behavior for Services - enable WSDL access&lt;/SPAN&gt;
            ServiceMetadataBehavior serviceABehavior = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ServiceMetadataBehavior();
            serviceABehavior.HttpGetEnabled = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
            serviceABehavior.HttpGetUrl = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Uri(&lt;SPAN class=str&gt;"http://localhost:8080/ServiceA"&lt;/SPAN&gt;);
            serviceAHost.Description.Behaviors.Add(serviceABehavior);

            ServiceMetadataBehavior serviceBBehavior = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ServiceMetadataBehavior();
            serviceBBehavior.HttpGetEnabled = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
            serviceBBehavior.HttpGetUrl = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Uri(&lt;SPAN class=str&gt;"http://localhost:8080/ServiceB"&lt;/SPAN&gt;);
            serviceBHost.Description.Behaviors.Add(serviceBBehavior);

            &lt;SPAN class=rem&gt;// Create basicHttpBinding endpoint at http://localhost:8080/ServiceA/  &lt;/SPAN&gt;
            serviceAHost.AddServiceEndpoint(serviceAContractType, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; BasicHttpBinding(), &lt;BR&gt;              &lt;SPAN class=str&gt;"http://localhost:8080/ServiceA"&lt;/SPAN&gt;);
            &lt;SPAN class=rem&gt;// Create basicHttpBinding endpoint at http://localhost:8080/ServiceB/  &lt;/SPAN&gt;
            serviceBHost.AddServiceEndpoint(serviceBContractType, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; BasicHttpBinding(), &lt;BR&gt;              &lt;SPAN class=str&gt;"http://localhost:8080/ServiceB"&lt;/SPAN&gt;);

            serviceAHost.Open();
            serviceBHost.Open();

            Console.WriteLine(&lt;SPAN class=str&gt;"Service is ready, press any key to terminate."&lt;/SPAN&gt;);
            Console.ReadKey();&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
         overflow: auto
	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;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8594927" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/WCF/default.aspx">WCF</category></item><item><title>The Journey Begins</title><link>http://blogs.msdn.com/dkaufman/archive/2008/06/13/the-journey-begins.aspx</link><pubDate>Fri, 13 Jun 2008 20:48:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8594811</guid><dc:creator>dskaufman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dkaufman/comments/8594811.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dkaufman/commentrss.aspx?PostID=8594811</wfw:commentRss><description>&lt;p&gt;Welcome to the new blog.&amp;#160; My name is Dana Kaufman and I am a Program Manager in the Connected Systems Division working with the ISV eco-system around our SOA products.&amp;#160; Some of my interests include BizTalk, WF/WCF and of course &lt;a href="http://www.microsoft.com/soa/products/oslo.aspx"&gt;Oslo&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I have been in Redmond a little over a year and will use this blog to post interesting items I run across in my journey at Microsoft.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8594811" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dkaufman/archive/tags/General/default.aspx">General</category></item></channel></rss>