diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index bf0c8dc9be..d1802cb82a 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -45,7 +45,7 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - private static readonly PropertyInfo UserSelector = ExpressionHelper.GetPropertyInfo(x => x.Creator); + private static readonly PropertyInfo CreatorSelector = ExpressionHelper.GetPropertyInfo(x => x.Creator); private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); private static readonly PropertyInfo DefaultContentTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeId); private readonly static PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); @@ -137,7 +137,7 @@ namespace Umbraco.Core.Models } /// - /// IProfile of the user who created this Content + /// Profile of the user who created this Content /// [DataMember] public virtual IProfile Creator @@ -146,7 +146,7 @@ namespace Umbraco.Core.Models set { _creator = value; - OnPropertyChanged(UserSelector); + OnPropertyChanged(CreatorSelector); } } diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index a0035c5f6f..def56489a5 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Membership; namespace Umbraco.Core.Models { @@ -21,7 +22,7 @@ namespace Umbraco.Core.Models private int _sortOrder; private string _icon; private string _thumbnail; - private int _userId; + private IProfile _creator; private bool _allowedAsRoot; private bool _isContainer; private bool _trashed; @@ -44,7 +45,7 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo DescriptionSelector = ExpressionHelper.GetPropertyInfo(x => x.Description); private static readonly PropertyInfo IconSelector = ExpressionHelper.GetPropertyInfo(x => x.Icon); private static readonly PropertyInfo ThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.Thumbnail); - private static readonly PropertyInfo UserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.UserId); + private static readonly PropertyInfo CreatorSelector = ExpressionHelper.GetPropertyInfo(x => x.Creator); private static readonly PropertyInfo AllowedAsRootSelector = ExpressionHelper.GetPropertyInfo(x => x.AllowedAsRoot); private static readonly PropertyInfo IsContainerSelector = ExpressionHelper.GetPropertyInfo(x => x.IsContainer); private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); @@ -184,16 +185,16 @@ namespace Umbraco.Core.Models } /// - /// Id of the user who created this Content + /// Gets or sets the Profile of the user who created this ContentType /// [DataMember] - public virtual int UserId + public virtual IProfile Creator { - get { return _userId; } + get { return _creator; } set { - _userId = value; - OnPropertyChanged(UserIdSelector); + _creator = value; + OnPropertyChanged(CreatorSelector); } } diff --git a/src/Umbraco.Core/Models/IContentTypeBase.cs b/src/Umbraco.Core/Models/IContentTypeBase.cs index 5a0013e2b9..805165360e 100644 --- a/src/Umbraco.Core/Models/IContentTypeBase.cs +++ b/src/Umbraco.Core/Models/IContentTypeBase.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Membership; namespace Umbraco.Core.Models { @@ -55,9 +56,9 @@ namespace Umbraco.Core.Models string Thumbnail { get; set; } /// - /// Gets or Sets the Id of the User who created the ContentType + /// Gets or Sets the Profile of the User who created the ContentType /// - int UserId { get; set; } + IProfile Creator { get; set; } /// /// Gets or Sets a boolean indicating whether this ContentType is allowed at the root diff --git a/src/Umbraco.Core/Models/Membership/IMembershipUser.cs b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs index b54f8d371d..b80faeee10 100644 --- a/src/Umbraco.Core/Models/Membership/IMembershipUser.cs +++ b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs @@ -1,11 +1,12 @@ using System; using System.Collections.Generic; +using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models.Membership { - internal interface IMembershipUser : IMembershipUserId + internal interface IMembershipUser : IMembershipUserId, IAggregateRoot { - object Id { get; set; } + new object Id { get; set; } string Username { get; set; } string Email { get; set; } string Password { get; set; } @@ -15,9 +16,11 @@ namespace Umbraco.Core.Models.Membership bool IsApproved { get; set; } bool IsOnline { get; set; } bool IsLockedOut { get; set; } - DateTime CreationDate { get; set; } + //Was CreationDate + //DateTime CreateDate { get; set; } + //LastActivityDate + //DateTime UpdateDate { get; set; } DateTime LastLoginDate { get; set; } - DateTime LastActivityDate { get; set; } DateTime LastPasswordChangeDate { get; set; } DateTime LastLockoutDate { get; set; } diff --git a/src/Umbraco.Core/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs new file mode 100644 index 0000000000..acdd8db907 --- /dev/null +++ b/src/Umbraco.Core/Models/Membership/IUser.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace Umbraco.Core.Models.Membership +{ + /// + /// Defines the interface for a + /// + /// Will be left internal until a proper Membership implementation is part of the roadmap + internal interface IUser : IMembershipUser + { + string Name { get; set; } + int SessionTimeout { get; set; } + int StartContentId { get; set; } + int StartMediaId { get; set; } + IEnumerable Applications { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Membership/Profile.cs b/src/Umbraco.Core/Models/Membership/Profile.cs index eac7ea3274..972ce92d48 100644 --- a/src/Umbraco.Core/Models/Membership/Profile.cs +++ b/src/Umbraco.Core/Models/Membership/Profile.cs @@ -26,7 +26,7 @@ namespace Umbraco.Core.Models.Membership public string Name { get; set; } - internal virtual object ProviderUserKey + public virtual object ProviderUserKey { get { throw new System.NotImplementedException(); } set { throw new System.NotImplementedException(); } diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs index 7aa16cca5d..796b4966dd 100644 --- a/src/Umbraco.Core/Models/Membership/User.cs +++ b/src/Umbraco.Core/Models/Membership/User.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models.Membership { @@ -10,8 +11,32 @@ namespace Umbraco.Core.Models.Membership /// Should be internal until a proper user/membership implementation /// is part of the roadmap. /// - internal class User : UserProfile, IMembershipUser + internal class User : UserProfile, IUser { + private bool _hasIdentity; + private int _id; + + #region Implementation of IEntity + + public bool HasIdentity { get { return Id != null || _hasIdentity; } } + + int IEntity.Id + { + get + { + return _id; + } + set + { + _id = value; + _hasIdentity = true; + } + } + + public Guid Key { get; set; } + + #endregion + #region Implementation of IMembershipUser public string Username { get; set; } @@ -23,9 +48,9 @@ namespace Umbraco.Core.Models.Membership public bool IsApproved { get; set; } public bool IsOnline { get; set; } public bool IsLockedOut { get; set; } - public DateTime CreationDate { get; set; } + public DateTime CreateDate { get; set; } + public DateTime UpdateDate { get; set; } public DateTime LastLoginDate { get; set; } - public DateTime LastActivityDate { get; set; } public DateTime LastPasswordChangeDate { get; set; } public DateTime LastLockoutDate { get; set; } @@ -33,11 +58,5 @@ namespace Umbraco.Core.Models.Membership public IEnumerable Groups { get; set; } #endregion - - #region Implementation of IMembershipUserId - - public new object ProviderUserKey { get; set; } - - #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/PropertyExtensions.cs b/src/Umbraco.Core/Models/PropertyExtensions.cs index 15c4737715..460174e8c0 100644 --- a/src/Umbraco.Core/Models/PropertyExtensions.cs +++ b/src/Umbraco.Core/Models/PropertyExtensions.cs @@ -17,8 +17,16 @@ namespace Umbraco.Core.Models var xd = new XmlDocument(); XmlNode xmlNode = xd.CreateNode(XmlNodeType.Element, nodeName, ""); - xmlNode.AppendChild(property.PropertyType.DataType(property.Id).Data.ToXMl(xd)); + XmlNode child = property.PropertyType.DataTypeDatabaseType == DataTypeDatabaseType.Ntext + ? xd.CreateCDataSection(property.Value.ToString()) as XmlNode + : xd.CreateTextNode(property.Value.ToString()); + + xmlNode.AppendChild(child); + + //This seems to fail during testing + //xmlNode.AppendChild(property.PropertyType.DataType(property.Id).Data.ToXMl(xd)); + var element = xmlNode.GetXElement(); return element; } diff --git a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs index fe836449f5..c5d0169e7b 100644 --- a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Factories @@ -34,10 +35,7 @@ namespace Umbraco.Core.Persistence.Factories CreateDate = dto.ContentTypeDto.NodeDto.CreateDate, Path = dto.ContentTypeDto.NodeDto.Path, Level = dto.ContentTypeDto.NodeDto.Level, - UserId = - dto.ContentTypeDto.NodeDto.UserId.HasValue - ? dto.ContentTypeDto.NodeDto.UserId.Value - : 0, + Creator = new Profile(dto.ContentTypeDto.NodeDto.UserId.Value, ""), AllowedAsRoot = dto.ContentTypeDto.AllowAtRoot, IsContainer = dto.ContentTypeDto.IsContainer, Trashed = dto.ContentTypeDto.NodeDto.Trashed @@ -85,7 +83,7 @@ namespace Umbraco.Core.Persistence.Factories Text = entity.Name, Trashed = false, UniqueId = entity.Key, - UserId = entity.UserId + UserId = entity.Creator.Id.SafeCast() }; return nodeDto; } diff --git a/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs index b3254ab87f..dacbfe736e 100644 --- a/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Factories @@ -34,10 +35,7 @@ namespace Umbraco.Core.Persistence.Factories CreateDate = dto.NodeDto.CreateDate, Path = dto.NodeDto.Path, Level = dto.NodeDto.Level, - UserId = - dto.NodeDto.UserId.HasValue - ? dto.NodeDto.UserId.Value - : 0, + Creator = new Profile(dto.NodeDto.UserId.Value, ""), AllowedAsRoot = dto.AllowAtRoot, IsContainer = dto.IsContainer, Trashed = dto.NodeDto.Trashed @@ -77,7 +75,7 @@ namespace Umbraco.Core.Persistence.Factories Text = entity.Name, Trashed = false, UniqueId = entity.Key, - UserId = entity.UserId + UserId = entity.Creator.Id.SafeCast() }; return nodeDto; } diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs index 9c48cae1e1..b54b0c8af1 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs @@ -36,7 +36,7 @@ namespace Umbraco.Core.Persistence.Mappers CacheMap(src => src.Name, dto => dto.Text); CacheMap(src => src.Trashed, dto => dto.Trashed); CacheMap(src => src.Key, dto => dto.UniqueId); - CacheMap(src => src.UserId, dto => dto.UserId); + CacheMap(src => src.Creator, dto => dto.UserId); CacheMap(src => src.Alias, dto => dto.Alias); CacheMap(src => src.AllowedAsRoot, dto => dto.AllowAtRoot); CacheMap(src => src.Description, dto => dto.Description); diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs new file mode 100644 index 0000000000..d7d251d45f --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.Models.Membership; + +namespace Umbraco.Core.Persistence.Repositories +{ + internal interface IUserRepository : IRepositoryQueryable + { + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index d420be0596..cb21cc766c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -42,11 +42,13 @@ namespace Umbraco.Core.Persistence.Repositories if (FileSystem.FileExists(masterpageName)) { - var stream = FileSystem.OpenFile(masterpageName); - byte[] bytes = new byte[stream.Length]; - stream.Position = 0; - stream.Read(bytes, 0, (int)stream.Length); - content = Encoding.UTF8.GetString(bytes); + using (var stream = FileSystem.OpenFile(masterpageName)) + { + byte[] bytes = new byte[stream.Length]; + stream.Position = 0; + stream.Read(bytes, 0, (int) stream.Length); + content = Encoding.UTF8.GetString(bytes); + } path = FileSystem.GetRelativePath(masterpageName); created = FileSystem.GetCreated(path).UtcDateTime; @@ -55,11 +57,13 @@ namespace Umbraco.Core.Persistence.Repositories } else { - var stream = _viewsFileSystem.OpenFile(viewName); - byte[] bytes = new byte[stream.Length]; - stream.Position = 0; - stream.Read(bytes, 0, (int)stream.Length); - content = Encoding.UTF8.GetString(bytes); + using (var stream = _viewsFileSystem.OpenFile(viewName)) + { + byte[] bytes = new byte[stream.Length]; + stream.Position = 0; + stream.Read(bytes, 0, (int) stream.Length); + content = Encoding.UTF8.GetString(bytes); + } path = _viewsFileSystem.GetRelativePath(viewName); created = FileSystem.GetCreated(path).UtcDateTime; diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs new file mode 100644 index 0000000000..5c320164ac --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + /// + /// Represents the UserRepository for doing CRUD operations for users + /// + internal class UserRepository : PetaPocoRepositoryBase, IUserRepository + { + public UserRepository(IUnitOfWork work) + : base(work) + { + } + + #region Overrides of RepositoryBase + + protected override IUser PerformGet(int id) + { + throw new NotImplementedException(); + } + + protected override IEnumerable PerformGetAll(params int[] ids) + { + throw new NotImplementedException(); + } + + protected override IEnumerable PerformGetByQuery(IQuery query) + { + throw new NotImplementedException(); + } + + #endregion + + #region Overrides of PetaPocoRepositoryBase + + protected override Sql GetBaseQuery(bool isCount) + { + throw new NotImplementedException(); + } + + protected override string GetBaseWhereClause() + { + throw new NotImplementedException(); + } + + protected override IEnumerable GetDeleteClauses() + { + throw new NotImplementedException(); + } + + protected override Guid NodeObjectTypeId + { + get { throw new NotImplementedException(); } + } + + protected override void PersistNewItem(IUser entity) + { + throw new NotImplementedException(); + } + + protected override void PersistUpdatedItem(IUser entity) + { + throw new NotImplementedException(); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 15a80ba902..3d288e2274 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -105,6 +105,7 @@ + @@ -193,6 +194,7 @@ + @@ -204,6 +206,7 @@ + diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config index b3aabc2647..8d07784e2d 100644 --- a/src/Umbraco.Tests/App.config +++ b/src/Umbraco.Tests/App.config @@ -8,7 +8,7 @@ - + @@ -30,7 +30,7 @@ - + diff --git a/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs b/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs index 360af99c14..c7e2ad5b5f 100644 --- a/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs +++ b/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs @@ -38,7 +38,7 @@ namespace Umbraco.Tests.DynamicDocument Path.Combine(currDir.Parent.Parent.FullName, "config", "umbracoSettings.config"), true); - UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config, false); + UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/IO/AbstractFileSystemTests.cs b/src/Umbraco.Tests/IO/AbstractFileSystemTests.cs index 9b5ab6f5e9..c48cee58d7 100644 --- a/src/Umbraco.Tests/IO/AbstractFileSystemTests.cs +++ b/src/Umbraco.Tests/IO/AbstractFileSystemTests.cs @@ -41,6 +41,11 @@ namespace Umbraco.Tests.IO Assert.AreEqual(1, files.Count()); + foreach (var file in files) + { + _fileSystem.DeleteFile(file); + } + _fileSystem.DeleteDirectory("test", true); } diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index b1f778d3ca..7392f8114d 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -8,6 +8,7 @@ using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using umbraco.editorControls.tinyMCE3; using umbraco.interfaces; +using File = System.IO.File; namespace Umbraco.Tests.Models { @@ -38,15 +39,10 @@ namespace Umbraco.Tests.Models { DatabaseContext.Database.Dispose(); - TestHelper.ClearDatabase(); - //reset the app context DataTypesResolver.Reset(); - ApplicationContext.Current = null; - Resolution.IsFrozen = false; - - string path = TestHelper.CurrentAssemblyDirectory; - AppDomain.CurrentDomain.SetData("DataDirectory", null); + + base.TearDown(); } [Test] public void Can_Generate_Xml_Representation_Of_Content() diff --git a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs b/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs index 086be06628..99431de610 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs @@ -36,7 +36,7 @@ namespace Umbraco.Tests.Persistence AppDomain.CurrentDomain.SetData("DataDirectory", path); //Delete database file before continueing - string filePath = string.Concat(path, "\\test.sdf"); + string filePath = string.Concat(path, "\\UmbracoPetaPocoTests.sdf"); if (File.Exists(filePath)) { File.Delete(filePath); diff --git a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs index 9c6f73319c..e7a344c0c8 100644 --- a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs +++ b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs @@ -1,8 +1,11 @@ using System; +using System.IO; using System.Web; using System.Xml; using NUnit.Framework; using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.ObjectResolution; using Umbraco.Tests.TestHelpers; @@ -19,6 +22,8 @@ namespace Umbraco.Tests.Publishing [SetUp] public override void Initialize() { + UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); + //this ensures its reset PluginManager.Current = new PluginManager(); @@ -73,6 +78,8 @@ namespace Umbraco.Tests.Publishing var document = httpContext.Items["UmbracoXmlContextContent"] as XmlDocument; Console.Write(document.OuterXml); document.Save("umbraco.config"); + + updateContentCache.Unsubscribe(); } public void CreateTestData() diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 92d19b1447..dcc87d4dca 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -42,7 +42,7 @@ namespace Umbraco.Tests.TestHelpers mvcViews.GetFiles().ForEach(x => x.Delete()); //Delete database file before continueing - string filePath = string.Concat(path, "\\test.sdf"); + string filePath = string.Concat(path, "\\UmbracoPetaPocoTests.sdf"); if (File.Exists(filePath)) { File.Delete(filePath); @@ -50,6 +50,7 @@ namespace Umbraco.Tests.TestHelpers //Get the connectionstring settings from config var settings = ConfigurationManager.ConnectionStrings["umbracoDbDsn"]; + ConfigurationManager.AppSettings.Set("umbracoDbDSN", @"datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;data source=|DataDirectory|\UmbracoPetaPocoTests.sdf"); //Create the Sql CE database var engine = new SqlCeEngine(settings.ConnectionString); @@ -76,21 +77,21 @@ namespace Umbraco.Tests.TestHelpers string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", null); - string filePath = string.Concat(path, "\\test.sdf"); + string filePath = string.Concat(path, "\\UmbracoPetaPocoTests.sdf"); if (File.Exists(filePath)) { - File.Delete(filePath); + //File.Delete(filePath); } } - protected ApplicationContext ApplicationContext { get; private set; } + protected ApplicationContext ApplicationContext { get; set; } protected ServiceContext ServiceContext { get { return ServiceContext.Current; } } - protected DatabaseContext DatabaseContext { get; private set; } + protected DatabaseContext DatabaseContext { get; set; } protected UmbracoContext GetUmbracoContext(string url, int templateId, RouteData routeData = null) { diff --git a/src/Umbraco.Tests/TestHelpers/Entities/MockedContentTypes.cs b/src/Umbraco.Tests/TestHelpers/Entities/MockedContentTypes.cs index 23ddb14529..fa0bc0b3f3 100644 --- a/src/Umbraco.Tests/TestHelpers/Entities/MockedContentTypes.cs +++ b/src/Umbraco.Tests/TestHelpers/Entities/MockedContentTypes.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; namespace Umbraco.Tests.TestHelpers.Entities { @@ -15,7 +16,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), DefaultTemplate = "~/masterpages/umbTextPage.master", Trashed = false }; @@ -44,7 +45,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), DefaultTemplate = "", Trashed = false }; @@ -68,7 +69,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), DefaultTemplate = "~/masterpages/umbSimplePage.master", Trashed = false }; @@ -93,7 +94,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc2.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), DefaultTemplate = "~/masterpages/umbSimplePage.master", Trashed = false }; @@ -118,7 +119,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc2.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), DefaultTemplate = "~/masterpages/umbSimplePage.master", Trashed = false }; @@ -143,7 +144,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc3.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), DefaultTemplate = "~/masterpages/umbSimplePage.master", Trashed = false }; @@ -163,7 +164,7 @@ namespace Umbraco.Tests.TestHelpers.Entities Icon = ".sprTreeDoc3", Thumbnail = "doc.png", SortOrder = 1, - UserId = 0, + Creator = new Profile(0, "Administrator"), Trashed = false }; diff --git a/src/Umbraco.Web/Strategies/UpdateContentCache.cs b/src/Umbraco.Web/Strategies/UpdateContentCache.cs index 6aeb265d46..082d27385d 100644 --- a/src/Umbraco.Web/Strategies/UpdateContentCache.cs +++ b/src/Umbraco.Web/Strategies/UpdateContentCache.cs @@ -52,11 +52,7 @@ namespace Umbraco.Web.Strategies // note that some threads could read from it while we hold the lock, though lock (XmlContentInternalSyncLock) { - // modify a clone of the cache because even though we're into the write-lock - // we may have threads reading at the same time. why is this an option? - XmlDocument wip = UmbracoSettings.CloneXmlCacheOnPublish - ? CloneXmlDoc(XmlContent) - : XmlContent; + XmlDocument wip = XmlContent; ClearContextCache(); @@ -178,12 +174,6 @@ namespace Umbraco.Web.Strategies return xmlContentCopy; } - private XmlDocument CloneXmlDoc(XmlDocument xmlDoc) - { - var xmlCopy = (XmlDocument)xmlDoc.CloneNode(true); - return xmlCopy; - } - /// /// Clear HTTPContext cache if any /// @@ -239,5 +229,10 @@ namespace Umbraco.Web.Strategies } set { _httpContext.Items[XmlContextContentItemKey] = value; } } + + internal void Unsubscribe() + { + PublishingStrategy.Published -= PublishingStrategy_Published; + } } } \ No newline at end of file