PageRenderTime 50ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/Xsd2Code/Branches/V3.5/Xsd2Code.Console/EntryPoint.cs

#
C# | 428 lines | 344 code | 51 blank | 33 comment | 31 complexity | 65c85d74456f702966c2c26774a35f0f MD5 | raw file
Possible License(s): LGPL-2.1
  1. using System;
  2. using System.IO;
  3. using System.Reflection;
  4. using Xsd2Code.Library;
  5. using Xsd2Code.Library.Helpers;
  6. using Xsd2Code.Properties;
  7. namespace Xsd2Code
  8. {
  9. /// <summary>
  10. /// Entry point class
  11. /// </summary>
  12. /// <remarks>
  13. /// Revision history:
  14. ///
  15. /// Modified 2009-02-20 by Ruslan Urban
  16. /// Changed parsing of command-line arguments
  17. ///
  18. /// Modified 2009-03-12 By Ruslan Urban
  19. /// Enabled GenerateDataContracts option
  20. ///
  21. /// </remarks>
  22. internal class EntryPoint
  23. {
  24. [STAThread]
  25. static private void Main(string[] args)
  26. {
  27. // Display hekp when no parameters have been specified
  28. if (args.Length < 1)
  29. {
  30. DisplayApplicationInfo();
  31. DisplayHelp();
  32. return;
  33. }
  34. DisplayApplicationInfo();
  35. // Create new instance of GeneratorParams, which contains all generation parameters
  36. var xsdFilePath = args[0];
  37. var generatorParams = new GeneratorParams { InputFilePath = xsdFilePath };
  38. // When only the XSD file name is specified,
  39. // try to locate generated Designer file and load output parameters from the file header
  40. if (args.Length == 1)
  41. {
  42. string outputFilePath;
  43. var tempGeneratorParams = GeneratorParams.LoadFromFile(xsdFilePath, out outputFilePath);
  44. if (tempGeneratorParams != null)
  45. {
  46. generatorParams = tempGeneratorParams;
  47. generatorParams.InputFilePath = xsdFilePath;
  48. if (!string.IsNullOrEmpty(outputFilePath))
  49. generatorParams.OutputFilePath = outputFilePath;
  50. }
  51. }
  52. // Second command-line parameter that is not a switch is the generated code namespace
  53. if (args.Length > 1 && !args[1].StartsWith("/"))
  54. {
  55. generatorParams.NameSpace = args[1];
  56. // Third command-line parameter that is not a switch is the generated code namespace
  57. if (args.Length > 2 && !args[2].StartsWith("/"))
  58. generatorParams.OutputFilePath = args[2];
  59. }
  60. // Process command-line parameter switches
  61. for (int i = 1; i < args.Length; i++)
  62. {
  63. switch (args[i].Trim().ToLower())
  64. {
  65. case "/n":
  66. case "/ns":
  67. case "/namespace":
  68. if (i < args.Length - 1)
  69. {
  70. generatorParams.NameSpace = args[i + 1];
  71. i++;
  72. }
  73. break;
  74. case "/o":
  75. case "/out":
  76. case "/output":
  77. if (i < args.Length - 1)
  78. {
  79. generatorParams.OutputFilePath = args[i + 1];
  80. i++;
  81. }
  82. break;
  83. case "/l":
  84. case "/lang":
  85. case "/language":
  86. if (i < args.Length - 1)
  87. {
  88. generatorParams.Language = Utility.GetGenerationLanguage(args[i + 1]);
  89. i++;
  90. }
  91. break;
  92. case "/c":
  93. case "/col":
  94. case "/collection":
  95. case "/collectionbase":
  96. if (i < args.Length - 1)
  97. {
  98. string[] argParts = args[i + 1].Split(',');
  99. i++;
  100. if (argParts.Length >= 1)
  101. {
  102. var collectionObjectType = Utility.ToEnum<CollectionType>(argParts[0]);
  103. if (collectionObjectType == CollectionType.DefinedType)
  104. {
  105. if (argParts.Length == 2)
  106. {
  107. generatorParams.CollectionObjectType = collectionObjectType;
  108. generatorParams.CollectionBase = argParts[1];
  109. }
  110. else
  111. {
  112. Console.WriteLine("Warning: Malformed /c /collection command line switch - Custom collection type not specified.");
  113. }
  114. }
  115. else
  116. {
  117. generatorParams.CollectionObjectType = collectionObjectType;
  118. }
  119. }
  120. }
  121. break;
  122. //Duplicate with /pl
  123. case "/cb":
  124. case "/codebase":
  125. if (i < args.Length - 1)
  126. {
  127. Console.WriteLine("Warning: /cb /codebase is obsolete please use /pl[atform] <Platform> - Generated code target platform (Net20|Net30|Net35|Silverlight20). Default: Net20");
  128. generatorParams.TargetFramework = Utility.ToEnum<TargetFramework>(args[i + 1]);
  129. i++;
  130. }
  131. break;
  132. case "/cu":
  133. case "/customusings":
  134. if (i < args.Length - 1)
  135. {
  136. //generatorParams.CustomUsingsString = args[i + 1];
  137. foreach (string item in args[i + 1].Split(','))
  138. {
  139. generatorParams.CustomUsings.Add(new NamespaceParam { NameSpace = item });
  140. }
  141. i++;
  142. }
  143. break;
  144. case "/lf":
  145. case "/lfm":
  146. if (i < args.Length - 1)
  147. {
  148. generatorParams.Serialization.LoadFromFileMethodName = args[i + 1];
  149. i++;
  150. }
  151. break;
  152. case "/sm":
  153. if (i < args.Length - 1)
  154. {
  155. generatorParams.Serialization.SerializeMethodName = args[i + 1];
  156. i++;
  157. }
  158. break;
  159. case "/sf":
  160. case "/sfm":
  161. if (i < args.Length - 1)
  162. {
  163. generatorParams.Serialization.SaveToFileMethodName = args[i + 1];
  164. i++;
  165. }
  166. break;
  167. case "/p":
  168. case "/pl":
  169. case "/tp":
  170. case "/tpl":
  171. case "/platform":
  172. if (i < args.Length - 1)
  173. {
  174. generatorParams.TargetFramework = Utility.GetTargetPlatform(args[i + 1]);
  175. i++;
  176. }
  177. break;
  178. case "/u":
  179. case "/us":
  180. case "/using":
  181. if (i < args.Length - 1)
  182. {
  183. var nsList = args[i + 1].Split(',');
  184. foreach (var ns in nsList)
  185. generatorParams.CustomUsings.Add(new NamespaceParam { NameSpace = ns });
  186. i++;
  187. }
  188. break;
  189. case "/dbg":
  190. case "/dbg+":
  191. case "/debug":
  192. case "/debug+":
  193. generatorParams.Miscellaneous.DisableDebug = false;
  194. break;
  195. case "/dbg-":
  196. case "/debug-":
  197. generatorParams.Miscellaneous.DisableDebug = true;
  198. break;
  199. case "/db":
  200. case "/db+":
  201. generatorParams.EnableDataBinding = true;
  202. break;
  203. case "/db-":
  204. generatorParams.EnableDataBinding = false;
  205. break;
  206. case "/dc":
  207. case "/dc+":
  208. generatorParams.GenerateDataContracts = true;
  209. break;
  210. case "/dc-":
  211. generatorParams.GenerateDataContracts = false;
  212. break;
  213. case "/ap":
  214. case "/ap+":
  215. generatorParams.PropertyParams.AutomaticProperties = true;
  216. break;
  217. case "/ap-":
  218. generatorParams.PropertyParams.AutomaticProperties = false;
  219. break;
  220. case "/if":
  221. case "/if+":
  222. generatorParams.InitializeFields = InitializeFieldsType.All;
  223. break;
  224. case "/if-":
  225. generatorParams.InitializeFields = InitializeFieldsType.None;
  226. break;
  227. case "/eit":
  228. case "/eit+":
  229. generatorParams.Miscellaneous.ExcludeIncludedTypes = true;
  230. break;
  231. case "/eit-":
  232. generatorParams.Miscellaneous.ExcludeIncludedTypes = false;
  233. break;
  234. case "/gbc":
  235. case "/gbc+":
  236. generatorParams.GenericBaseClass.Enabled = true;
  237. break;
  238. case "/gbc-":
  239. generatorParams.GenericBaseClass.Enabled = false;
  240. break;
  241. case "/ggbc":
  242. case "/ggbc+":
  243. generatorParams.GenericBaseClass.GenerateBaseClass = true;
  244. break;
  245. case "/ggbc-":
  246. generatorParams.GenericBaseClass.GenerateBaseClass = false;
  247. break;
  248. case "/sc":
  249. case "/sc+":
  250. generatorParams.Miscellaneous.EnableSummaryComment = true;
  251. break;
  252. case "/sc-":
  253. case "/sum-":
  254. generatorParams.Miscellaneous.EnableSummaryComment = false;
  255. break;
  256. case "/xa":
  257. case "/xa+":
  258. generatorParams.Serialization.GenerateXmlAttributes = true;
  259. break;
  260. case "/xa-":
  261. generatorParams.Serialization.GenerateXmlAttributes = false;
  262. break;
  263. case "/cl":
  264. case "/cl+":
  265. generatorParams.GenerateCloneMethod = true;
  266. break;
  267. case "/cl-":
  268. generatorParams.GenerateCloneMethod = false;
  269. break;
  270. case "/hp":
  271. case "/hp+":
  272. generatorParams.Miscellaneous.HidePrivateFieldInIde = true;
  273. break;
  274. case "/hp-":
  275. generatorParams.Miscellaneous.HidePrivateFieldInIde = false;
  276. break;
  277. case "/tc":
  278. case "/tc+":
  279. generatorParams.TrackingChanges.Enabled = true;
  280. break;
  281. case "/tc-":
  282. generatorParams.TrackingChanges.Enabled = false;
  283. break;
  284. case "/tcc":
  285. case "/tcc+":
  286. generatorParams.TrackingChanges.GenerateTrackingClasses = true;
  287. break;
  288. case "/tcc-":
  289. generatorParams.TrackingChanges.GenerateTrackingClasses = false;
  290. break;
  291. case "/ssp":
  292. case "/ssp+":
  293. generatorParams.PropertyParams.GenerateShouldSerializeProperty = true;
  294. break;
  295. case "/ssp-":
  296. generatorParams.PropertyParams.GenerateShouldSerializeProperty = false;
  297. break;
  298. case "/s":
  299. case "/s+":
  300. case "/is":
  301. case "/is+":
  302. generatorParams.Serialization.Enabled = true;
  303. break;
  304. case "/s-":
  305. case "/is-":
  306. generatorParams.Serialization.Enabled = false;
  307. break;
  308. case "/lic":
  309. case "/license":
  310. DisplayLicense();
  311. return;
  312. case "/?":
  313. case "/h":
  314. case "/hlp":
  315. case "/help":
  316. DisplayHelp();
  317. return;
  318. }
  319. }
  320. // Auto-generate missing output file path
  321. if (string.IsNullOrEmpty(generatorParams.OutputFilePath))
  322. {
  323. generatorParams.OutputFilePath =
  324. Utility.GetOutputFilePath(generatorParams.InputFilePath,
  325. generatorParams.Language);
  326. }
  327. // Auto-generate missing generated code namespace
  328. if (string.IsNullOrEmpty(generatorParams.NameSpace))
  329. generatorParams.NameSpace = Path.GetFileNameWithoutExtension(generatorParams.InputFilePath);
  330. // Create an instance of Generator
  331. var generator = new GeneratorFacade(generatorParams);
  332. // Generate code
  333. var result = generator.Generate();
  334. if (!result.Success)
  335. {
  336. // Display the error and wait for user confirmation
  337. Console.WriteLine();
  338. Console.WriteLine(result.Messages.ToString());
  339. Console.WriteLine();
  340. Console.WriteLine("Press ENTER to continue...");
  341. Console.ReadLine();
  342. return;
  343. }
  344. Console.WriteLine("Generated code has been saved into the file {0}.", result.Entity);
  345. Console.WriteLine();
  346. Console.WriteLine("Finished");
  347. Console.WriteLine();
  348. }
  349. static private void DisplayApplicationInfo()
  350. {
  351. var currentAssembly = Assembly.GetExecutingAssembly();
  352. var currentAssemblyName = currentAssembly.GetName();
  353. Console.WriteLine();
  354. Console.WriteLine("Xsd2Code Version {0}", currentAssemblyName.Version);
  355. Console.WriteLine("Code generation utility from XML schema files.");
  356. Console.WriteLine();
  357. }
  358. /// <summary>
  359. /// Display contents of the help file ~/Resources/Help.txt
  360. /// </summary>
  361. static private void DisplayHelp()
  362. {
  363. Console.WriteLine();
  364. Console.WriteLine(Resources.Help);
  365. Console.WriteLine();
  366. }
  367. /// <summary>
  368. /// Display contents of the help file ~/Resources/Help.txt
  369. /// </summary>
  370. static private void DisplayLicense()
  371. {
  372. Console.WriteLine();
  373. Console.WriteLine(Resources.License);
  374. Console.WriteLine();
  375. }
  376. }
  377. }