Fixes: #U4-1874 - merges in thread-safe fixes for static object caching from 6.1 and cleans up
a bunch of the code in ContentType.cs. Back ports fixes for Languages.cs from 6.1 and cleans up code.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -3,11 +3,11 @@ using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.Xml;
|
||||
using umbraco.cms.businesslogic.cache;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Logging;
|
||||
using umbraco.DataLayer;
|
||||
using umbraco.BusinessLogic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace umbraco.cms.businesslogic.language
|
||||
{
|
||||
@@ -27,14 +27,12 @@ namespace umbraco.cms.businesslogic.language
|
||||
private string _name = "";
|
||||
private string _friendlyName;
|
||||
private string _cultureAlias;
|
||||
private static readonly object Locker = new object();
|
||||
#endregion
|
||||
|
||||
#region Constants and static members
|
||||
|
||||
private static object getLanguageSyncLock = new object();
|
||||
private static readonly string UmbracoLanguageCacheKey = "UmbracoPropertyTypeCache";
|
||||
|
||||
private const int DefaultLanguageId = 1;
|
||||
|
||||
private const string UmbracoLanguageCacheKey = "UmbracoPropertyTypeCache";
|
||||
|
||||
/// <summary>
|
||||
/// Gets the SQL helper.
|
||||
@@ -47,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
|
||||
@@ -59,9 +55,7 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// <param name="id">The id.</param>
|
||||
public Language(int id)
|
||||
{
|
||||
var lang = GetAllAsList()
|
||||
.Where(x => x.id == id)
|
||||
.SingleOrDefault();
|
||||
var lang = GetAllAsList().SingleOrDefault(x => x.id == id);
|
||||
if (lang == null)
|
||||
{
|
||||
throw new ArgumentException("No language found with the specified id");
|
||||
@@ -84,27 +78,39 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// <summary>
|
||||
/// Creates a new language given the culture code - ie. da-dk (denmark)
|
||||
/// </summary>
|
||||
/// <param name="CultureCode">Culturecode of the language</param>
|
||||
public static void MakeNew(string CultureCode)
|
||||
/// <param name="cultureCode">Culturecode of the language</param>
|
||||
public static void MakeNew(string cultureCode)
|
||||
{
|
||||
if (new CultureInfo(CultureCode) != null)
|
||||
lock (Locker)
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(
|
||||
"insert into umbracoLanguage (languageISOCode) values (@CultureCode)",
|
||||
SqlHelper.CreateParameter("@CultureCode", CultureCode));
|
||||
var culture = GetCulture(cultureCode);
|
||||
if (culture != null)
|
||||
{
|
||||
//insert it
|
||||
SqlHelper.ExecuteNonQuery(
|
||||
"insert into umbracoLanguage (languageISOCode) values (@CultureCode)",
|
||||
SqlHelper.CreateParameter("@CultureCode", cultureCode));
|
||||
|
||||
InvalidateCache();
|
||||
InvalidateCache();
|
||||
|
||||
NewEventArgs e = new NewEventArgs();
|
||||
GetByCultureCode(CultureCode).OnNew(e);
|
||||
//get it's id
|
||||
var newId = SqlHelper.ExecuteScalar<int>("SELECT MAX(id) FROM umbracoLanguage WHERE languageISOCode=@cultureCode", SqlHelper.CreateParameter("@cultureCode", cultureCode));
|
||||
|
||||
//load it and raise events
|
||||
using (var dr = SqlHelper.ExecuteReader(string.Format("{0} where id = {1}", m_SQLOptimizedGetAll, newId)))
|
||||
{
|
||||
while (dr.Read())
|
||||
{
|
||||
|
||||
var ct = new Language();
|
||||
ct.PopulateFromReader(dr);
|
||||
ct.OnNew(new NewEventArgs());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void InvalidateCache()
|
||||
{
|
||||
Cache.ClearCacheItem(UmbracoLanguageCacheKey);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Method for accessing all installed languagess
|
||||
/// </summary>
|
||||
@@ -117,6 +123,11 @@ namespace umbraco.cms.businesslogic.language
|
||||
}
|
||||
}
|
||||
|
||||
private static void InvalidateCache()
|
||||
{
|
||||
ApplicationContext.Current.ApplicationCache.ClearCacheItem(UmbracoLanguageCacheKey);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all installed languages
|
||||
/// </summary>
|
||||
@@ -126,40 +137,47 @@ 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>>(
|
||||
UmbracoLanguageCacheKey, 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>
|
||||
/// Gets the language by its culture code, if no language is found, null is returned
|
||||
/// </summary>
|
||||
/// <param name="CultureCode">The culture code.</param>
|
||||
/// <param name="cultureCode">The culture code.</param>
|
||||
/// <returns></returns>
|
||||
public static Language GetByCultureCode(String cultureCode)
|
||||
public static Language GetByCultureCode(string cultureCode)
|
||||
{
|
||||
if (new CultureInfo(cultureCode) != null)
|
||||
{
|
||||
return GetAllAsList()
|
||||
.Where(x => x.CultureAlias == cultureCode)
|
||||
.SingleOrDefault();
|
||||
}
|
||||
return GetAllAsList().SingleOrDefault(x => x.CultureAlias == cultureCode);
|
||||
}
|
||||
|
||||
return null;
|
||||
private static CultureInfo GetCulture(string cultureCode)
|
||||
{
|
||||
try
|
||||
{
|
||||
var culture = new CultureInfo(cultureCode);
|
||||
return culture;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Error<Language>("Could not find the culture " + cultureCode, ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -169,16 +187,13 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// <returns></returns>
|
||||
public static Language Import(XmlNode xmlData)
|
||||
{
|
||||
string cA = xmlData.Attributes["CultureAlias"].Value;
|
||||
if (Language.GetByCultureCode(cA) == null)
|
||||
var cA = xmlData.Attributes["CultureAlias"].Value;
|
||||
if (GetByCultureCode(cA) == null)
|
||||
{
|
||||
Language.MakeNew(cA);
|
||||
return Language.GetByCultureCode(cA);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
MakeNew(cA);
|
||||
return GetByCultureCode(cA);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -204,7 +219,7 @@ namespace umbraco.cms.businesslogic.language
|
||||
SqlHelper.ExecuteNonQuery(
|
||||
"update umbracoLanguage set languageISOCode = @cultureAlias where id = @id", SqlHelper.CreateParameter("@id", id),
|
||||
SqlHelper.CreateParameter("@cultureAlias", _cultureAlias));
|
||||
updateNames();
|
||||
UpdateNames();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,7 +263,7 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// </summary>
|
||||
public virtual void Save()
|
||||
{
|
||||
SaveEventArgs e = new SaveEventArgs();
|
||||
var e = new SaveEventArgs();
|
||||
FireBeforeSave(e);
|
||||
|
||||
if (!e.Cancel)
|
||||
@@ -267,40 +282,36 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// You cannot delete the default language: en-US, this is installed by default and is required.
|
||||
/// </remarks>
|
||||
public void Delete()
|
||||
{
|
||||
|
||||
|
||||
//if (this.id == DefaultLanguageId)
|
||||
//{
|
||||
// throw new InvalidOperationException("You cannot delete the default language: en-US");
|
||||
//}
|
||||
|
||||
|
||||
if (SqlHelper.ExecuteScalar<int>("SELECT count(id) FROM umbracoDomains where domainDefaultLanguage = @id",
|
||||
SqlHelper.CreateParameter("@id", id)) == 0)
|
||||
{
|
||||
lock (Locker)
|
||||
{
|
||||
|
||||
DeleteEventArgs e = new DeleteEventArgs();
|
||||
FireBeforeDelete(e);
|
||||
|
||||
if (!e.Cancel)
|
||||
if (SqlHelper.ExecuteScalar<int>("SELECT count(id) FROM umbracoDomains where domainDefaultLanguage = @id",
|
||||
SqlHelper.CreateParameter("@id", id)) == 0)
|
||||
{
|
||||
//remove the dictionary entries first
|
||||
Item.RemoveByLanguage(id);
|
||||
|
||||
InvalidateCache();
|
||||
var e = new DeleteEventArgs();
|
||||
FireBeforeDelete(e);
|
||||
|
||||
SqlHelper.ExecuteNonQuery("delete from umbracoLanguage where id = @id",
|
||||
SqlHelper.CreateParameter("@id", id));
|
||||
|
||||
FireAfterDelete(e);
|
||||
if (!e.Cancel)
|
||||
{
|
||||
//remove the dictionary entries first
|
||||
Item.RemoveByLanguage(id);
|
||||
|
||||
InvalidateCache();
|
||||
|
||||
SqlHelper.ExecuteNonQuery("delete from umbracoLanguage where id = @id",
|
||||
SqlHelper.CreateParameter("@id", id));
|
||||
|
||||
FireAfterDelete(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Add(LogTypes.Error, umbraco.BasePages.UmbracoEnsuredPage.CurrentUser, -1, "Could not remove Language " + _friendlyName + " because it's attached to a node");
|
||||
throw new DataException("Cannot remove language " + _friendlyName + " because it's attached to a domain on a node");
|
||||
}
|
||||
else
|
||||
{
|
||||
var e = new DataException("Cannot remove language " + _friendlyName + " because it's attached to a domain on a node");
|
||||
LogHelper.Error<Language>("Cannot remove language " + _friendlyName + " because it's attached to a domain on a node", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -308,12 +319,12 @@ namespace umbraco.cms.businesslogic.language
|
||||
/// </summary>
|
||||
/// <param name="xd">The xml document.</param>
|
||||
/// <returns></returns>
|
||||
public System.Xml.XmlNode ToXml(XmlDocument xd)
|
||||
public XmlNode ToXml(XmlDocument xd)
|
||||
{
|
||||
XmlNode language = xd.CreateElement("Language");
|
||||
language.Attributes.Append(xmlHelper.addAttribute(xd, "Id", this.id.ToString()));
|
||||
language.Attributes.Append(xmlHelper.addAttribute(xd, "CultureAlias", this.CultureAlias));
|
||||
language.Attributes.Append(xmlHelper.addAttribute(xd, "FriendlyName", this.FriendlyName));
|
||||
var language = xd.CreateElement("Language");
|
||||
language.Attributes.Append(XmlHelper.AddAttribute(xd, "Id", id.ToString()));
|
||||
language.Attributes.Append(XmlHelper.AddAttribute(xd, "CultureAlias", CultureAlias));
|
||||
language.Attributes.Append(XmlHelper.AddAttribute(xd, "FriendlyName", FriendlyName));
|
||||
|
||||
return language;
|
||||
}
|
||||
@@ -326,17 +337,17 @@ namespace umbraco.cms.businesslogic.language
|
||||
_id = Convert.ToInt32(dr.GetShort("id"));
|
||||
_cultureAlias = dr.GetString("languageISOCode");
|
||||
|
||||
updateNames();
|
||||
UpdateNames();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
|
||||
private void updateNames()
|
||||
private void UpdateNames()
|
||||
{
|
||||
try
|
||||
{
|
||||
CultureInfo ci = new CultureInfo(_cultureAlias);
|
||||
var ci = new CultureInfo(_cultureAlias);
|
||||
_friendlyName = ci.DisplayName;
|
||||
}
|
||||
catch
|
||||
|
||||
Reference in New Issue
Block a user