Fixes: #U4-1933 - Adds LanguageCacheRefresher, removes the invalidate cache calls from within the legacy language object.
This commit is contained in:
@@ -26,5 +26,7 @@ namespace Umbraco.Core.Cache
|
||||
|
||||
public const string PropertyTypeCacheKey = "UmbracoPropertyTypeCache";
|
||||
|
||||
public const string LanguageCacheKey = "UmbracoLanguageCache";
|
||||
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,15 @@ namespace Umbraco.Web.Cache
|
||||
content.AfterUpdateDocumentCache += ContentAfterUpdateDocumentCache;
|
||||
content.AfterClearDocumentCache += ContentAfterClearDocumentCache;
|
||||
|
||||
//Bind to language events
|
||||
//NOTE: we need to bind to legacy and new API events currently: http://issues.umbraco.org/issue/U4-1979
|
||||
|
||||
global::umbraco.cms.businesslogic.language.Language.AfterDelete += LanguageAfterDelete;
|
||||
global::umbraco.cms.businesslogic.language.Language.New += LanguageNew;
|
||||
global::umbraco.cms.businesslogic.language.Language.AfterSave += LanguageAfterSave;
|
||||
LocalizationService.SavedLanguage += LocalizationServiceSavedLanguage;
|
||||
LocalizationService.DeletedLanguage += LocalizationServiceDeletedLanguage;
|
||||
|
||||
//Bind to content type events
|
||||
|
||||
ContentTypeService.SavedContentType += ContentTypeServiceSavedContentType;
|
||||
@@ -68,6 +77,56 @@ namespace Umbraco.Web.Cache
|
||||
MediaService.Trashing += MediaServiceTrashing;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when a langauge is deleted
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
static void LocalizationServiceDeletedLanguage(ILocalizationService sender, Core.Events.DeleteEventArgs<ILanguage> e)
|
||||
{
|
||||
e.DeletedEntities.ForEach(x => DistributedCache.Instance.RemoveLanguageCache(x));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when a langauge is saved
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
static void LocalizationServiceSavedLanguage(ILocalizationService sender, Core.Events.SaveEventArgs<ILanguage> e)
|
||||
{
|
||||
e.SavedEntities.ForEach(x => DistributedCache.Instance.RefreshLanguageCache(x));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when a langauge is saved
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
static void LanguageAfterSave(global::umbraco.cms.businesslogic.language.Language sender, SaveEventArgs e)
|
||||
{
|
||||
DistributedCache.Instance.RefreshLanguageCache(sender);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when a langauge is created
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
static void LanguageNew(global::umbraco.cms.businesslogic.language.Language sender, NewEventArgs e)
|
||||
{
|
||||
DistributedCache.Instance.RefreshLanguageCache(sender);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when a langauge is deleted
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
static void LanguageAfterDelete(global::umbraco.cms.businesslogic.language.Language sender, DeleteEventArgs e)
|
||||
{
|
||||
DistributedCache.Instance.RemoveLanguageCache(sender);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when a media type is deleted
|
||||
/// </summary>
|
||||
|
||||
@@ -42,6 +42,7 @@ namespace Umbraco.Web.Cache
|
||||
public const string MacroCacheRefresherId = "7B1E683C-5F34-43dd-803D-9699EA1E98CA";
|
||||
public const string UserCacheRefresherId = "E057AF6D-2EE6-41F4-8045-3694010F0AA6";
|
||||
public const string ContentTypeCacheRefresherId = "6902E22C-9C10-483C-91F3-66B7CAE9E2F5";
|
||||
public const string LanguageCacheRefresherId = "3E0F95D8-0BE5-44B8-8394-2B8750B62654";
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -278,6 +278,42 @@ namespace Umbraco.Web.Cache
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Language Cache
|
||||
|
||||
public static void RefreshLanguageCache(this DistributedCache dc, ILanguage language)
|
||||
{
|
||||
if (language != null)
|
||||
{
|
||||
dc.Refresh(new Guid(DistributedCache.LanguageCacheRefresherId), language.Id);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveLanguageCache(this DistributedCache dc, ILanguage language)
|
||||
{
|
||||
if (language != null)
|
||||
{
|
||||
dc.Remove(new Guid(DistributedCache.LanguageCacheRefresherId), language.Id);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RefreshLanguageCache(this DistributedCache dc, global::umbraco.cms.businesslogic.language.Language language)
|
||||
{
|
||||
if (language != null)
|
||||
{
|
||||
dc.Refresh(new Guid(DistributedCache.LanguageCacheRefresherId), language.id);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveLanguageCache(this DistributedCache dc, global::umbraco.cms.businesslogic.language.Language language)
|
||||
{
|
||||
if (language != null)
|
||||
{
|
||||
dc.Remove(new Guid(DistributedCache.LanguageCacheRefresherId), language.id);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public static void ClearXsltCacheOnCurrentServer(this DistributedCache dc)
|
||||
{
|
||||
if (UmbracoSettings.UmbracoLibraryCacheDuration > 0)
|
||||
|
||||
39
src/Umbraco.Web/Cache/LanguageCacheRefresher.cs
Normal file
39
src/Umbraco.Web/Cache/LanguageCacheRefresher.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
|
||||
namespace Umbraco.Web.Cache
|
||||
{
|
||||
/// <summary>
|
||||
/// A cache refresher to ensure language cache is refreshed when languages change
|
||||
/// </summary>
|
||||
public sealed class LanguageCacheRefresher : CacheRefresherBase<LanguageCacheRefresher>
|
||||
{
|
||||
protected override LanguageCacheRefresher Instance
|
||||
{
|
||||
get { return this; }
|
||||
}
|
||||
|
||||
public override Guid UniqueIdentifier
|
||||
{
|
||||
get { return new Guid(DistributedCache.LanguageCacheRefresherId); }
|
||||
}
|
||||
|
||||
public override string Name
|
||||
{
|
||||
get { return "Language cache refresher"; }
|
||||
}
|
||||
|
||||
public override void Refresh(int id)
|
||||
{
|
||||
ApplicationContext.Current.ApplicationCache.ClearCacheItem(CacheKeys.LanguageCacheKey);
|
||||
base.Refresh(id);
|
||||
}
|
||||
|
||||
public override void Remove(int id)
|
||||
{
|
||||
ApplicationContext.Current.ApplicationCache.ClearCacheItem(CacheKeys.LanguageCacheKey);
|
||||
base.Remove(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -267,6 +267,7 @@
|
||||
<Compile Include="Cache\DistributedCache.cs" />
|
||||
<Compile Include="Cache\DistributedCacheExtensions.cs" />
|
||||
<Compile Include="Cache\CacheRefresherEventHandler.cs" />
|
||||
<Compile Include="Cache\LanguageCacheRefresher.cs" />
|
||||
<Compile Include="Cache\MacroCacheRefresher.cs" />
|
||||
<Compile Include="Cache\MediaCacheRefresher.cs" />
|
||||
<Compile Include="Cache\MemberCacheRefresher.cs" />
|
||||
|
||||
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.Xml;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Logging;
|
||||
using umbraco.cms.businesslogic.cache;
|
||||
using umbraco.DataLayer;
|
||||
@@ -31,12 +33,7 @@ namespace umbraco.cms.businesslogic.language
|
||||
#endregion
|
||||
|
||||
#region Constants and static members
|
||||
|
||||
private static object getLanguageSyncLock = new object();
|
||||
private static readonly string UmbracoLanguageCacheKey = "UmbracoLanguageCache";
|
||||
|
||||
private const int DefaultLanguageId = 1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the SQL helper.
|
||||
/// </summary>
|
||||
@@ -48,8 +45,6 @@ namespace umbraco.cms.businesslogic.language
|
||||
|
||||
protected internal const string m_SQLOptimizedGetAll = @"select * from umbracoLanguage";
|
||||
|
||||
private static readonly object m_Locker = new object();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@@ -93,19 +88,12 @@ namespace umbraco.cms.businesslogic.language
|
||||
SqlHelper.ExecuteNonQuery(
|
||||
"insert into umbracoLanguage (languageISOCode) values (@CultureCode)",
|
||||
SqlHelper.CreateParameter("@CultureCode", CultureCode));
|
||||
|
||||
InvalidateCache();
|
||||
|
||||
|
||||
NewEventArgs e = new NewEventArgs();
|
||||
GetByCultureCode(CultureCode).OnNew(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void InvalidateCache()
|
||||
{
|
||||
Cache.ClearCacheItem(UmbracoLanguageCacheKey);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Method for accessing all installed languagess
|
||||
/// </summary>
|
||||
@@ -127,23 +115,24 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// </remarks>
|
||||
public static IEnumerable<Language> GetAllAsList()
|
||||
{
|
||||
return Cache.GetCacheItem<IEnumerable<Language>>(UmbracoLanguageCacheKey, getLanguageSyncLock, TimeSpan.FromMinutes(60),
|
||||
delegate
|
||||
{
|
||||
var languages = new List<Language>();
|
||||
|
||||
using (IRecordsReader dr = SqlHelper.ExecuteReader(m_SQLOptimizedGetAll))
|
||||
return ApplicationContext.Current.ApplicationCache.GetCacheItem<IEnumerable<Language>>(
|
||||
CacheKeys.LanguageCacheKey,
|
||||
TimeSpan.FromMinutes(60),
|
||||
() =>
|
||||
{
|
||||
while (dr.Read())
|
||||
var languages = new List<Language>();
|
||||
using (var dr = SqlHelper.ExecuteReader(m_SQLOptimizedGetAll))
|
||||
{
|
||||
//create the ContentType object without setting up
|
||||
Language ct = new Language();
|
||||
ct.PopulateFromReader(dr);
|
||||
languages.Add(ct);
|
||||
while (dr.Read())
|
||||
{
|
||||
//create the ContentType object without setting up
|
||||
var ct = new Language();
|
||||
ct.PopulateFromReader(dr);
|
||||
languages.Add(ct);
|
||||
}
|
||||
}
|
||||
}
|
||||
return languages;
|
||||
});
|
||||
return languages;
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -252,7 +241,6 @@ namespace umbraco.cms.businesslogic.language
|
||||
|
||||
if (!e.Cancel)
|
||||
{
|
||||
InvalidateCache();
|
||||
FireAfterSave(e);
|
||||
}
|
||||
}
|
||||
@@ -287,8 +275,6 @@ namespace umbraco.cms.businesslogic.language
|
||||
//remove the dictionary entries first
|
||||
Item.RemoveByLanguage(id);
|
||||
|
||||
InvalidateCache();
|
||||
|
||||
SqlHelper.ExecuteNonQuery("delete from umbracoLanguage where id = @id",
|
||||
SqlHelper.CreateParameter("@id", id));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user