PageRenderTime 58ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/XObjects/Cmdline/XObjectsGenerator.cs

https://bitbucket.org/hma2/sdmxsource.net
C# | 277 lines | 254 code | 16 blank | 7 comment | 41 complexity | f3d73c3da3b8336e6d0668e493de9e32 MD5 | raw file
  1. //Copyright (c) Microsoft Corporation. All rights reserved.
  2. using System;
  3. using System.Xml;
  4. using System.Xml.Schema;
  5. using System.Xml.Linq;
  6. using System.CodeDom;
  7. using System.CodeDom.Compiler;
  8. using Xml.Schema.Linq;
  9. using Xml.Schema.Linq.CodeGen;
  10. using System.IO;
  11. using System.Globalization;
  12. using Microsoft.CSharp;
  13. using System.Reflection;
  14. namespace XObjectsGenerator
  15. {
  16. using System.Linq;
  17. public class XObjectsGenerator
  18. {
  19. public static Assembly ThisAssembly;
  20. public static int Main(string[] args)
  21. {
  22. ThisAssembly = Assembly.GetExecutingAssembly();
  23. var set = new XmlSchemaSet();
  24. var veh = new ValidationEventHandler(ValidationCallback);
  25. set.ValidationEventHandler += veh;
  26. string csFileName = string.Empty;
  27. string configFileName = null;
  28. string assemblyName = string.Empty;
  29. bool fSourceNameProvided = false;
  30. bool xmlSerializable = false;
  31. bool nameMangler2 = false;
  32. if (args.Length == 0)
  33. {
  34. PrintHelp();
  35. return 0;
  36. }
  37. for (int i = 0; i < args.Length; i++)
  38. {
  39. string arg = args[i];
  40. string value = string.Empty;
  41. bool argument = false;
  42. if (arg.StartsWith("/") || arg.StartsWith("-"))
  43. {
  44. argument = true;
  45. int colonPos = arg.IndexOf(":");
  46. if (colonPos != -1)
  47. {
  48. value = arg.Substring(colonPos + 1);
  49. arg = arg.Substring(0, colonPos);
  50. }
  51. }
  52. arg = arg.ToLower(CultureInfo.InvariantCulture);
  53. if (!argument)
  54. {
  55. try
  56. {
  57. set.Add(null, CreateReader(arg));
  58. }
  59. catch(Exception e)
  60. {
  61. PrintErrorMessage(e.ToString());
  62. return 1;
  63. }
  64. if (csFileName == string.Empty)
  65. {
  66. csFileName = Path.ChangeExtension(arg, "cs");
  67. }
  68. }
  69. else if (ArgumentMatch(arg, "?") || ArgumentMatch(arg, "help"))
  70. {
  71. PrintHelp();
  72. return 0;
  73. }
  74. else if (ArgumentMatch(arg, "config"))
  75. {
  76. configFileName = value;
  77. }
  78. else if (ArgumentMatch(arg, "filename"))
  79. {
  80. csFileName = value;
  81. fSourceNameProvided = true;
  82. }
  83. else if (ArgumentMatch(arg, "enableservicereference"))
  84. {
  85. xmlSerializable = true;
  86. }
  87. else if (ArgumentMatch(arg, "lib"))
  88. {
  89. assemblyName = value;
  90. }
  91. else if (ArgumentMatch(arg, "namemangler2"))
  92. {
  93. nameMangler2 = true;
  94. }
  95. }
  96. if(assemblyName != string.Empty && !fSourceNameProvided)
  97. {
  98. //only generate assembly
  99. csFileName = string.Empty;
  100. }
  101. set.Compile();
  102. set.ValidationEventHandler -= veh;
  103. if (set.Count > 0 && set.IsCompiled)
  104. {
  105. /*
  106. GenerateXObjects(
  107. set, csFileName, configFileName, assemblyName, xmlSerializable, nameMangler2);
  108. */
  109. try
  110. {
  111. GenerateXObjects(
  112. set,
  113. csFileName,
  114. configFileName,
  115. assemblyName,
  116. xmlSerializable,
  117. nameMangler2);
  118. }
  119. catch(Exception e)
  120. {
  121. PrintErrorMessage(e.ToString());
  122. return 1;
  123. }
  124. }
  125. return 0;
  126. }
  127. public static void GenerateXObjects(
  128. XmlSchemaSet set,
  129. string csFileName,
  130. string configFileName,
  131. string assemblyName,
  132. bool xmlSerializable,
  133. bool nameMangler2)
  134. {
  135. var configSettings = new LinqToXsdSettings(nameMangler2);
  136. if (configFileName != null)
  137. {
  138. configSettings.Load(configFileName);
  139. }
  140. configSettings.EnableServiceReference = xmlSerializable;
  141. var xsdConverter = new XsdToTypesConverter(configSettings);
  142. var mapping = xsdConverter.GenerateMapping(set);
  143. var codeGenerator = new CodeDomTypesGenerator(configSettings);
  144. var ccu = new CodeCompileUnit();
  145. foreach(var codeNs in codeGenerator.GenerateTypes(mapping))
  146. {
  147. ccu.Namespaces.Add(codeNs);
  148. }
  149. //Write to file
  150. var provider = new CSharpCodeProvider();
  151. if (csFileName != string.Empty && csFileName != null)
  152. {
  153. using (var update =
  154. new Update(csFileName, System.Text.Encoding.UTF8))
  155. {
  156. provider.GenerateCodeFromCompileUnit(
  157. ccu, update.Writer, new CodeGeneratorOptions());
  158. }
  159. PrintMessage(csFileName);
  160. }
  161. if(assemblyName != string.Empty)
  162. {
  163. var options = new CompilerParameters
  164. {
  165. OutputAssembly = assemblyName,
  166. IncludeDebugInformation = true,
  167. TreatWarningsAsErrors = true,
  168. };
  169. options.TempFiles.KeepFiles = true;
  170. {
  171. var r = options.ReferencedAssemblies;
  172. r.Add("System.dll");
  173. r.Add("System.Core.dll");
  174. r.Add("System.Xml.dll");
  175. r.Add("System.Xml.Linq.dll");
  176. r.Add("Xml.Schema.Linq.dll");
  177. }
  178. var results = provider.CompileAssemblyFromDom(options, ccu);
  179. if (results.Errors.Count > 0)
  180. {
  181. PrintErrorMessage("compilation error(s): ");
  182. for (int i = 0; i < results.Errors.Count; i++)
  183. {
  184. PrintErrorMessage(results.Errors[i].ToString());
  185. }
  186. throw new Exception("compilation error(s)");
  187. }
  188. else
  189. {
  190. PrintMessage(
  191. "Generated Assembly: " +
  192. results.CompiledAssembly.ToString());
  193. }
  194. }
  195. }
  196. private static XmlReader CreateReader(string xsdFile)
  197. {
  198. return XmlReader.Create(
  199. xsdFile,
  200. new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse });
  201. }
  202. private static void PrintMessage(string csFileName)
  203. {
  204. PrintHeader();
  205. Console.WriteLine("Generated " + csFileName + "...");
  206. }
  207. private static void PrintErrorMessage(String e)
  208. {
  209. Console.Error.WriteLine("LinqToXsd: error TX0001: {0}", e);
  210. }
  211. private static void PrintErrorMessage(ValidationEventArgs args)
  212. {
  213. Console.Error.WriteLine(
  214. "{0}({1},{2}): {3} TX0001: {4}",
  215. args.Exception.SourceUri.
  216. Replace("file:///", "").Replace('/', '\\'),
  217. args.Exception.LineNumber,
  218. args.Exception.LinePosition,
  219. args.Severity == XmlSeverityType.Warning ? "warning" : "error",
  220. args.Message);
  221. }
  222. private static void PrintHeader()
  223. {
  224. Console.WriteLine(
  225. String.Format(
  226. CultureInfo.CurrentCulture,
  227. "[Microsoft (R) .NET Framework, Version {0}]",
  228. ThisAssembly.ImageRuntimeVersion));
  229. }
  230. private static void PrintHelp()
  231. {
  232. PrintHeader();
  233. string name = ThisAssembly.GetName().Name;
  234. Console.WriteLine();
  235. Console.WriteLine(
  236. name +
  237. " - " +
  238. "Utility to generate typed wrapper classes from a XML Schema");
  239. Console.WriteLine(
  240. "Usage: " +
  241. name +
  242. " <schemaFile> [one or more schema files] [/fileName:<csFileName>.cs] [/lib:<assemblyName>] [/config:<configFileName>.xml] [/enableServiceReference] [/nameMangler2]");
  243. }
  244. private static void ValidationCallback(
  245. object sender, ValidationEventArgs args)
  246. {
  247. PrintErrorMessage(args);
  248. }
  249. private static bool ArgumentMatch(string arg, string toMatch)
  250. {
  251. switch (arg[0])
  252. {
  253. case '/':
  254. case '-':
  255. return arg.Substring(1) == toMatch;
  256. default:
  257. return false;
  258. }
  259. }
  260. }
  261. }