From d7901946829ec35dc9846707dcecb0088808a296 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 4 Aug 2015 17:36:03 +0200 Subject: [PATCH 1/4] Fixes: U4-6918 App_Plugins folder needs to be created properly on app start --- src/Umbraco.Web/UmbracoApplication.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/UmbracoApplication.cs b/src/Umbraco.Web/UmbracoApplication.cs index 37de741007..0f6fc03b80 100644 --- a/src/Umbraco.Web/UmbracoApplication.cs +++ b/src/Umbraco.Web/UmbracoApplication.cs @@ -30,9 +30,13 @@ namespace Umbraco.Web base.OnApplicationStarted(sender, e); if (ApplicationContext.Current.IsConfigured && GlobalSettings.DebugMode) - { - _mw = new ManifestWatcher(LoggerResolver.Current.Logger); - _mw.Start(Directory.GetDirectories(IOHelper.MapPath("~/App_Plugins/"))); + { + var appPluginFolder = IOHelper.MapPath("~/App_Plugins/"); + if (Directory.Exists(appPluginFolder)) + { + _mw = new ManifestWatcher(LoggerResolver.Current.Logger); + _mw.Start(Directory.GetDirectories(IOHelper.MapPath("~/App_Plugins/"))); + } } } From b05363820443d0238b2262030869f550544b1adf Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 5 Aug 2015 11:50:20 +0200 Subject: [PATCH 2/4] Fixes: U4-6866 getDescendants of template, N+1 issues for template repo (U4-5618 Repository level performance enhancements - remaining N+1 queries) --- .../Persistence/Factories/TemplateFactory.cs | 1 - .../Interfaces/ITemplateRepository.cs | 9 +- .../Repositories/TemplateRepository.cs | 233 +++++++++++------ src/Umbraco.Core/Services/FileService.cs | 47 ++++ src/Umbraco.Core/Services/IFileService.cs | 30 ++- .../Repositories/TemplateRepositoryTest.cs | 244 +++++++++++++----- 6 files changed, 408 insertions(+), 156 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs b/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs index 1e59c8e920..52499bee7d 100644 --- a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs @@ -48,7 +48,6 @@ namespace Umbraco.Core.Persistence.Factories template.IsMasterTemplate = true; } - //TODO: Change this to ParentId: http://issues.umbraco.org/issue/U4-5846 if(dto.NodeDto.ParentId > 0) template.MasterTemplateId = new Lazy(() => dto.NodeDto.ParentId); diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs index 4366aaa4a6..14957ac49f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories @@ -10,12 +11,17 @@ namespace Umbraco.Core.Persistence.Repositories IEnumerable GetAll(params string[] aliases); IEnumerable GetChildren(int masterTemplateId); + IEnumerable GetChildren(string alias); + + IEnumerable GetDescendants(int masterTemplateId); + IEnumerable GetDescendants(string alias); /// /// Returns a template as a template node which can be traversed (parent, children) /// /// /// + [Obsolete("Use GetDescendants instead")] TemplateNode GetTemplateNode(string alias); /// @@ -24,6 +30,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + [Obsolete("Use GetDescendants instead")] TemplateNode FindTemplateInTree(TemplateNode anyNode, string alias); /// diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 235c18a7a8..53e9954fd0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -67,7 +67,15 @@ namespace Umbraco.Core.Persistence.Repositories protected override ITemplate PerformGet(int id) { - return GetAll(new[] { id }).FirstOrDefault(); + var sql = GetBaseQuery(false).Where(x => x.NodeId == id); + var result = Database.Fetch(sql).FirstOrDefault(); + if (result == null) return null; + + //look up the simple template definitions that have a master template assigned, this is used + // later to populate the template item's properties + var childIds = GetAxisDefinitions(result).ToArray(); + + return MapFromDto(result, childIds); } protected override IEnumerable PerformGetAll(params int[] ids) @@ -89,20 +97,15 @@ namespace Umbraco.Core.Persistence.Repositories //look up the simple template definitions that have a master template assigned, this is used // later to populate the template item's properties - var childIdsSql = new Sql() - .Select("nodeId,alias,parentID") - .From() - .InnerJoin() - .On(dto => dto.NodeId, dto => dto.NodeId) - .Where(t => t.ParentId > 0); - var childIds = Database.Fetch(childIdsSql) - .Select(x => new UmbracoEntity + var childIds = (ids.Any() + ? GetAxisDefinitions(dtos.ToArray()) + : dtos.Select(x => new UmbracoEntity { - Id = x.nodeId, - ParentId = x.parentID, - Name = x.alias - }); - + Id = x.NodeId, + ParentId = x.NodeDto.ParentId, + Name = x.Alias + })).ToArray(); + return dtos.Select(d => MapFromDto(d, childIds)); } @@ -118,19 +121,7 @@ namespace Umbraco.Core.Persistence.Repositories //look up the simple template definitions that have a master template assigned, this is used // later to populate the template item's properties - var childIdsSql = new Sql() - .Select("nodeId,alias,parentID") - .From() - .InnerJoin() - .On(dto => dto.NodeId, dto => dto.NodeId) - .Where(t => t.ParentId > 0); - var childIds = Database.Fetch(childIdsSql) - .Select(x => new UmbracoEntity - { - Id = x.nodeId, - ParentId = x.parentID, - Name = x.alias - }); + var childIds = GetAxisDefinitions(dtos.ToArray()).ToArray(); return dtos.Select(d => MapFromDto(d, childIds)); } @@ -143,9 +134,9 @@ namespace Umbraco.Core.Persistence.Repositories { var sql = new Sql(); sql.Select(isCount ? "COUNT(*)" : "*") - .From() - .InnerJoin() - .On(left => left.NodeId, right => right.NodeId) + .From(SqlSyntax) + .InnerJoin(SqlSyntax) + .On(SqlSyntax, left => left.NodeId, right => right.NodeId) .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; } @@ -348,22 +339,52 @@ namespace Umbraco.Core.Persistence.Repositories #endregion - private ITemplate MapFromDto(TemplateDto dto, IEnumerable childDefinitions) + private IEnumerable GetAxisDefinitions(params TemplateDto[] templates) + { + //look up the simple template definitions that have a master template assigned, this is used + // later to populate the template item's properties + var childIdsSql = new Sql() + .Select("nodeId,alias,parentID") + .From(SqlSyntax) + .InnerJoin(SqlSyntax) + .On(SqlSyntax, dto => dto.NodeId, dto => dto.NodeId) + //lookup axis's + .Where("umbracoNode." + SqlSyntax.GetQuotedColumnName("id") + " IN (@parentIds) OR umbracoNode.parentID IN (@childIds)", + new {parentIds = templates.Select(x => x.NodeDto.ParentId), childIds = templates.Select(x => x.NodeId)}); + + var childIds = Database.Fetch(childIdsSql) + .Select(x => new UmbracoEntity + { + Id = x.nodeId, + ParentId = x.parentID, + Name = x.alias + }); + return childIds; + } + + /// + /// Maps from a dto to an ITemplate + /// + /// + /// + /// This is a collection of template definitions ... either all templates, or the collection of child templates and it's parent template + /// + /// + private ITemplate MapFromDto(TemplateDto dto, IUmbracoEntity[] axisDefinitions) { string csViewName = string.Concat(dto.Alias, ".cshtml"); string vbViewName = string.Concat(dto.Alias, ".vbhtml"); string masterpageName = string.Concat(dto.Alias, ".master"); var factory = new TemplateFactory(); - var template = factory.BuildEntity(dto, childDefinitions); + var template = factory.BuildEntity(dto, axisDefinitions); if (dto.NodeDto.ParentId > 0) { - //TODO: Fix this n+1 query! - var masterTemplate = Get(dto.NodeDto.ParentId); + var masterTemplate = axisDefinitions.FirstOrDefault(x => x.Id == dto.NodeDto.ParentId); if (masterTemplate != null) { - template.MasterTemplateAlias = masterTemplate.Alias; + template.MasterTemplateAlias = masterTemplate.Name; template.MasterTemplateId = new Lazy(() => dto.NodeDto.ParentId); } } @@ -460,49 +481,105 @@ namespace Umbraco.Core.Persistence.Repositories if (dto == null) return null; - return Get(dto.NodeId); + return MapFromDto(dto, GetAxisDefinitions(dto).ToArray()); } public IEnumerable GetAll(params string[] aliases) { + var sql = GetBaseQuery(false); + if (aliases.Any()) { - foreach (var id in aliases) - { - yield return Get(id); - } - } - else - { - var nodeDtos = Database.Fetch("WHERE nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); - foreach (var nodeDto in nodeDtos) - { - yield return Get(nodeDto.NodeId); - } + sql.Where("cmsTemplate.alias IN (@aliases)", new {aliases = aliases}); } + var dtos = Database.Fetch(sql).ToArray(); + var axisDefos = GetAxisDefinitions(dtos).ToArray(); + return dtos.Select(x => MapFromDto(x, axisDefos)); } public IEnumerable GetChildren(int masterTemplateId) { - //TODO: Fix this N+1! - - List found; - if (masterTemplateId == -1) + var sql = GetBaseQuery(false); + if (masterTemplateId <= 0) { - var sql = GetBaseQuery(false).Where(x => x.ParentId <= 0); - found = Database.Fetch(sql); + sql.Where(x => x.ParentId <= 0); } else { - var sql = GetBaseQuery(false).Where(x => x.ParentId == masterTemplateId); - found = Database.Fetch(sql); + sql.Where(x => x.ParentId == masterTemplateId); } - foreach (var templateDto in found) + var dtos = Database.Fetch(sql).ToArray(); + var axisDefos = GetAxisDefinitions(dtos).ToArray(); + return dtos.Select(x => MapFromDto(x, axisDefos)); + } + + public IEnumerable GetChildren(string alias) + { + var sql = GetBaseQuery(false); + if (alias.IsNullOrWhiteSpace()) { - yield return Get(templateDto.NodeId); + sql.Where(x => x.ParentId <= 0); } + else + { + //unfortunately SQLCE doesn't support scalar subqueries in the where clause, otherwise we could have done this + // in a single query, now we have to lookup the path to acheive the same thing + var parent = Database.ExecuteScalar(new Sql().Select("nodeId").From(SqlSyntax).Where(dto => dto.Alias == alias)); + if (parent.HasValue == false) return Enumerable.Empty(); + + sql.Where(x => x.ParentId == parent.Value); + } + + var dtos = Database.Fetch(sql).ToArray(); + var axisDefos = GetAxisDefinitions(dtos).ToArray(); + return dtos.Select(x => MapFromDto(x, axisDefos)); + } + + public IEnumerable GetDescendants(int masterTemplateId) + { + var sql = GetBaseQuery(false); + if (masterTemplateId > 0) + { + //unfortunately SQLCE doesn't support scalar subqueries in the where clause, otherwise we could have done this + // in a single query, now we have to lookup the path to acheive the same thing + var path = Database.ExecuteScalar( + new Sql().Select(SqlSyntax.GetQuotedColumnName("path")) + .From(SqlSyntax) + .InnerJoin(SqlSyntax) + .On(SqlSyntax, dto => dto.NodeId, dto => dto.NodeId) + .Where(dto => dto.NodeId == masterTemplateId)); + + if (path.IsNullOrWhiteSpace()) return Enumerable.Empty(); + + sql.Where(@"(umbracoNode." + SqlSyntax.GetQuotedColumnName("path") + @" LIKE @query)", new { query = path + ",%" }); + } + + var dtos = Database.Fetch(sql).ToArray(); + var axisDefos = GetAxisDefinitions(dtos).ToArray(); + return dtos.Select(x => MapFromDto(x, axisDefos)); + + } + + public IEnumerable GetDescendants(string alias) + { + var sql = GetBaseQuery(false); + if (alias.IsNullOrWhiteSpace() == false) + { + //unfortunately SQLCE doesn't support scalar subqueries in the where clause, otherwise we could have done this + // in a single query, now we have to lookup the path to acheive the same thing + var path = Database.ExecuteScalar( + "SELECT umbracoNode.path FROM cmsTemplate INNER JOIN umbracoNode ON cmsTemplate.nodeId = umbracoNode.id WHERE cmsTemplate.alias = @alias", new { alias = alias }); + + if (path.IsNullOrWhiteSpace()) return Enumerable.Empty(); + + sql.Where(@"(umbracoNode." + SqlSyntax.GetQuotedColumnName("path") + @" LIKE @query)", new {query = path + ",%" }); + } + + var dtos = Database.Fetch(sql).ToArray(); + var axisDefos = GetAxisDefinitions(dtos).ToArray(); + return dtos.Select(x => MapFromDto(x, axisDefos)); } /// @@ -510,13 +587,9 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + [Obsolete("Use GetDescendants instead")] public TemplateNode GetTemplateNode(string alias) - { - //in order to do this we need to get all of the templates and then organize, - // TODO: unfortunately our db structure does not use the path correctly for templates so we cannot just look - // up a template tree easily. - //TODO: We do use the 'path' now, so this might be able to be fixed up - + { //first get all template objects var allTemplates = GetAll().ToArray(); @@ -525,23 +598,17 @@ namespace Umbraco.Core.Persistence.Repositories { return null; } - - //then we need to get all template Dto's because those contain the master property - var sql = GetBaseQuery(false); - var allDtos = Database.Fetch(sql).ToArray(); - var selfDto = allDtos.Single(x => x.NodeId == selfTemplate.Id); - - //need to get the top-most node of the current tree - var top = selfDto; - while (top.NodeDto.ParentId > 0) + + var top = selfTemplate; + while (top.MasterTemplateAlias.IsNullOrWhiteSpace() == false) { - top = allDtos.Single(x => x.NodeId == top.NodeDto.ParentId); + top = allTemplates.Single(x => x.Alias == top.MasterTemplateAlias); } - var topNode = new TemplateNode(allTemplates.Single(x => x.Id == top.NodeId)); - var childIds = allDtos.Where(x => x.NodeDto.ParentId == top.NodeId).Select(x => x.NodeId); + var topNode = new TemplateNode(allTemplates.Single(x => x.Id == top.Id)); + var childTemplates = allTemplates.Where(x => x.MasterTemplateAlias == top.Alias); //This now creates the hierarchy recursively - topNode.Children = CreateChildren(topNode, childIds, allTemplates, allDtos); + topNode.Children = CreateChildren(topNode, childTemplates, allTemplates); //now we'll return the TemplateNode requested return FindTemplateInTree(topNode, alias); @@ -568,6 +635,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + [Obsolete("Use GetDescendants instead")] public TemplateNode FindTemplateInTree(TemplateNode anyNode, string alias) { //first get the root @@ -658,12 +726,12 @@ namespace Umbraco.Core.Persistence.Repositories return validFile && validExtension; } - private static IEnumerable CreateChildren(TemplateNode parent, IEnumerable childIds, ITemplate[] allTemplates, TemplateDto[] allDtos) + private static IEnumerable CreateChildren(TemplateNode parent, IEnumerable childTemplates, ITemplate[] allTemplates) { var children = new List(); - foreach (var i in childIds) + foreach (var childTemplate in childTemplates) { - var template = allTemplates.Single(x => x.Id == i); + var template = allTemplates.Single(x => x.Id == childTemplate.Id); var child = new TemplateNode(template) { Parent = parent @@ -673,10 +741,11 @@ namespace Umbraco.Core.Persistence.Repositories children.Add(child); //get this node's children - var kids = allDtos.Where(x => x.NodeDto.ParentId == i).Select(x => x.NodeId).ToArray(); + var local = childTemplate; + var kids = allTemplates.Where(x => x.MasterTemplateAlias == local.Alias); //recurse - child.Children = CreateChildren(child, kids, allTemplates, allDtos); + child.Children = CreateChildren(child, kids, allTemplates); } return children; } diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 29ccfbf6bf..4dcbd5bdc8 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -319,6 +319,53 @@ namespace Umbraco.Core.Services } } + public IEnumerable GetTemplateDescendants(string alias) + { + using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + { + return repository.GetDescendants(alias); + } + } + + /// + /// Gets the template descendants + /// + /// + /// + public IEnumerable GetTemplateDescendants(int masterTemplateId) + { + using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + { + return repository.GetDescendants(masterTemplateId); + } + } + + /// + /// Gets the template children + /// + /// + /// + public IEnumerable GetTemplateChildren(string alias) + { + using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + { + return repository.GetChildren(alias); + } + } + + /// + /// Gets the template children + /// + /// + /// + public IEnumerable GetTemplateChildren(int masterTemplateId) + { + using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + { + return repository.GetChildren(masterTemplateId); + } + } + /// /// Returns a template as a template node which can be traversed (parent, children) /// diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 7803abe98e..e1c0f1428c 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -130,10 +130,38 @@ namespace Umbraco.Core.Services ITemplate GetTemplate(int id); /// - /// Returns a template as a template node which can be traversed (parent, children) + /// Gets the template descendants /// /// /// + IEnumerable GetTemplateDescendants(string alias); + + /// + /// Gets the template descendants + /// + /// + /// + IEnumerable GetTemplateDescendants(int masterTemplateId); + + /// + /// Gets the template children + /// + /// + /// + IEnumerable GetTemplateChildren(string alias); + + /// + /// Gets the template children + /// + /// + /// + IEnumerable GetTemplateChildren(int masterTemplateId); + + /// + /// Returns a template as a template node which can be traversed (parent, children) + /// + /// + /// TemplateNode GetTemplateNode(string alias); /// diff --git a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs index fb76f4402b..4fae9938cb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -489,77 +490,7 @@ namespace Umbraco.Tests.Persistence.Repositories var unitOfWork = provider.GetUnitOfWork(); using (var repository = CreateRepository(unitOfWork)) { - var parent = new Template("parent", "parent") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - - var child1 = new Template("child1", "child1") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - var toddler1 = new Template("toddler1", "toddler1") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - var toddler2 = new Template("toddler2", "toddler2") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - var baby1 = new Template("baby1", "baby1") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - - var child2 = new Template("child2", "child2") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - var toddler3 = new Template("toddler3", "toddler3") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - var toddler4 = new Template("toddler4", "toddler4") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - var baby2 = new Template("baby2", "baby2") - { - Content = @"<%@ Master Language=""C#"" %>" - }; - - - child1.MasterTemplateAlias = parent.Alias; - child1.MasterTemplateId = new Lazy(() => parent.Id); - child2.MasterTemplateAlias = parent.Alias; - child2.MasterTemplateId = new Lazy(() => parent.Id); - - toddler1.MasterTemplateAlias = child1.Alias; - toddler1.MasterTemplateId = new Lazy(() => child1.Id); - toddler2.MasterTemplateAlias = child1.Alias; - toddler2.MasterTemplateId = new Lazy(() => child1.Id); - - toddler3.MasterTemplateAlias = child2.Alias; - toddler3.MasterTemplateId = new Lazy(() => child2.Id); - toddler4.MasterTemplateAlias = child2.Alias; - toddler4.MasterTemplateId = new Lazy(() => child2.Id); - - baby1.MasterTemplateAlias = toddler2.Alias; - baby1.MasterTemplateId = new Lazy(() => toddler2.Id); - - baby2.MasterTemplateAlias = toddler4.Alias; - baby2.MasterTemplateId = new Lazy(() => toddler4.Id); - - repository.AddOrUpdate(parent); - repository.AddOrUpdate(child1); - repository.AddOrUpdate(child2); - repository.AddOrUpdate(toddler1); - repository.AddOrUpdate(toddler2); - repository.AddOrUpdate(toddler3); - repository.AddOrUpdate(toddler4); - repository.AddOrUpdate(baby1); - repository.AddOrUpdate(baby2); - unitOfWork.Commit(); + CreateHierarchy(repository, unitOfWork); // Act var rootNode = repository.GetTemplateNode("parent"); @@ -575,8 +506,102 @@ namespace Umbraco.Tests.Persistence.Repositories Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "baby1")); Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "baby2")); } + } + + [Test] + public void Can_Get_All() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repository = CreateRepository(unitOfWork)) + { + var created = CreateHierarchy(repository, unitOfWork).ToArray(); + + // Act + var all = repository.GetAll(); + var allByAlias = repository.GetAll("parent", "child2", "baby2", "notFound"); + var allById = repository.GetAll(created[0].Id, created[2].Id, created[4].Id, created[5].Id, 999999); + + // Assert + Assert.AreEqual(9, all.Count()); + Assert.AreEqual(9, all.DistinctBy(x => x.Id).Count()); + + Assert.AreEqual(3, allByAlias.Count()); + Assert.AreEqual(3, allByAlias.DistinctBy(x => x.Id).Count()); + + Assert.AreEqual(4, allById.Count()); + Assert.AreEqual(4, allById.DistinctBy(x => x.Id).Count()); + } + } + + [Test] + public void Can_Get_Children() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repository = CreateRepository(unitOfWork)) + { + var created = CreateHierarchy(repository, unitOfWork).ToArray(); + + // Act + var childrenById = repository.GetChildren(created[1].Id); + var childrenByAlias = repository.GetChildren(created[1].Alias); + // Assert + Assert.AreEqual(2, childrenById.Count()); + Assert.AreEqual(2, childrenById.DistinctBy(x => x.Id).Count()); + Assert.AreEqual(2, childrenByAlias.Count()); + Assert.AreEqual(2, childrenByAlias.DistinctBy(x => x.Id).Count()); + + } + } + + [Test] + public void Can_Get_Children_At_Root() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repository = CreateRepository(unitOfWork)) + { + CreateHierarchy(repository, unitOfWork).ToArray(); + + // Act + var children = repository.GetChildren(-1); + + + // Assert + Assert.AreEqual(1, children.Count()); + Assert.AreEqual(1, children.DistinctBy(x => x.Id).Count()); + + } + } + + [Test] + public void Can_Get_Descendants() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repository = CreateRepository(unitOfWork)) + { + var created = CreateHierarchy(repository, unitOfWork).ToArray(); + + // Act + var descendantsById = repository.GetDescendants(created[1].Id); + var descendantsByAlias = repository.GetDescendants(created[1].Alias); + + + // Assert + Assert.AreEqual(3, descendantsById.Count()); + Assert.AreEqual(3, descendantsById.DistinctBy(x => x.Id).Count()); + + Assert.AreEqual(3, descendantsByAlias.Count()); + Assert.AreEqual(3, descendantsByAlias.DistinctBy(x => x.Id).Count()); + } } [Test] @@ -717,5 +742,82 @@ namespace Umbraco.Tests.Persistence.Repositories return stream; } + + private IEnumerable CreateHierarchy(ITemplateRepository repository, IDatabaseUnitOfWork unitOfWork) + { + var parent = new Template("parent", "parent") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + + var child1 = new Template("child1", "child1") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + var toddler1 = new Template("toddler1", "toddler1") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + var toddler2 = new Template("toddler2", "toddler2") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + var baby1 = new Template("baby1", "baby1") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + + var child2 = new Template("child2", "child2") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + var toddler3 = new Template("toddler3", "toddler3") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + var toddler4 = new Template("toddler4", "toddler4") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + var baby2 = new Template("baby2", "baby2") + { + Content = @"<%@ Master Language=""C#"" %>" + }; + + + child1.MasterTemplateAlias = parent.Alias; + child1.MasterTemplateId = new Lazy(() => parent.Id); + child2.MasterTemplateAlias = parent.Alias; + child2.MasterTemplateId = new Lazy(() => parent.Id); + + toddler1.MasterTemplateAlias = child1.Alias; + toddler1.MasterTemplateId = new Lazy(() => child1.Id); + toddler2.MasterTemplateAlias = child1.Alias; + toddler2.MasterTemplateId = new Lazy(() => child1.Id); + + toddler3.MasterTemplateAlias = child2.Alias; + toddler3.MasterTemplateId = new Lazy(() => child2.Id); + toddler4.MasterTemplateAlias = child2.Alias; + toddler4.MasterTemplateId = new Lazy(() => child2.Id); + + baby1.MasterTemplateAlias = toddler2.Alias; + baby1.MasterTemplateId = new Lazy(() => toddler2.Id); + + baby2.MasterTemplateAlias = toddler4.Alias; + baby2.MasterTemplateId = new Lazy(() => toddler4.Id); + + repository.AddOrUpdate(parent); + repository.AddOrUpdate(child1); + repository.AddOrUpdate(child2); + repository.AddOrUpdate(toddler1); + repository.AddOrUpdate(toddler2); + repository.AddOrUpdate(toddler3); + repository.AddOrUpdate(toddler4); + repository.AddOrUpdate(baby1); + repository.AddOrUpdate(baby2); + unitOfWork.Commit(); + + return new[] {parent, child1, child2, toddler1, toddler2, toddler3, toddler4, baby1, baby2}; + } } } \ No newline at end of file From f03ee9f908c5c920b53faac2f995576c17633cb3 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 5 Aug 2015 12:10:13 +0200 Subject: [PATCH 3/4] Fixes routing tests and reverts to simplified routing logic based on the Language ISO code returned from the IDomain object. --- .../ContentFinderByNiceUrlWithDomainsTests.cs | 14 +++--- .../Routing/DomainsAndCulturesTests.cs | 45 ++++++++++++------- .../NiceUrlsProviderWithDomainsTests.cs | 34 +++++++------- .../Routing/UrlRoutingTestBase.cs | 17 ++----- .../Routing/UrlsWithNestedDomains.cs | 4 +- src/Umbraco.Web/Models/ContentExtensions.cs | 19 ++------ .../Routing/ContentFinderByLegacy404.cs | 3 +- .../Routing/NotFoundHandlerHelper.cs | 4 +- .../umbraco.presentation/NotFoundHandlers.cs | 3 +- 9 files changed, 67 insertions(+), 76 deletions(-) diff --git a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs index ea6e096fbf..0b616af276 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs @@ -13,7 +13,7 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("domain1.com/") {Id = 1, LanguageId = LangDeId, RootContentId = 1001} + new UmbracoDomain("domain1.com/") {Id = 1, LanguageId = LangDeId, RootContentId = 1001, LanguageIsoCode = "de-DE"} }); } @@ -22,12 +22,12 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("domain1.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1001}, - new UmbracoDomain("domain1.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011}, - new UmbracoDomain("domain1.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012}, - new UmbracoDomain("http://domain3.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1003}, - new UmbracoDomain("http://domain3.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10031}, - new UmbracoDomain("http://domain3.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10032} + new UmbracoDomain("domain1.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1001, LanguageIsoCode = "en-US"}, + new UmbracoDomain("domain1.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"}, + new UmbracoDomain("domain1.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"}, + new UmbracoDomain("http://domain3.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1003, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain3.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10031, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain3.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10032, LanguageIsoCode = "fr-FR"} }); } diff --git a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs index 6af00d6127..b0f4791c84 100644 --- a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs +++ b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs @@ -30,19 +30,22 @@ namespace Umbraco.Tests.Routing { Id = 1, LanguageId = LangDeId, - RootContentId = 1001 + RootContentId = 1001, + LanguageIsoCode = "de-DE" }, new UmbracoDomain("domain1.com/en") { Id = 1, LanguageId = LangEngId, - RootContentId = 10011 + RootContentId = 10011, + LanguageIsoCode = "en-US" }, new UmbracoDomain("domain1.com/fr") { Id = 1, LanguageId = LangFrId, - RootContentId = 10012 + RootContentId = 10012, + LanguageIsoCode = "fr-FR" } }); } @@ -55,55 +58,64 @@ namespace Umbraco.Tests.Routing { Id = 1, LanguageId = LangDeId, - RootContentId = 1001 + RootContentId = 1001, + LanguageIsoCode = "de-DE" }, new UmbracoDomain("domain1.com/en") { Id = 1, LanguageId = LangEngId, - RootContentId = 10011 + RootContentId = 10011, + LanguageIsoCode = "en-US" }, new UmbracoDomain("domain1.com/fr") { Id = 1, LanguageId = LangFrId, - RootContentId = 10012 + RootContentId = 10012, + LanguageIsoCode = "fr-FR" }, new UmbracoDomain("*1001") { Id = 1, LanguageId = LangDeId, - RootContentId = 1001 + RootContentId = 1001, + LanguageIsoCode = "de-DE" }, new UmbracoDomain("*10011") { Id = 1, LanguageId = LangCzId, - RootContentId = 10011 + RootContentId = 10011, + LanguageIsoCode = "cs-CZ" }, new UmbracoDomain("*100112") { Id = 1, LanguageId = LangNlId, - RootContentId = 100112 + RootContentId = 100112, + LanguageIsoCode = "nl-NL" }, new UmbracoDomain("*1001122") { Id = 1, LanguageId = LangDkId, - RootContentId = 1001122 + RootContentId = 1001122, + LanguageIsoCode = "da-DK" }, new UmbracoDomain("*10012") { Id = 1, LanguageId = LangNlId, - RootContentId = 10012 + RootContentId = 10012, + LanguageIsoCode = "nl-NL" }, new UmbracoDomain("*10031") { Id = 1, LanguageId = LangNlId, - RootContentId =10031 + RootContentId =10031, + LanguageIsoCode = "nl-NL" } }); } @@ -343,19 +355,22 @@ namespace Umbraco.Tests.Routing { Id = 1, LanguageId = LangEngId, - RootContentId = 1001 + RootContentId = 1001, + LanguageIsoCode = "en-US" }, new UmbracoDomain("domain1.fr/") { Id = 1, LanguageId = LangFrId, - RootContentId = 1001 + RootContentId = 1001, + LanguageIsoCode = "fr-FR" }, new UmbracoDomain("*100112") { Id = 1, LanguageId = LangDeId, - RootContentId = 100112 + RootContentId = 100112, + LanguageIsoCode = "de-DE" } }); diff --git a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs index ffbed3e2f4..8cc975954b 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs @@ -28,7 +28,7 @@ namespace Umbraco.Tests.Routing SetupDomainServiceMock(new[] { - new UmbracoDomain("domain1.com") {Id = 1, LanguageId = LangFrId, RootContentId = 1001} + new UmbracoDomain("domain1.com") {Id = 1, LanguageId = LangFrId, RootContentId = 1001, LanguageIsoCode = "fr-FR"} }); } @@ -36,7 +36,7 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("http://domain1.com/foo") {Id = 1, LanguageId = LangFrId, RootContentId = 1001} + new UmbracoDomain("http://domain1.com/foo") {Id = 1, LanguageId = LangFrId, RootContentId = 1001, LanguageIsoCode = "fr-FR"} }); } @@ -44,7 +44,7 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("http://domain1.com/") {Id = 1, LanguageId = LangFrId, RootContentId = 10011} + new UmbracoDomain("http://domain1.com/") {Id = 1, LanguageId = LangFrId, RootContentId = 10011, LanguageIsoCode = "fr-FR"} }); } @@ -52,12 +52,12 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("http://domain1.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1001}, - new UmbracoDomain("http://domain1.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011}, - new UmbracoDomain("http://domain1.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012}, - new UmbracoDomain("http://domain3.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1003}, - new UmbracoDomain("http://domain3.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10031}, - new UmbracoDomain("http://domain3.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10032} + new UmbracoDomain("http://domain1.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1001, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain1.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain1.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"}, + new UmbracoDomain("http://domain3.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1003, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain3.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10031, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain3.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10032, LanguageIsoCode = "fr-FR"} }); } @@ -65,14 +65,14 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("http://domain1.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011}, - new UmbracoDomain("http://domain1a.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011}, - new UmbracoDomain("http://domain1b.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011}, - new UmbracoDomain("http://domain1.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012}, - new UmbracoDomain("http://domain1a.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012}, - new UmbracoDomain("http://domain1b.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012}, - new UmbracoDomain("http://domain3.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10031}, - new UmbracoDomain("http://domain3.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10032} + new UmbracoDomain("http://domain1.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain1a.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain1b.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain1.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"}, + new UmbracoDomain("http://domain1a.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"}, + new UmbracoDomain("http://domain1b.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"}, + new UmbracoDomain("http://domain3.com/en") {Id = 1, LanguageId = LangEngId, RootContentId = 10031, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain3.com/fr") {Id = 1, LanguageId = LangFrId, RootContentId = 10032, LanguageIsoCode = "fr-FR"} }); } diff --git a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs index 643d007889..475909318a 100644 --- a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs +++ b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs @@ -42,19 +42,10 @@ namespace Umbraco.Tests.Routing domainService.Setup(service => service.GetAll(It.IsAny())) .Returns((bool incWildcards) => new[] { - new UmbracoDomain("domain1.com/"){Id = 1, LanguageId = 333, RootContentId = 1001}, - new UmbracoDomain("domain1.com/en"){Id = 1, LanguageId = 334, RootContentId = 10011}, - new UmbracoDomain("domain1.com/fr"){Id = 1, LanguageId = 335, RootContentId = 10012} - }); - - var langService = Mock.Get(svcCtx.LocalizationService); - //setup mock domain service - langService.Setup(service => service.GetLanguageById(LangDeId)).Returns(new Language("de-DE") {Id = LangDeId }); - langService.Setup(service => service.GetLanguageById(LangEngId)).Returns(new Language("en-US") { Id = LangEngId }); - langService.Setup(service => service.GetLanguageById(LangFrId)).Returns(new Language("fr-FR") { Id = LangFrId }); - langService.Setup(service => service.GetLanguageById(LangCzId)).Returns(new Language("cs-CZ") { Id = LangCzId }); - langService.Setup(service => service.GetLanguageById(LangNlId)).Returns(new Language("nl-NL") { Id = LangNlId }); - langService.Setup(service => service.GetLanguageById(LangDkId)).Returns(new Language("da-DK") { Id = LangDkId }); + new UmbracoDomain("domain1.com/"){Id = 1, LanguageId = LangDeId, RootContentId = 1001, LanguageIsoCode = "de-DE"}, + new UmbracoDomain("domain1.com/en"){Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"}, + new UmbracoDomain("domain1.com/fr"){Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"} + }); return svcCtx; } diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index 79feac0b28..2e868f9f44 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -80,8 +80,8 @@ namespace Umbraco.Tests.Routing { SetupDomainServiceMock(new[] { - new UmbracoDomain("http://domain1.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1001}, - new UmbracoDomain("http://domain2.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 10011} + new UmbracoDomain("http://domain1.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 1001, LanguageIsoCode = "en-US"}, + new UmbracoDomain("http://domain2.com/") {Id = 1, LanguageId = LangEngId, RootContentId = 10011, LanguageIsoCode = "en-US"} }); } diff --git a/src/Umbraco.Web/Models/ContentExtensions.cs b/src/Umbraco.Web/Models/ContentExtensions.cs index ef5161ec9d..37fe9151b0 100644 --- a/src/Umbraco.Web/Models/ContentExtensions.cs +++ b/src/Umbraco.Web/Models/ContentExtensions.cs @@ -80,25 +80,14 @@ namespace Umbraco.Web.Models : domainHelper.DomainForNode(int.Parse(route.Substring(0, pos)), current).UmbracoDomain; } - if (domain == null) + if (domain == null || domain.LanguageIsoCode.IsNullOrWhiteSpace()) return GetDefaultCulture(localizationService); - //NOTE: The domain service IDomain model has changed and no longer holds a reference to IContent or ILanguage to - // improve performance, this means that we need to lookup the language below, but this was already the case previously - // in the repository and since the language lookup is cached it should be ok. If we want however we could create - // another method on the DomainService to return domains with their culture info on them var wcDomain = DomainHelper.FindWildcardDomainInPath(domainService.GetAll(true), contentPath, domain.RootContentId); - if (wcDomain != null && wcDomain.LanguageIsoCode.IsNullOrWhiteSpace() == false) - { - return new CultureInfo(wcDomain.LanguageIsoCode); - } - if (domain.LanguageIsoCode.IsNullOrWhiteSpace() == false) - { - return new CultureInfo(domain.LanguageIsoCode); - } - - return GetDefaultCulture(localizationService); + return wcDomain == null + ? new CultureInfo(domain.LanguageIsoCode) + : new CultureInfo(wcDomain.LanguageIsoCode); } private static CultureInfo GetDefaultCulture(ILocalizationService localizationService) diff --git a/src/Umbraco.Web/Routing/ContentFinderByLegacy404.cs b/src/Umbraco.Web/Routing/ContentFinderByLegacy404.cs index aae16b5fa9..22c4364891 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByLegacy404.cs +++ b/src/Umbraco.Web/Routing/ContentFinderByLegacy404.cs @@ -28,8 +28,7 @@ namespace Umbraco.Web.Routing pcr.RoutingContext.UmbracoContext.HttpContext.Request.ServerVariables["SERVER_NAME"], pcr.RoutingContext.UmbracoContext.Application.Services.EntityService, new PublishedContentQuery(pcr.RoutingContext.UmbracoContext.ContentCache, pcr.RoutingContext.UmbracoContext.MediaCache), - pcr.RoutingContext.UmbracoContext.Application.Services.DomainService, - pcr.RoutingContext.UmbracoContext.Application.Services.LocalizationService); + pcr.RoutingContext.UmbracoContext.Application.Services.DomainService); IPublishedContent content = null; diff --git a/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs b/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs index 798efc674d..50497ba032 100644 --- a/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs +++ b/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs @@ -230,15 +230,13 @@ namespace Umbraco.Web.Routing /// /// /// - /// /// internal static int? GetCurrentNotFoundPageId( IContentErrorPage[] error404Collection, string requestServerName, IEntityService entityService, ITypedPublishedContentQuery publishedContentQuery, - IDomainService domainService, - ILocalizationService localizationService) + IDomainService domainService) { if (error404Collection.Count() > 1) { diff --git a/src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs b/src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs index 6854bb9a4d..27e62888d4 100644 --- a/src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs +++ b/src/Umbraco.Web/umbraco.presentation/NotFoundHandlers.cs @@ -326,8 +326,7 @@ namespace umbraco { HttpContext.Current.Request.ServerVariables["SERVER_NAME"], ApplicationContext.Current.Services.EntityService, new PublishedContentQuery(UmbracoContext.Current.ContentCache, UmbracoContext.Current.MediaCache), - ApplicationContext.Current.Services.DomainService, - ApplicationContext.Current.Services.LocalizationService); + ApplicationContext.Current.Services.DomainService); if (error404.HasValue) { From 34fd405bca450d4cc9d0332261ea53c8f3ca60de Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 5 Aug 2015 13:35:42 +0200 Subject: [PATCH 4/4] Downgrades AutoMapper to the version before the assembly was signed (breaking!), we're stuck on < 3.1 because Automapper decided to sign an assembly in a minor version, nothing we can do till v8 --- build/NuSpecs/UmbracoCms.Core.nuspec | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 13 ++++++------- src/Umbraco.Core/packages.config | 2 +- src/Umbraco.Tests/Umbraco.Tests.csproj | 13 ++++++------- src/Umbraco.Tests/packages.config | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 13 ++++++------- src/Umbraco.Web.UI/config/ClientDependency.config | 2 +- src/Umbraco.Web.UI/config/Dashboard.config | 14 ++++++++++---- src/Umbraco.Web.UI/packages.config | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 13 ++++++------- src/Umbraco.Web/packages.config | 2 +- src/umbraco.businesslogic/packages.config | 2 +- .../umbraco.businesslogic.csproj | 13 ++++++------- 13 files changed, 47 insertions(+), 46 deletions(-) diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index 6067cade4a..4fe812dbeb 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -30,7 +30,7 @@ - + diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index c51732fb6f..15fe2da84b 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -37,13 +37,13 @@ false - - False - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll + True - - False - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll + True False @@ -1386,7 +1386,6 @@ - - + - \ No newline at end of file diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 6cdd67fe04..f3ecf6b064 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.businesslogic/packages.config b/src/umbraco.businesslogic/packages.config index 65ef682839..4a0a1d249b 100644 --- a/src/umbraco.businesslogic/packages.config +++ b/src/umbraco.businesslogic/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.businesslogic/umbraco.businesslogic.csproj b/src/umbraco.businesslogic/umbraco.businesslogic.csproj index c34a55d08b..e134c33eab 100644 --- a/src/umbraco.businesslogic/umbraco.businesslogic.csproj +++ b/src/umbraco.businesslogic/umbraco.businesslogic.csproj @@ -106,13 +106,13 @@ false - - False - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll + True - - False - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll + True False @@ -295,5 +295,4 @@ - \ No newline at end of file