Advertisement
altair

EdmxResource.tt

Jun 23rd, 2011
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.09 KB | None | 0 0
  1. <#@ template language="C#" debug="false" hostspecific="true" #><#@ output extension=".resx" #><#@ include file="EF.Utility.CS.ttinclude"#><#
  2. const string MODEL_FILE_NAME = @"..\Libricola.edmx";
  3.  
  4. MetadataLoader loader = new MetadataLoader(this);
  5. EdmItemCollection items = loader.CreateEdmItemCollection(MODEL_FILE_NAME);
  6. CreateResxFile(items);
  7. #>
  8. <#+
  9. void CreateResxFile(EdmItemCollection items) {
  10.     // Write XML and RESX header
  11.     this.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
  12.     this.WriteLine("<root>");
  13.     WriteResourceHeader();
  14.    
  15.     // Process all entities
  16.     foreach (EntityType entity in items.GetItems<EntityType>().OrderBy(e => e.Name)) {
  17.         // Process common properties
  18.         foreach (EdmMember property in entity.Properties.Where(p => p.DeclaringType == entity)) {
  19.             if(property.Name.EndsWith("Id", StringComparison.Ordinal)) continue;
  20.             ProcessResxProperty(property);
  21.         }
  22.        
  23.         // Process navigation properties
  24.         foreach (EdmMember property in entity.NavigationProperties.Where(np => np.DeclaringType == entity)) {
  25.             ProcessResxProperty(property);
  26.         }
  27.     }
  28.    
  29.     // Write RESX footer
  30.     this.WriteLine("</root>");
  31. }
  32.  
  33. void ProcessResxProperty(EdmMember property) {
  34.     const string ATR_NAME = "<data name=\"{0}_{1}_Name\"><value xml:space=\"preserve\">{2}</value><comment>(generated from model)</comment></data>";                                                // DisplayAttribute.Name
  35.     const string ATR_DESCRIPTION = "<data name=\"{0}_{1}_Description\"><value xml:space=\"preserve\">{2}</value><comment>(generated from model)</comment></data>";                                  // DisplayAttribute.Name
  36.     const string ATR_REQUIRED = "<data name=\"{0}_{1}_Required\"><value xml:space=\"preserve\">{{0}} is missing.</value><comment>(generated from model)</comment></data>";                      // RequiredAttribute.ErrorMessage
  37.     const string ATR_STRLENGTH_MAX = "<data name=\"{0}_{1}_StrLength\"><value xml:space=\"preserve\">{{0}} is longer than {{1}} characters.</value><comment>(generated from model)</comment></data>";   // StringLengthAttribute.ErrorMessage
  38.     const string ATR_STRLENGTH_FIX = "<data name=\"{0}_{1}_StrLength\"><value xml:space=\"preserve\">{{0}} is not {{1}} characters long.</value><comment>(generated from model)</comment></data>";      // StringLengthAttribute.ErrorMessage
  39.  
  40.     // Ignore primary keys
  41.     EdmProperty p = property as EdmProperty;
  42.     if(p != null){
  43.         MetadataTools ef = new MetadataTools(this);
  44.         if(ef.IsKey(p)) return;
  45.     }
  46.    
  47.     // Get display name
  48.     string displayName;
  49.     if(property.Documentation == null || string.IsNullOrWhiteSpace(property.Documentation.Summary)) displayName = FormatPropertyName(property.Name);
  50.     else displayName = property.Documentation.Summary;
  51.    
  52.     // Get description
  53.     string description = null;
  54.     if(property.Documentation != null && !string.IsNullOrWhiteSpace(property.Documentation.LongDescription)) description = property.Documentation.LongDescription;
  55.    
  56.     // DisplayAttribute
  57.     this.WriteLine(ATR_NAME,
  58.         property.DeclaringType.Name,
  59.         property.Name,
  60.         displayName);
  61.     if(!string.IsNullOrWhiteSpace(description)) {
  62.         this.WriteLine(ATR_DESCRIPTION,
  63.             property.DeclaringType.Name,
  64.             property.Name,
  65.             description);
  66.     }
  67.            
  68.     // RequiredAttribute
  69.     if(!GetFacetValue(property.TypeUsage.Facets.SingleOrDefault(f=>f.Name.Equals("Nullable")), false)) {
  70.         this.WriteLine(ATR_REQUIRED,
  71.             property.DeclaringType.Name,
  72.             property.Name,
  73.             displayName);
  74.     }
  75.  
  76.     // Type-specific attributes
  77.     if(property.TypeUsage.EdmType is PrimitiveType) {
  78.         switch (((PrimitiveType)property.TypeUsage.EdmType).PrimitiveTypeKind) {
  79.             case PrimitiveTypeKind.String:
  80.                 // StringLengthAttribute
  81.                 var maxLength = GetFacetValue(property.TypeUsage.Facets.SingleOrDefault(f=>f.Name.Equals("MaxLength")), int.MaxValue);
  82.                 if(maxLength != int.MaxValue) {
  83.                     var fixedLength= GetFacetValue(property.TypeUsage.Facets.SingleOrDefault(f=>f.Name.Equals("FixedLength")), false);
  84.                     if(fixedLength) {
  85.                         this.WriteLine(ATR_STRLENGTH_FIX,
  86.                             property.DeclaringType.Name,
  87.                             property.Name,
  88.                             displayName,
  89.                             maxLength);
  90.                     } else {
  91.                         this.WriteLine(ATR_STRLENGTH_MAX,
  92.                             property.DeclaringType.Name,
  93.                             property.Name,
  94.                             displayName,
  95.                             maxLength);
  96.                     }
  97.                 }
  98.                 break;
  99.             case PrimitiveTypeKind.DateTime:
  100.             case PrimitiveTypeKind.DateTimeOffset:
  101.             case PrimitiveTypeKind.Time:
  102.             case PrimitiveTypeKind.Binary:
  103.             case PrimitiveTypeKind.Boolean:
  104.             case PrimitiveTypeKind.Byte:
  105.             case PrimitiveTypeKind.Decimal:
  106.             case PrimitiveTypeKind.Double:
  107.             case PrimitiveTypeKind.Guid:
  108.             case PrimitiveTypeKind.Int16:
  109.             case PrimitiveTypeKind.Int32:
  110.             case PrimitiveTypeKind.Int64:
  111.             case PrimitiveTypeKind.SByte:
  112.             case PrimitiveTypeKind.Single:
  113.             default:
  114.                 break;
  115.         }
  116.     }
  117. }
  118.  
  119. string FormatPropertyName(string propertyName) {
  120.     var uppercaseWords = new string[] { "ID", "XML" };
  121.     var lastWasUpperCase = false;
  122.     var words = new List<string>();
  123.     var word = string.Empty;
  124.     for (int i = 0; i < propertyName.Length; i++) {
  125.         if(Char.IsUpper(propertyName[i])) {
  126.             if(!lastWasUpperCase && i > 0) {
  127.                 if(uppercaseWords.Contains(word,  StringComparer.CurrentCultureIgnoreCase)) word = word.ToUpper();
  128.                 words.Add(word);
  129.                 word = string.Empty;
  130.             }
  131.             lastWasUpperCase = true;
  132.         } else {
  133.             lastWasUpperCase = false;
  134.         }
  135.         word += propertyName[i];
  136.     }
  137.     if(uppercaseWords.Contains(word,  StringComparer.CurrentCultureIgnoreCase)) word = word.ToUpper();
  138.     words.Add(word);
  139.     return string.Join(" ", words.ToArray());
  140. }
  141.  
  142. T GetFacetValue<T>(Facet f, T defaultValue) {
  143.     if (f == null) return defaultValue;
  144.     try {          
  145.         return (T)f.Value;         
  146.     } catch {
  147.         return defaultValue;
  148.     }
  149. }
  150.  
  151. void WriteResourceHeader(){
  152.     #>
  153.     <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  154.         <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
  155.         <xsd:element name="root" msdata:IsDataSet="true">
  156.             <xsd:complexType>
  157.                 <xsd:choice maxOccurs="unbounded">
  158.                     <xsd:element name="metadata">
  159.                         <xsd:complexType>
  160.                             <xsd:sequence>
  161.                                 <xsd:element name="value" type="xsd:string" minOccurs="0" />
  162.                             </xsd:sequence>
  163.                             <xsd:attribute name="name" use="required" type="xsd:string" />
  164.                             <xsd:attribute name="type" type="xsd:string" />
  165.                             <xsd:attribute name="mimetype" type="xsd:string" />
  166.                             <xsd:attribute ref="xml:space" />
  167.                         </xsd:complexType>
  168.                     </xsd:element>
  169.                     <xsd:element name="assembly">
  170.                         <xsd:complexType>
  171.                             <xsd:attribute name="alias" type="xsd:string" />
  172.                             <xsd:attribute name="name" type="xsd:string" />
  173.                         </xsd:complexType>
  174.                     </xsd:element>
  175.                     <xsd:element name="data">
  176.                         <xsd:complexType>
  177.                             <xsd:sequence>
  178.                                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
  179.                                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
  180.                             </xsd:sequence>
  181.                             <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
  182.                             <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
  183.                             <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
  184.                             <xsd:attribute ref="xml:space" />
  185.                         </xsd:complexType>
  186.                     </xsd:element>
  187.                     <xsd:element name="resheader">
  188.                         <xsd:complexType>
  189.                             <xsd:sequence>
  190.                                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
  191.                             </xsd:sequence>
  192.                             <xsd:attribute name="name" type="xsd:string" use="required" />
  193.                         </xsd:complexType>
  194.                     </xsd:element>
  195.                 </xsd:choice>
  196.             </xsd:complexType>
  197.         </xsd:element>
  198.     </xsd:schema>
  199.     <resheader name="resmimetype">
  200.         <value>text/microsoft-resx</value>
  201.     </resheader>
  202.     <resheader name="version">
  203.         <value>2.0</value>
  204.     </resheader>
  205.     <resheader name="reader">
  206.         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  207.     </resheader>
  208.     <resheader name="writer">
  209.         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  210.     </resheader>
  211. <#+ } #>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement