PageRenderTime 65ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/BlogEngine/DotNetSlave.BusinessLogic/Web/HttpHandlers/BlogMLExportHandler.cs

#
C# | 485 lines | 305 code | 64 blank | 116 comment | 21 complexity | d4ed3dde9b4d18bea44c10651e7a6942 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, BSD-3-Clause
  1. namespace BlogEngine.Core.Web.HttpHandlers
  2. {
  3. using System;
  4. using System.Globalization;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Web;
  9. using System.Web.Security;
  10. using System.Xml;
  11. /// <summary>
  12. /// Exports all posts to the BlogML xml format.
  13. /// </summary>
  14. public class BlogMLExportHandler : IHttpHandler
  15. {
  16. #region Properties
  17. /// <summary>
  18. /// Gets a value indicating whether another request can use the <see cref = "T:System.Web.IHttpHandler"></see> instance.
  19. /// </summary>
  20. /// <value></value>
  21. /// <returns>true if the <see cref = "T:System.Web.IHttpHandler"></see> instance is reusable; otherwise, false.</returns>
  22. public bool IsReusable
  23. {
  24. get
  25. {
  26. return false;
  27. }
  28. }
  29. #endregion
  30. #region Implemented Interfaces
  31. #region IHttpHandler
  32. /// <summary>
  33. /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler"></see> interface.
  34. /// </summary>
  35. /// <param name="context">
  36. /// An <see cref="T:System.Web.HttpContext"></see> object that provides references to the intrinsic server
  37. /// objects (for example, Request, Response, Session, and Server) used to service HTTP requests.
  38. /// </param>
  39. public void ProcessRequest(HttpContext context)
  40. {
  41. if (Security.IsAdministrator)
  42. {
  43. context.Response.ContentType = "text/xml";
  44. context.Response.AppendHeader("Content-Disposition", "attachment; filename=BlogML.xml");
  45. WriteXml(context);
  46. }
  47. else
  48. {
  49. context.Response.StatusCode = 403;
  50. }
  51. }
  52. #endregion
  53. #endregion
  54. #region Methods
  55. /// <summary>
  56. /// Add authors.
  57. /// </summary>
  58. /// <param name="writer">
  59. /// The writer.
  60. /// </param>
  61. private static void AddAuthors(XmlWriter writer)
  62. {
  63. writer.WriteStartElement("authors");
  64. foreach (MembershipUser user in Membership.GetAllUsers())
  65. {
  66. writer.WriteStartElement("author");
  67. writer.WriteAttributeString("id", user.UserName);
  68. writer.WriteAttributeString(
  69. "date-created", user.CreationDate.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  70. writer.WriteAttributeString(
  71. "date-modified", user.CreationDate.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  72. writer.WriteAttributeString("approved", "true");
  73. writer.WriteAttributeString("email", user.Email);
  74. writer.WriteStartElement("title");
  75. writer.WriteAttributeString("type", "text");
  76. writer.WriteCData(user.UserName);
  77. writer.WriteEndElement();
  78. writer.WriteEndElement();
  79. }
  80. writer.WriteEndElement();
  81. }
  82. /// <summary>
  83. /// Add categories.
  84. /// </summary>
  85. /// <param name="writer">
  86. /// The writer.
  87. /// </param>
  88. private static void AddCategories(XmlWriter writer)
  89. {
  90. writer.WriteStartElement("categories");
  91. foreach (var category in Category.Categories)
  92. {
  93. writer.WriteStartElement("category");
  94. writer.WriteAttributeString("id", category.Id.ToString());
  95. writer.WriteAttributeString(
  96. "date-created", category.DateCreated.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  97. writer.WriteAttributeString(
  98. "date-modified", category.DateModified.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  99. writer.WriteAttributeString("approved", "true");
  100. writer.WriteAttributeString("parentref", "0");
  101. if (!String.IsNullOrEmpty(category.Description))
  102. {
  103. writer.WriteAttributeString("description", category.Description);
  104. }
  105. writer.WriteStartElement("title");
  106. writer.WriteAttributeString("type", "text");
  107. writer.WriteCData(category.Title);
  108. writer.WriteEndElement();
  109. writer.WriteEndElement();
  110. }
  111. writer.WriteEndElement();
  112. }
  113. /// <summary>
  114. /// Add extended properties.
  115. /// </summary>
  116. /// <param name="writer">
  117. /// The writer.
  118. /// </param>
  119. private static void AddExtendedProperties(XmlWriter writer)
  120. {
  121. writer.WriteStartElement("extended-properties");
  122. writer.WriteStartElement("property");
  123. writer.WriteAttributeString("name", "CommentModeration");
  124. writer.WriteAttributeString("value", "Anonymous");
  125. writer.WriteEndElement();
  126. writer.WriteStartElement("property");
  127. writer.WriteAttributeString("name", "SendTrackback");
  128. writer.WriteAttributeString("value", BlogSettings.Instance.EnableTrackBackSend ? "Yes" : "No");
  129. writer.WriteEndElement();
  130. writer.WriteEndElement();
  131. }
  132. /// <summary>
  133. /// Add post author.
  134. /// </summary>
  135. /// <param name="writer">
  136. /// The writer.
  137. /// </param>
  138. /// <param name="post">
  139. /// The post to add the author on.
  140. /// </param>
  141. private static void AddPostAuthor(XmlWriter writer, Post post)
  142. {
  143. writer.WriteStartElement("authors");
  144. writer.WriteStartElement("author");
  145. writer.WriteAttributeString("ref", post.Author);
  146. writer.WriteEndElement();
  147. writer.WriteEndElement();
  148. }
  149. /// <summary>
  150. /// Add post categories.
  151. /// </summary>
  152. /// <param name="writer">
  153. /// The writer.
  154. /// </param>
  155. /// <param name="post">
  156. /// The post to add categories to.
  157. /// </param>
  158. private static void AddPostCategories(XmlWriter writer, Post post)
  159. {
  160. if (post.Categories.Count == 0)
  161. {
  162. return;
  163. }
  164. writer.WriteStartElement("categories");
  165. foreach (var category in post.Categories)
  166. {
  167. writer.WriteStartElement("category");
  168. writer.WriteAttributeString("ref", category.Id.ToString());
  169. writer.WriteEndElement();
  170. }
  171. writer.WriteEndElement();
  172. }
  173. /// <summary>
  174. /// Add post comments.
  175. /// </summary>
  176. /// <param name="writer">
  177. /// The writer.
  178. /// </param>
  179. /// <param name="post">
  180. /// The post to add comments to.
  181. /// </param>
  182. private static void AddPostComments(XmlWriter writer, Post post)
  183. {
  184. if (post.Comments.Count == 0)
  185. {
  186. return;
  187. }
  188. writer.WriteStartElement("comments");
  189. foreach (var comment in
  190. post.Comments.Where(comment => comment.Email != "trackback" && comment.Email != "pingback"))
  191. {
  192. writer.WriteStartElement("comment");
  193. writer.WriteAttributeString("id", comment.Id.ToString());
  194. writer.WriteAttributeString("parentid", comment.ParentId.ToString());
  195. writer.WriteAttributeString(
  196. "date-created", comment.DateCreated.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  197. writer.WriteAttributeString(
  198. "date-modified", comment.DateCreated.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  199. writer.WriteAttributeString("approved", comment.IsApproved.ToString().ToLowerInvariant());
  200. writer.WriteAttributeString("user-name", comment.Author);
  201. writer.WriteAttributeString("user-email", comment.Email);
  202. writer.WriteAttributeString("user-ip", comment.IP);
  203. if (comment.Website != null)
  204. {
  205. writer.WriteAttributeString("user-url", comment.Website.ToString());
  206. }
  207. else
  208. {
  209. writer.WriteAttributeString("user-url", string.Empty);
  210. }
  211. writer.WriteStartElement("title");
  212. writer.WriteAttributeString("type", "text");
  213. writer.WriteCData("re: " + post.Title);
  214. writer.WriteEndElement();
  215. writer.WriteStartElement("content");
  216. writer.WriteAttributeString("type", "text");
  217. writer.WriteCData(comment.Content);
  218. writer.WriteEndElement();
  219. writer.WriteEndElement();
  220. }
  221. writer.WriteEndElement();
  222. }
  223. /// <summary>
  224. /// Add post content.
  225. /// </summary>
  226. /// <param name="writer">
  227. /// The writer.
  228. /// </param>
  229. /// <param name="post">
  230. /// The post to add content to.
  231. /// </param>
  232. private static void AddPostContent(XmlWriter writer, Post post)
  233. {
  234. writer.WriteStartElement("content");
  235. writer.WriteAttributeString("type", "text");
  236. writer.WriteCData(post.Content);
  237. writer.WriteEndElement();
  238. }
  239. /// <summary>
  240. /// Adds the post excerpt.
  241. /// </summary>
  242. /// <param name="writer">The writer.</param>
  243. /// <param name="post">The post to add the excerpt to.</param>
  244. private static void AddPostExcerpt(XmlWriter writer, Post post)
  245. {
  246. if (String.IsNullOrEmpty(post.Description))
  247. {
  248. return;
  249. }
  250. writer.WriteStartElement("excerpt");
  251. writer.WriteAttributeString("type", "text");
  252. writer.WriteCData(post.Description);
  253. writer.WriteEndElement();
  254. }
  255. /// <summary>
  256. /// The post-name element contains the same as the title.
  257. /// </summary>
  258. /// <param name="writer">
  259. /// The writer.
  260. /// </param>
  261. /// <param name="post">
  262. /// The post to add a name to.
  263. /// </param>
  264. private static void AddPostName(XmlWriter writer, Post post)
  265. {
  266. writer.WriteStartElement("post-name");
  267. writer.WriteAttributeString("type", "text");
  268. writer.WriteCData(post.Title);
  269. writer.WriteEndElement();
  270. }
  271. /// <summary>
  272. /// Adds the post tags.
  273. /// </summary>
  274. /// <param name="writer">The writer.</param>
  275. /// <param name="post">The post to add tags to.</param>
  276. private static void AddPostTags(XmlWriter writer, Post post)
  277. {
  278. if (post.Tags.Count == 0)
  279. {
  280. return;
  281. }
  282. writer.WriteStartElement("tags");
  283. foreach (var tag in post.Tags)
  284. {
  285. writer.WriteStartElement("tag");
  286. writer.WriteAttributeString("ref", tag);
  287. writer.WriteEndElement();
  288. }
  289. writer.WriteEndElement();
  290. }
  291. /// <summary>
  292. /// Adds the post title.
  293. /// </summary>
  294. /// <param name="writer">The writer.</param>
  295. /// <param name="post">The post to add the title to.</param>
  296. private static void AddPostTitle(XmlWriter writer, Post post)
  297. {
  298. writer.WriteStartElement("title");
  299. writer.WriteAttributeString("type", "text");
  300. writer.WriteCData(post.Title);
  301. writer.WriteEndElement();
  302. }
  303. /// <summary>
  304. /// Adds the post trackbacks.
  305. /// </summary>
  306. /// <param name="writer">The writer.</param>
  307. /// <param name="post">The post to add trackbacks for.</param>
  308. private static void AddPostTrackbacks(XmlWriter writer, Post post)
  309. {
  310. if (post.Comments.Count == 0)
  311. {
  312. return;
  313. }
  314. writer.WriteStartElement("trackbacks");
  315. foreach (var comment in
  316. post.Comments.Where(comment => comment.Email == "trackback" || comment.Email == "pingback"))
  317. {
  318. writer.WriteStartElement("trackback");
  319. writer.WriteAttributeString("id", comment.Id.ToString());
  320. writer.WriteAttributeString(
  321. "date-created", comment.DateCreated.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  322. writer.WriteAttributeString(
  323. "date-modified", comment.DateCreated.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  324. writer.WriteAttributeString("approved", comment.IsApproved.ToString().ToLowerInvariant());
  325. if (comment.Website != null)
  326. {
  327. writer.WriteAttributeString("url", comment.Website.ToString());
  328. }
  329. writer.WriteStartElement("title");
  330. writer.WriteAttributeString("type", "text");
  331. writer.WriteCData(comment.Content);
  332. writer.WriteEndElement();
  333. writer.WriteEndElement();
  334. }
  335. writer.WriteEndElement();
  336. }
  337. /// <summary>
  338. /// Adds the posts.
  339. /// </summary>
  340. /// <param name="writer">The writer.</param>
  341. private static void AddPosts(XmlWriter writer)
  342. {
  343. writer.WriteStartElement("posts");
  344. foreach (var post in Post.Posts)
  345. {
  346. writer.WriteStartElement("post");
  347. writer.WriteAttributeString("id", post.Id.ToString());
  348. writer.WriteAttributeString(
  349. "date-created", post.DateCreated.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  350. writer.WriteAttributeString(
  351. "date-modified", post.DateModified.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  352. writer.WriteAttributeString("approved", "true");
  353. writer.WriteAttributeString("post-url", post.RelativeLink);
  354. writer.WriteAttributeString("type", "normal");
  355. writer.WriteAttributeString(
  356. "hasexcerpt", (!string.IsNullOrEmpty(post.Description)).ToString().ToLowerInvariant());
  357. writer.WriteAttributeString("views", "0");
  358. writer.WriteAttributeString("is-published", post.IsPublished.ToString());
  359. AddPostTitle(writer, post);
  360. AddPostContent(writer, post);
  361. AddPostName(writer, post);
  362. AddPostExcerpt(writer, post);
  363. AddPostAuthor(writer, post);
  364. AddPostCategories(writer, post);
  365. AddPostTags(writer, post);
  366. AddPostComments(writer, post);
  367. AddPostTrackbacks(writer, post);
  368. writer.WriteEndElement();
  369. }
  370. writer.WriteEndElement();
  371. }
  372. /// <summary>
  373. /// Adds the sub title.
  374. /// </summary>
  375. /// <param name="writer">The writer.</param>
  376. private static void AddSubTitle(XmlWriter writer)
  377. {
  378. writer.WriteStartElement("sub-title");
  379. writer.WriteAttributeString("type", "text");
  380. writer.WriteCData(BlogSettings.Instance.Description);
  381. writer.WriteEndElement();
  382. }
  383. /// <summary>
  384. /// Adds the title.
  385. /// </summary>
  386. /// <param name="writer">The writer.</param>
  387. private static void AddTitle(XmlWriter writer)
  388. {
  389. writer.WriteStartElement("title");
  390. writer.WriteAttributeString("type", "text");
  391. writer.WriteCData(BlogSettings.Instance.Name);
  392. writer.WriteEndElement();
  393. }
  394. /// <summary>
  395. /// Writes the BlogML to the output stream.
  396. /// </summary>
  397. /// <param name="context">
  398. /// The context.
  399. /// </param>
  400. private static void WriteXml(HttpContext context)
  401. {
  402. var settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true };
  403. using (var writer = XmlWriter.Create(context.Response.OutputStream, settings))
  404. {
  405. writer.WriteStartElement("blog", "http://www.blogml.com/2006/09/BlogML");
  406. writer.WriteAttributeString("root-url", Utils.RelativeWebRoot);
  407. writer.WriteAttributeString(
  408. "date-created", DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture));
  409. writer.WriteAttributeString("xmlns", "xs", null, "http://www.w3.org/2001/XMLSchema");
  410. AddTitle(writer);
  411. AddSubTitle(writer);
  412. AddAuthors(writer);
  413. AddExtendedProperties(writer);
  414. AddCategories(writer);
  415. AddPosts(writer);
  416. writer.WriteEndElement();
  417. }
  418. }
  419. #endregion
  420. }
  421. }