/src/Framework/N2/Persistence/Search/ContentChangeTracker.cs

https://github.com/lundbeck/n2cms · C# · 114 lines · 91 code · 20 blank · 3 comment · 8 complexity · e52ec2938e9aba046cdf083f1ea43b4e MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using N2.Engine;
  6. using N2.Plugin;
  7. using N2.Configuration;
  8. using N2.Web;
  9. using System.Threading;
  10. using System.Security;
  11. namespace N2.Persistence.Search
  12. {
  13. /// <summary>
  14. /// Observes changes in the content structure and invokes the <see cref="IAsyncIndexer"/> to perform indexing.
  15. /// </summary>
  16. [Service]
  17. public class ContentChangeTracker : IAutoStart
  18. {
  19. IAsyncIndexer indexer;
  20. public bool IsMonitoring { get; private set; }
  21. public ContentChangeTracker(IAsyncIndexer indexer, IPersister persister, ConnectionMonitor connection, DatabaseSection config)
  22. {
  23. this.indexer = indexer;
  24. if (!config.Search.Enabled)
  25. return;
  26. if (!string.IsNullOrEmpty(config.Search.IndexOnMachineNamed) && config.Search.IndexOnMachineNamed != Environment.MachineName)
  27. return;
  28. connection.Online += delegate
  29. {
  30. IsMonitoring = true;
  31. persister.ItemSaved += persister_ItemSaved;
  32. persister.ItemMoving += persister_ItemMoving;
  33. persister.ItemMoved += persister_ItemMoved;
  34. persister.ItemCopied += persister_ItemCopied;
  35. persister.ItemDeleted += persister_ItemDeleted;
  36. };
  37. connection.Offline += delegate
  38. {
  39. IsMonitoring = false;
  40. persister.ItemSaved -= persister_ItemSaved;
  41. persister.ItemMoving -= persister_ItemMoving;
  42. persister.ItemMoved -= persister_ItemMoved;
  43. persister.ItemCopied -= persister_ItemCopied;
  44. persister.ItemDeleted -= persister_ItemDeleted;
  45. };
  46. }
  47. public void ItemChanged(int itemID, bool affectsChildren)
  48. {
  49. if (itemID == 0)
  50. return;
  51. indexer.Reindex(itemID, affectsChildren);
  52. }
  53. public void ItemDeleted(int itemID)
  54. {
  55. if (itemID == 0)
  56. return;
  57. indexer.Delete(itemID);
  58. }
  59. #region IAutoStart Members
  60. public void Start()
  61. {
  62. }
  63. public void Stop()
  64. {
  65. }
  66. void persister_ItemDeleted(object sender, ItemEventArgs e)
  67. {
  68. ItemDeleted(e.AffectedItem.ID);
  69. }
  70. void persister_ItemCopied(object sender, DestinationEventArgs e)
  71. {
  72. ItemChanged(e.AffectedItem.ID, true);
  73. }
  74. void persister_ItemMoving(object sender, CancellableDestinationEventArgs e)
  75. {
  76. var originalAction = e.FinalAction;
  77. e.FinalAction = (from, to) =>
  78. {
  79. var result = originalAction(from, to);
  80. ItemDeleted(from.ID);
  81. return result;
  82. };
  83. }
  84. void persister_ItemMoved(object sender, DestinationEventArgs e)
  85. {
  86. ItemChanged(e.AffectedItem.ID, true);
  87. }
  88. void persister_ItemSaved(object sender, ItemEventArgs e)
  89. {
  90. ItemChanged(e.AffectedItem.ID, false);
  91. }
  92. #endregion
  93. }
  94. }