Home > Ask the Microsoft .Net Development Experts > Visual Studio .NET Questions & Answers > Load a DSL domain model instance file programmatically
Ask The Win Development Expert: Questions & Answers
EMAIL THIS

Load a DSL domain model instance file programmatically

Daniel Cazzulino EXPERT RESPONSE FROM: Daniel Cazzulino

Pose a Question
Other Win Development Categories
Meet all Win Development Experts
Become an Expert for this site


Digg This!    StumbleUpon Toolbar StumbleUpon    Bookmark with Delicious Del.icio.us   


>
QUESTION POSED ON: 09 March 2006
A lot of people now find themselves working with DSL (domain specific language) model instances. Is there a way to load these files programmatically?


Digg This!    StumbleUpon Toolbar StumbleUpon    Bookmark with Delicious Del.icio.us   



RELATED CONTENT
Visual Studio .NET
Best approach for merging text files using arrays
Descriptions of symbols in the class view of a .NET solution
What's the best approach for enumerating network resources?
How to enable a line-by-line code walkthrough
Changing a C++ Makefile project to a Utility project
How can I configure Visual Studio.NET 2002 to use the .NET Framework 1.1?
Changing a datagrid column to read-only=false based on variable
Resizing controls on a form
No extensibility folders
Can I use VS.NET on a server that's not upgraded to .NET Framework?

Visual Studio .NET
Calling via command prompt from ASP.NET
On line-by-line analysis in VS .NET
Best approach for merging text files using arrays
Descriptions of symbols in the class view of a .NET solution
What's the best approach for enumerating network resources?
How to enable a line-by-line code walkthrough
Changing a C++ Makefile project to a Utility project
How can I configure Visual Studio.NET 2002 to use the .NET Framework 1.1?
Changing a datagrid column to read-only=false based on variable
Resizing controls on a form

RELATED RESOURCES
2020software.com, trial software downloads for accounting software, ERP software, CRM software and business software systems
Search Bitpipe.com for the latest white papers and business webcasts
Whatis.com, the online computer dictionary


Say you have a custom DSL file in a solution. Say you want to process the model on that file using GAT or an AddIn or even your custom application code at runtime. You need to deserialize that XML (yes, it's all XML in the end) into an instance of your domain model (root).

You will need two pieces of information: the .NET type of the domain model (that is, the parent of your domain model root concept) and its the corresponding designer. The following code does the trick, allowing you to deserialize a model and return the first instance of the given domain model type (i.e. the model root):

public static TRootConcept GetModelRoot(string modelFile, Type modelType, Type designerType)
{
 // Create a new store to deserialize the instance to.
 Store newStore = new Store();
 Type[] metaTypes = new Type[] {
  typeof(Microsoft.VisualStudio.Modeling.Diagrams.CoreDesignSurface),
  typeof(Microsoft.VisualStudio.Modeling.Utilities.UtilitiesModel),
  modelType,
  designerType };

 // Load these types into the store, so that it knows about them for deserialization.
 newStore.LoadMetaModels(metaTypes);

 foreach (Type subStoreType in metaTypes)
 {
  // TODO: this will not be required in RC+ versions of DSL tools.
  Activator.CreateInstance(subStoreType, newStore);
 }

 // Be version resilient
 int majorVersion;
 int minorVersion;
 GetModelVersion(modelFile, out majorVersion, out minorVersion);

 // Deserialize the file into the store
 using (Stream fileStream = File.OpenRead(modelFile))
 {
  XmlSerialization.DeserializeStore(newStore, fileStream, majorVersion, minorVersion, null, null);
 }

 // Locate the attribute that will give you the Guid of the element to find
 MetaObjectAttribute metaObject = Generics.GetCustomAttribute(typeof(TRootConcept));
 if (metaObject == null)
 {
  throw new ArgumentException(String.Format(
   CultureInfo.CurrentCulture,
   Properties.Resources.MetaInformationForElementNotFound,
   elementType));
 }

 // Return the first one we find
 foreach (object element in newStore.ElementDirectory.GetElements(metaObject.Id))
 {
  return element;
 }
 return null;
}

The GetModelVersion helper method simply reads the major/minor values from the XML itself:

private static void GetModelVersion(string modelFile, out int majorVersion, out int minorVersion)
{
 // Get versions from model:
 //<om:MetaModel MajorVersion="1" MinorVersion="1" xmlns:om="http://Microsoft.VisualStudio.Modeling">
 using (XmlReader reader = XmlReader.Create(modelFile))
 {
  reader.MoveToContent();
  if (reader.LocalName != "MetaModel")
  {
   throw new InvalidOperationException(Properties.Resources.FileDoesNotContainModel);
  }
  majorVersion = Int32.Parse(reader.GetAttribute("MajorVersion"), CultureInfo.CurrentCulture);
  minorVersion = Int32.Parse(reader.GetAttribute("MinorVersion"), CultureInfo.CurrentCulture);
 }
}

This expert response originally appeared on Daniel Cazzulino's blog.


Do you have comments on this Ask the Expert question and response? Let us know.




Search and Browse the Expert Answer Center
Search and browse more than 25,000 question and answer pairs from more than 250 TechTarget industry experts.
Browse our Expert Advice



Windows Development - White Papers, News and Expert Advice
About Us  |  Contact Us  |  For Advertisers  |  For Business Partners  |  Site Index  |  RSS
SEARCH 
TechTarget provides technology professionals with the information they need to perform their jobs - from developing strategy, to making cost-effective purchase decisions and managing their organizations' technology projects - with its network of technology-specific websites, events and online magazines.

TechTarget Corporate Web Site  |  Media Kits  |  Site Map




All Rights Reserved, Copyright 2000 - 2009, TechTarget | Read our Privacy Policy
  TechTarget - The IT Media ROI Experts