void content_AfterUpdateDocumentCache(Document sender, umbraco.cms.businesslogic.DocumentCacheEventArgs e) { ItemIdentifier itemId = new ItemIdentifier(sender.UniqueId.ToString(), ItemProviders.ProviderIDCollection.documentItemProviderGuid); //ItemIdentifier propertyId = new ItemIdentifier(sender.UniqueId.ToString(), ItemProviders.ProviderIDCollection.propertyDataItemProviderGuid); sendToCache(new[] { itemId }); }
/// <summary> /// Clears the document cache and removes the document from the xml db cache. /// This means the node gets unpublished from the website. /// </summary> /// <param name="documentId">The document id.</param> public virtual void ClearDocumentCache(int documentId) { // Get the document Document d = new Document(documentId); cms.businesslogic.DocumentCacheEventArgs e = new umbraco.cms.businesslogic.DocumentCacheEventArgs(); FireBeforeClearDocumentCache(d, e); if (!e.Cancel) { XmlNode x; // remove from xml db cache d.XmlRemoveFromDB(); // Check if node present, before cloning x = XmlContentInternal.GetElementById(d.Id.ToString()); if (x == null) { return; } // We need to lock content cache here, because we cannot allow other threads // making changes at the same time, they need to be queued lock (_xmlContentInternalSyncLock) { // Make copy of memory content, we cannot make changes to the same document // the is read from elsewhere XmlDocument xmlContentCopy = CloneXmlDoc(XmlContentInternal); // Find the document in the xml cache x = xmlContentCopy.GetElementById(d.Id.ToString()); if (x != null) { // The document already exists in cache, so repopulate it x.ParentNode.RemoveChild(x); XmlContentInternal = xmlContentCopy; ClearContextCache(); } } if (x != null) { // Run Handler umbraco.BusinessLogic.Actions.Action.RunActionHandlers(d, ActionUnPublish.Instance); } // update sitemapprovider if (SiteMap.Provider is presentation.nodeFactory.UmbracoSiteMapProvider) { presentation.nodeFactory.UmbracoSiteMapProvider prov = (presentation.nodeFactory.UmbracoSiteMapProvider)SiteMap.Provider; prov.RemoveNode(d.Id); } FireAfterClearDocumentCache(d, e); } }
/// <summary> /// Updates the document cache. /// </summary> /// <param name="d">The d.</param> public virtual void UpdateDocumentCache(Document d) { cms.businesslogic.DocumentCacheEventArgs e = new umbraco.cms.businesslogic.DocumentCacheEventArgs(); FireBeforeUpdateDocumentCache(d, e); if (!e.Cancel) { // We need to lock content cache here, because we cannot allow other threads // making changes at the same time, they need to be queued // Adding log entry before locking the xmlfile lock (_xmlContentInternalSyncLock) { // Make copy of memory content, we cannot make changes to the same document // the is read from elsewhere if (UmbracoSettings.CloneXmlCacheOnPublish) { XmlDocument xmlContentCopy = CloneXmlDoc(XmlContentInternal); PublishNodeDo(d, xmlContentCopy, true); XmlContentInternal = xmlContentCopy; } else { PublishNodeDo(d, XmlContentInternal, true); XmlContentInternal = _xmlContent; } ClearContextCache(); } // clear cached field values if (HttpContext.Current != null) { System.Web.Caching.Cache httpCache = HttpContext.Current.Cache; string cachedFieldKeyStart = String.Format("contentItem{0}_", d.Id); List <string> foundKeys = new List <string>(); foreach (DictionaryEntry cacheItem in httpCache) { string key = cacheItem.Key.ToString(); if (key.StartsWith(cachedFieldKeyStart)) { foundKeys.Add(key); } } foreach (string foundKey in foundKeys) { httpCache.Remove(foundKey); } } umbraco.BusinessLogic.Actions.Action.RunActionHandlers(d, ActionPublish.Instance); FireAfterUpdateDocumentCache(d, e); } }
/// <summary> /// Updates the document cache. /// </summary> /// <param name="d">The d.</param> public virtual void UpdateDocumentCache(Document d) { cms.businesslogic.DocumentCacheEventArgs e = new umbraco.cms.businesslogic.DocumentCacheEventArgs(); FireBeforeUpdateDocumentCache(d, e); if (!e.Cancel) { // We need to lock content cache here, because we cannot allow other threads // making changes at the same time, they need to be queued // Adding log entry before locking the xmlfile lock (_xmlContentInternalSyncLock) { // Make copy of memory content, we cannot make changes to the same document // the is read from elsewhere if (UmbracoSettings.CloneXmlCacheOnPublish) { XmlDocument xmlContentCopy = CloneXmlDoc(XmlContentInternal); PublishNodeDo(d, xmlContentCopy, true); XmlContentInternal = xmlContentCopy; } else { PublishNodeDo(d, XmlContentInternal, true); XmlContentInternal = _xmlContent; } ClearContextCache(); } // clear cached field values if (HttpContext.Current != null) { System.Web.Caching.Cache httpCache = HttpContext.Current.Cache; string cachedFieldKeyStart = String.Format("contentItem{0}_", d.Id); List<string> foundKeys = new List<string>(); foreach (DictionaryEntry cacheItem in httpCache) { string key = cacheItem.Key.ToString(); if (key.StartsWith(cachedFieldKeyStart)) foundKeys.Add(key); } foreach (string foundKey in foundKeys) { httpCache.Remove(foundKey); } } umbraco.BusinessLogic.Actions.Action.RunActionHandlers(d, ActionPublish.Instance); FireAfterUpdateDocumentCache(d, e); } }
/// <summary> /// Clears the document cache and removes the document from the xml db cache. /// This means the node gets unpublished from the website. /// </summary> /// <param name="documentId">The document id.</param> public virtual void ClearDocumentCache(int documentId) { // Get the document Document d = new Document(documentId); cms.businesslogic.DocumentCacheEventArgs e = new umbraco.cms.businesslogic.DocumentCacheEventArgs(); FireBeforeClearDocumentCache(d, e); if (!e.Cancel) { XmlNode x; // remove from xml db cache d.XmlRemoveFromDB(); // Check if node present, before cloning x = XmlContentInternal.GetElementById(d.Id.ToString()); if (x == null) return; // We need to lock content cache here, because we cannot allow other threads // making changes at the same time, they need to be queued lock (_xmlContentInternalSyncLock) { // Make copy of memory content, we cannot make changes to the same document // the is read from elsewhere XmlDocument xmlContentCopy = CloneXmlDoc(XmlContentInternal); // Find the document in the xml cache x = xmlContentCopy.GetElementById(d.Id.ToString()); if (x != null) { // The document already exists in cache, so repopulate it x.ParentNode.RemoveChild(x); XmlContentInternal = xmlContentCopy; ClearContextCache(); } } if (x != null) { // Run Handler umbraco.BusinessLogic.Actions.Action.RunActionHandlers(d, ActionUnPublish.Instance); } // update sitemapprovider if (SiteMap.Provider is presentation.nodeFactory.UmbracoSiteMapProvider) { presentation.nodeFactory.UmbracoSiteMapProvider prov = (presentation.nodeFactory.UmbracoSiteMapProvider)SiteMap.Provider; prov.RemoveNode(d.Id); } FireAfterClearDocumentCache(d, e); } }