PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/BlogEngine/DotNetSlave.BusinessLogic/Providers/XmlProvider/Pages.cs

#
C# | 167 lines | 115 code | 22 blank | 30 comment | 15 complexity | 7dcda71aeb980c672ed508aa456289a8 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, BSD-3-Clause
  1. namespace BlogEngine.Core.Providers
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Globalization;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Xml;
  9. /// <summary>
  10. /// A storage provider for BlogEngine that uses XML files.
  11. /// <remarks>
  12. /// To build another provider, you can just copy and modify
  13. /// this one. Then add it to the web.config's BlogEngine section.
  14. /// </remarks>
  15. /// </summary>
  16. public partial class XmlBlogProvider : BlogProvider
  17. {
  18. #region Public Methods
  19. /// <summary>
  20. /// Deletes a Page from the data store specified by the provider.
  21. /// </summary>
  22. /// <param name="page">The page to delete.</param>
  23. public override void DeletePage(Page page)
  24. {
  25. var fileName = string.Format("{0}pages{1}{2}.xml", this.Folder, Path.DirectorySeparatorChar, page.Id);
  26. if (File.Exists(fileName))
  27. {
  28. File.Delete(fileName);
  29. }
  30. if (Page.Pages.Contains(page))
  31. {
  32. Page.Pages.Remove(page);
  33. }
  34. }
  35. /// <summary>
  36. /// Retrieves all pages from the data store
  37. /// </summary>
  38. /// <returns>
  39. /// List of Pages
  40. /// </returns>
  41. public override List<Page> FillPages()
  42. {
  43. var folder = string.Format("{0}pages{1}", this.Folder, Path.DirectorySeparatorChar);
  44. return (from file in Directory.GetFiles(folder, "*.xml", SearchOption.TopDirectoryOnly)
  45. select new FileInfo(file)
  46. into info
  47. select info.Name.Replace(".xml", string.Empty)
  48. into id
  49. select Page.Load(new Guid(id))).ToList();
  50. }
  51. /// <summary>
  52. /// Inserts a new Page into the data store specified by the provider.
  53. /// </summary>
  54. /// <param name="page">The page to insert.</param>
  55. public override void InsertPage(Page page)
  56. {
  57. if (!Directory.Exists(string.Format("{0}pages", this.Folder)))
  58. {
  59. Directory.CreateDirectory(string.Format("{0}pages", this.Folder));
  60. }
  61. var fileName = string.Format("{0}pages{1}{2}.xml", this.Folder, Path.DirectorySeparatorChar, page.Id);
  62. var settings = new XmlWriterSettings { Indent = true };
  63. using (var writer = XmlWriter.Create(fileName, settings))
  64. {
  65. writer.WriteStartDocument(true);
  66. writer.WriteStartElement("page");
  67. writer.WriteElementString("title", page.Title);
  68. writer.WriteElementString("description", page.Description);
  69. writer.WriteElementString("content", page.Content);
  70. writer.WriteElementString("keywords", page.Keywords);
  71. writer.WriteElementString("slug", page.Slug);
  72. writer.WriteElementString("parent", page.Parent.ToString());
  73. writer.WriteElementString("isfrontpage", page.IsFrontPage.ToString());
  74. writer.WriteElementString("showinlist", page.ShowInList.ToString());
  75. writer.WriteElementString("ispublished", page.IsPublished.ToString());
  76. writer.WriteElementString("isdeleted", page.IsDeleted.ToString());
  77. writer.WriteElementString(
  78. "datecreated",
  79. page.DateCreated.AddHours(-BlogSettings.Instance.Timezone).ToString(
  80. "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
  81. writer.WriteElementString(
  82. "datemodified",
  83. page.DateModified.AddHours(-BlogSettings.Instance.Timezone).ToString(
  84. "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
  85. writer.WriteEndElement();
  86. }
  87. }
  88. /// <summary>
  89. /// Retrieves a Page from the provider based on the specified id.
  90. /// </summary>
  91. /// <param name="id">The Page id.</param>
  92. /// <returns>The Page object.</returns>
  93. public override Page SelectPage(Guid id)
  94. {
  95. var fileName = string.Format("{0}pages{1}{2}.xml", this.Folder, Path.DirectorySeparatorChar, id);
  96. var doc = new XmlDocument();
  97. doc.Load(fileName);
  98. var page = new Page
  99. {
  100. Title = doc.SelectSingleNode("page/title").InnerText,
  101. Description = doc.SelectSingleNode("page/description").InnerText,
  102. Content = doc.SelectSingleNode("page/content").InnerText,
  103. Keywords = doc.SelectSingleNode("page/keywords").InnerText
  104. };
  105. if (doc.SelectSingleNode("page/slug") != null)
  106. {
  107. page.Slug = doc.SelectSingleNode("page/slug").InnerText;
  108. }
  109. if (doc.SelectSingleNode("page/parent") != null)
  110. {
  111. page.Parent = new Guid(doc.SelectSingleNode("page/parent").InnerText);
  112. }
  113. if (doc.SelectSingleNode("page/isfrontpage") != null)
  114. {
  115. page.IsFrontPage = bool.Parse(doc.SelectSingleNode("page/isfrontpage").InnerText);
  116. }
  117. if (doc.SelectSingleNode("page/showinlist") != null)
  118. {
  119. page.ShowInList = bool.Parse(doc.SelectSingleNode("page/showinlist").InnerText);
  120. }
  121. if (doc.SelectSingleNode("page/ispublished") != null)
  122. {
  123. page.IsPublished = bool.Parse(doc.SelectSingleNode("page/ispublished").InnerText);
  124. }
  125. if (doc.SelectSingleNode("page/isdeleted") != null)
  126. {
  127. page.IsDeleted = bool.Parse(doc.SelectSingleNode("page/isdeleted").InnerText);
  128. }
  129. page.DateCreated = DateTime.Parse(
  130. doc.SelectSingleNode("page/datecreated").InnerText, CultureInfo.InvariantCulture);
  131. page.DateModified = DateTime.Parse(
  132. doc.SelectSingleNode("page/datemodified").InnerText, CultureInfo.InvariantCulture);
  133. return page;
  134. }
  135. /// <summary>
  136. /// Updates an existing Page in the data store specified by the provider.
  137. /// </summary>
  138. /// <param name="page">The page to update.</param>
  139. public override void UpdatePage(Page page)
  140. {
  141. InsertPage(page);
  142. }
  143. #endregion
  144. }
  145. }