diff --git a/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs b/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs index 8caaaf56ae..fdad013354 100644 --- a/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs +++ b/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs @@ -46,6 +46,7 @@ namespace Umbraco.Core.DependencyInjection container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(); + container.RegisterSingleton(); container.Register(factory => { var mainLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/config/lang/")); diff --git a/src/Umbraco.Core/Logging/ImageProcessorLogger.cs b/src/Umbraco.Core/Logging/ImageProcessorLogger.cs index 02ca9c2949..5bcf119b0d 100644 --- a/src/Umbraco.Core/Logging/ImageProcessorLogger.cs +++ b/src/Umbraco.Core/Logging/ImageProcessorLogger.cs @@ -25,7 +25,7 @@ public void Log(string text, [CallerMemberName] string callerName = null, [CallerLineNumber] int lineNumber = 0) { // Using LogHelper since the ImageProcessor logger expects a parameterless constructor. - var message = string.Format("{0} {1} : {2}", callerName, lineNumber, text); + var message = $"{callerName} {lineNumber} : {text}"; LogHelper.Error(string.Empty, new ImageProcessingException(message)); } @@ -39,7 +39,7 @@ public void Log(Type type, string text, [CallerMemberName] string callerName = null, [CallerLineNumber] int lineNumber = 0) { // Using LogHelper since the ImageProcessor logger expects a parameterless constructor. - var message = string.Format("{0} {1} : {2}", callerName, lineNumber, text); + var message = $"{callerName} {lineNumber} : {text}"; LogHelper.Error(type, string.Empty, new ImageProcessingException(message)); } } diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 2ac994eb3b..9de5afddb4 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -127,11 +127,11 @@ namespace Umbraco.Core.Models /// /// Sets the ParentId from the lazy integer id /// - /// Id of the Parent + /// Id of the Parent internal protected void SetLazyParentId(Lazy parentId) { _parentId = parentId; - OnPropertyChanged(ParentIdSelector); + OnPropertyChanged(Ps.Value.ParentIdSelector); } /// diff --git a/src/Umbraco.Core/Models/Rdbms/RedirectUrlDto.cs b/src/Umbraco.Core/Models/Rdbms/RedirectUrlDto.cs index b23c75aa4b..e709532b91 100644 --- a/src/Umbraco.Core/Models/Rdbms/RedirectUrlDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/RedirectUrlDto.cs @@ -1,5 +1,5 @@ using System; -using Umbraco.Core.Persistence; +using NPoco; using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms diff --git a/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs b/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs index 4ea66b869f..b5340832b5 100644 --- a/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs @@ -7,6 +7,6 @@ namespace Umbraco.Core.Persistence.Migrations /// public interface IMigrationExpression { - string Process(Database database); + string Process(UmbracoDatabase database); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs b/src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs index f6a603c70f..e53cc7b143 100644 --- a/src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs +++ b/src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs @@ -5,39 +5,22 @@ using Umbraco.Core.Persistence.Migrations.Syntax.Alter; using Umbraco.Core.Persistence.Migrations.Syntax.Create; using Umbraco.Core.Persistence.Migrations.Syntax.Delete; using Umbraco.Core.Persistence.Migrations.Syntax.Execute; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations { internal class LocalMigrationContext : MigrationContext { - private readonly ISqlSyntaxProvider _sqlSyntax; + public LocalMigrationContext(UmbracoDatabase database, ILogger logger) + : base(database, logger) + { } - public LocalMigrationContext(DatabaseProviders databaseProvider, Database database, ISqlSyntaxProvider sqlSyntax, ILogger logger) - : base(databaseProvider, database, logger) - { - _sqlSyntax = sqlSyntax; - } + public IExecuteBuilder Execute => new ExecuteBuilder(this); - public IExecuteBuilder Execute - { - get { return new ExecuteBuilder(this, _sqlSyntax); } - } + public IDeleteBuilder Delete => new DeleteBuilder(this); - public IDeleteBuilder Delete - { - get { return new DeleteBuilder(this, _sqlSyntax); } - } + public IAlterSyntaxBuilder Alter => new AlterSyntaxBuilder(this); - public IAlterSyntaxBuilder Alter - { - get { return new AlterSyntaxBuilder(this, _sqlSyntax); } - } - - public ICreateBuilder Create - { - get { return new CreateBuilder(this, _sqlSyntax); } - } + public ICreateBuilder Create => new CreateBuilder(this); public string GetSql() { diff --git a/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs index 838a2f7aba..b39402adba 100644 --- a/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs @@ -36,7 +36,7 @@ namespace Umbraco.Core.Persistence.Migrations || SupportedDatabaseTypes.Any(x => CurrentDatabaseType.GetType().Inherits(x.GetType())); } - public virtual string Process(Database database) + public virtual string Process(UmbracoDatabase database) { return ToString(); } diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs index 7ae8f2e3d7..b9f80b0638 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs @@ -22,7 +22,7 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Execute _context.Expressions.Add(expression); } - public void Code(Func codeStatement) + public void Code(Func codeStatement) { var expression = new ExecuteCodeStatementExpression(_context, _supportedDatabaseTypes) { CodeStatement = codeStatement }; _context.Expressions.Add(expression); diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs index 81a40e24a1..aa4c69d914 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs @@ -9,9 +9,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Execute.Expressions : base(context, supportedDatabaseTypes) { } - public virtual Func CodeStatement { get; set; } + public virtual Func CodeStatement { get; set; } - public override string Process(Database database) + public override string Process(UmbracoDatabase database) { if(CodeStatement != null) return CodeStatement(database); diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs index 1d4c8e3f55..41dfe1ac3b 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs @@ -6,6 +6,6 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Execute public interface IExecuteBuilder : IFluentSyntax { void Sql(string sqlStatement); - void Code(Func codeStatement); + void Code(Func codeStatement); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs index 6663979ee6..a1e9a7b72a 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs @@ -13,7 +13,7 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Rename.Expressions public virtual string OldName { get; set; } public virtual string NewName { get; set; } - public override string Process(Database database) + public override string Process(UmbracoDatabase database) { if (CurrentDatabaseType.IsMySql()) { diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable.cs index d667d2d91f..66822e09f1 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable.cs @@ -1,16 +1,13 @@ using System.Linq; using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.Migrations.Syntax.Create; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZero { [Migration("7.5.0", 100, GlobalSettings.UmbracoMigrationName)] public class AddRedirectUrlTable : MigrationBase { - public AddRedirectUrlTable(ISqlSyntaxProvider sqlSyntax, ILogger logger) - : base(sqlSyntax, logger) + public AddRedirectUrlTable(IMigrationContext context) + : base(context) { } public override void Up() @@ -19,13 +16,13 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer Execute.Code(MigrationCode); } - private string MigrationCode(Database database) + private string MigrationCode(UmbracoDatabase database) { // don't execute if the table is already there var tables = SqlSyntax.GetTablesInSchema(database).ToArray(); if (tables.InvariantContains("umbracoRedirectUrl")) return null; - var localContext = new LocalMigrationContext(Context.CurrentDatabaseProvider, database, SqlSyntax, Logger); + var localContext = new LocalMigrationContext(database, Logger); localContext.Create.Table("umbracoRedirectUrl") .WithColumn("id").AsInt32().Identity().PrimaryKey("PK_umbracoRedirectUrl") diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable2.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable2.cs index 1f204192e1..3da1e0a069 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable2.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable2.cs @@ -1,19 +1,13 @@ using System.Linq; using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.Migrations.Syntax.Alter; -using Umbraco.Core.Persistence.Migrations.Syntax.Create; -using Umbraco.Core.Persistence.Migrations.Syntax.Delete; -using Umbraco.Core.Persistence.Migrations.Syntax.Execute; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZero { [Migration("7.5.0", 101, GlobalSettings.UmbracoMigrationName)] public class AddRedirectUrlTable2 : MigrationBase { - public AddRedirectUrlTable2(ISqlSyntaxProvider sqlSyntax, ILogger logger) - : base(sqlSyntax, logger) + public AddRedirectUrlTable2(IMigrationContext context) + : base(context) { } public override void Up() @@ -22,14 +16,14 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer Execute.Code(MigrationCode); } - private string MigrationCode(Database database) + private string MigrationCode(UmbracoDatabase database) { var columns = SqlSyntax.GetColumnsInSchema(database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoRedirectUrl") && x.ColumnName.InvariantEquals("contentKey"))) return null; - var localContext = new LocalMigrationContext(Context.CurrentDatabaseProvider, database, SqlSyntax, Logger); + var localContext = new LocalMigrationContext(database, Logger); localContext.Execute.Sql("DELETE FROM umbracoRedirectUrl"); // else cannot add non-nullable field diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable3.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable3.cs index a9550301b2..08bf095003 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable3.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable3.cs @@ -1,15 +1,13 @@ using System.Linq; using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZero { [Migration("7.5.0", 102, GlobalSettings.UmbracoMigrationName)] public class AddRedirectUrlTable3 : MigrationBase { - public AddRedirectUrlTable3(ISqlSyntaxProvider sqlSyntax, ILogger logger) - : base(sqlSyntax, logger) + public AddRedirectUrlTable3(IMigrationContext context) + : base(context) { } public override void Up() @@ -17,14 +15,14 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer // defer, because we are making decisions based upon what's in the database Execute.Code(MigrationCode); } - private string MigrationCode(Database database) + private string MigrationCode(UmbracoDatabase database) { var columns = SqlSyntax.GetColumnsInSchema(database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoRedirectUrl") && x.ColumnName.InvariantEquals("hurl"))) return null; - var localContext = new LocalMigrationContext(Context.CurrentDatabaseProvider, database, SqlSyntax, Logger); + var localContext = new LocalMigrationContext(database, Logger); localContext.Execute.Sql("DELETE FROM umbracoRedirectUrl"); // else cannot add non-nullable field diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable4.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable4.cs index e4724fc48f..2404408165 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable4.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/AddRedirectUrlTable4.cs @@ -1,15 +1,13 @@ using System.Linq; using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZero { [Migration("7.5.0", 103, GlobalSettings.UmbracoMigrationName)] public class AddRedirectUrlTable4 : MigrationBase { - public AddRedirectUrlTable4(ISqlSyntaxProvider sqlSyntax, ILogger logger) - : base(sqlSyntax, logger) + public AddRedirectUrlTable4(IMigrationContext context) + : base(context) { } public override void Up() @@ -17,14 +15,14 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer // defer, because we are making decisions based upon what's in the database Execute.Code(MigrationCode); } - private string MigrationCode(Database database) + private string MigrationCode(UmbracoDatabase database) { var columns = SqlSyntax.GetColumnsInSchema(database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoRedirectUrl") && x.ColumnName.InvariantEquals("urlHash"))) return null; - var localContext = new LocalMigrationContext(Context.CurrentDatabaseProvider, database, SqlSyntax, Logger); + var localContext = new LocalMigrationContext(database, Logger); localContext.Execute.Sql("DELETE FROM umbracoRedirectUrl"); // else cannot add non-nullable field diff --git a/src/Umbraco.Core/Persistence/Repositories/RedirectUrlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RedirectUrlRepository.cs index 3cde41fd18..d8cad7b230 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RedirectUrlRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RedirectUrlRepository.cs @@ -3,19 +3,21 @@ using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; +using NPoco; +using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - internal class RedirectUrlRepository : PetaPocoRepositoryBase, IRedirectUrlRepository + internal class RedirectUrlRepository : NPocoRepositoryBase, IRedirectUrlRepository { - public RedirectUrlRepository(IDatabaseUnitOfWork work, CacheHelper cache, ILogger logger, ISqlSyntaxProvider sqlSyntax) - : base(work, cache, logger, sqlSyntax) + public RedirectUrlRepository(IDatabaseUnitOfWork work, CacheHelper cache, ILogger logger, IMappingResolver mappingResolver) + : base(work, cache, logger, mappingResolver) { } protected override int PerformCount(IQuery query) @@ -49,9 +51,9 @@ namespace Umbraco.Core.Persistence.Repositories throw new NotSupportedException("This repository does not support this method."); } - protected override Sql GetBaseQuery(bool isCount) + protected override Sql GetBaseQuery(bool isCount) { - var sql = new Sql(); + var sql = Sql(); if (isCount) sql.Select(@"COUNT(*) FROM umbracoRedirectUrl @@ -158,7 +160,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID"); var urlHash = HashUrl(url); var sql = GetBaseQuery(false) .Where(x => x.Url == url && x.UrlHash == urlHash) - .OrderByDescending(x => x.CreateDateUtc, SqlSyntax); + .OrderByDescending(x => x.CreateDateUtc); var dtos = Database.Fetch(sql); var dto = dtos.FirstOrDefault(); return dto == null ? null : Map(dto); @@ -168,7 +170,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID"); { var sql = GetBaseQuery(false) .Where(x => x.ContentKey == contentKey) - .OrderByDescending(x => x.CreateDateUtc, SqlSyntax); + .OrderByDescending(x => x.CreateDateUtc); var dtos = Database.Fetch(sql); return dtos.Select(Map); } @@ -176,7 +178,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID"); public IEnumerable GetAllUrls(long pageIndex, int pageSize, out long total) { var sql = GetBaseQuery(false) - .OrderByDescending(x => x.CreateDateUtc, SqlSyntax); + .OrderByDescending(x => x.CreateDateUtc); var result = Database.Page(pageIndex + 1, pageSize, sql); total = Convert.ToInt32(result.TotalItems); return result.Items.Select(Map); @@ -186,7 +188,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID"); { var sql = GetBaseQuery(false) .Where("umbracoNode.path LIKE @path", new { path = "%," + rootContentId + ",%" }) - .OrderByDescending(x => x.CreateDateUtc, SqlSyntax); + .OrderByDescending(x => x.CreateDateUtc); var result = Database.Page(pageIndex + 1, pageSize, sql); total = Convert.ToInt32(result.TotalItems); diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 90f1b93790..05a33676bc 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -51,14 +51,5 @@ namespace Umbraco.Core.Persistence ? _container.GetInstance(uow) : _container.GetInstance(uow, name); } - - public IRedirectUrlRepository CreateRedirectUrlRepository(IDatabaseUnitOfWork uow) - { - return new RedirectUrlRepository( - uow, - _cacheHelper, - _logger, - _sqlSyntax); - } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentTypeServiceBase.cs b/src/Umbraco.Core/Services/ContentTypeServiceBase.cs index 04216f558a..7e44ee19a8 100644 --- a/src/Umbraco.Core/Services/ContentTypeServiceBase.cs +++ b/src/Umbraco.Core/Services/ContentTypeServiceBase.cs @@ -614,7 +614,7 @@ namespace Umbraco.Core.Services // all descendants are going to be deleted var allDescendantsAndSelf = itemsA.SelectMany(xx => xx.DescendantsAndSelf(this)) - .Distinct() + .DistinctBy(x => x.Id) .ToArray(); // delete content diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs index 9724fa228b..be6c57bea9 100644 --- a/src/Umbraco.Core/Services/IContentService.cs +++ b/src/Umbraco.Core/Services/IContentService.cs @@ -281,21 +281,6 @@ namespace Umbraco.Core.Services IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalRecords, string orderBy, Direction orderDirection, bool orderBySystemField, IQuery filter); - /// - /// Gets a collection of objects by Parent Id - /// - /// Id of the Parent to retrieve Descendants from - /// Page number - /// Page size - /// Total records query would return without paging - /// Field to order by - /// Direction to order by - /// Flag to indicate when ordering by system field - /// - /// An Enumerable list of objects - IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalRecords, - string orderBy, Direction orderDirection, bool orderBySystemField, IQuery filter); - /// /// Gets a collection of an objects versions by its Id /// diff --git a/src/Umbraco.Core/Services/NotificationService.cs b/src/Umbraco.Core/Services/NotificationService.cs index 2f78aa4307..59c5b9076d 100644 --- a/src/Umbraco.Core/Services/NotificationService.cs +++ b/src/Umbraco.Core/Services/NotificationService.cs @@ -25,20 +25,17 @@ namespace Umbraco.Core.Services private readonly IDatabaseUnitOfWorkProvider _uowProvider; private readonly IUserService _userService; private readonly IContentService _contentService; - private readonly RepositoryFactory _repositoryFactory; private readonly ILogger _logger; - public NotificationService(IDatabaseUnitOfWorkProvider provider, IUserService userService, IContentService contentService, RepositoryFactory repositoryFactory, ILogger logger) + public NotificationService(IDatabaseUnitOfWorkProvider provider, IUserService userService, IContentService contentService, ILogger logger) { - if (provider == null) throw new ArgumentNullException("provider"); - if (userService == null) throw new ArgumentNullException("userService"); - if (contentService == null) throw new ArgumentNullException("contentService"); - if (repositoryFactory == null) throw new ArgumentNullException("repositoryFactory"); - if (logger == null) throw new ArgumentNullException("logger"); + if (provider == null) throw new ArgumentNullException(nameof(provider)); + if (userService == null) throw new ArgumentNullException(nameof(userService)); + if (contentService == null) throw new ArgumentNullException(nameof(contentService)); + if (logger == null) throw new ArgumentNullException(nameof(logger)); _uowProvider = provider; _userService = userService; _contentService = contentService; - _repositoryFactory = repositoryFactory; _logger = logger; } @@ -83,8 +80,7 @@ namespace Umbraco.Core.Services SendNotification(operatingUser, u, content, allVersions, actionName, http, createSubject, createBody); - _logger.Debug(string.Format("Notification type: {0} sent to {1} ({2})", - action, u.Name, u.Email)); + _logger.Debug($"Notification type: {action} sent to {u.Name} ({u.Email})"); } catch (Exception ex) { @@ -119,7 +115,7 @@ namespace Umbraco.Core.Services // lazily get versions - into lists to ensure we can enumerate multiple times var allVersionsDictionary = new Dictionary>(); - int totalUsers; + long totalUsers; var allUsers = _userService.GetAll(0, int.MaxValue, out totalUsers); foreach (var u in allUsers.Where(x => x.IsApproved)) { @@ -140,8 +136,7 @@ namespace Umbraco.Core.Services SendNotification(operatingUser, u, content, allVersions, actionName, http, createSubject, createBody); - _logger.Debug(string.Format("Notification type: {0} sent to {1} ({2})", - action, u.Name, u.Email)); + _logger.Debug($"Notification type: {action} sent to {u.Name} ({u.Email})"); } catch (Exception ex) { @@ -496,9 +491,9 @@ namespace Umbraco.Core.Services var diffs = Diff.DiffText1(oldText, newText); int pos = 0; - for (int n = 0; n < diffs.Length; n++) + for (var n = 0; n < diffs.Length; n++) { - Diff.Item it = diffs[n]; + var it = diffs[n]; // write unchanged chars while ((pos < it.StartB) && (pos < newText.Length)) @@ -511,7 +506,7 @@ namespace Umbraco.Core.Services if (displayDeletedText && it.DeletedA > 0) { sb.Append(deletedStyle); - for (int m = 0; m < it.DeletedA; m++) + for (var m = 0; m < it.DeletedA; m++) { sb.Append(oldText[it.StartA + m]); } // for diff --git a/src/Umbraco.Core/Services/RedirectUrlService.cs b/src/Umbraco.Core/Services/RedirectUrlService.cs index de698509d0..8541fe23a8 100644 --- a/src/Umbraco.Core/Services/RedirectUrlService.cs +++ b/src/Umbraco.Core/Services/RedirectUrlService.cs @@ -3,112 +3,112 @@ using System.Collections.Generic; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Services { internal class RedirectUrlService : RepositoryService, IRedirectUrlService { - public RedirectUrlService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory) - : base(provider, repositoryFactory, logger, eventMessagesFactory) + public RedirectUrlService(IDatabaseUnitOfWorkProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory) + : base(provider, logger, eventMessagesFactory) { } public void Register(string url, Guid contentKey) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); var redir = repo.Get(url, contentKey); if (redir != null) redir.CreateDateUtc = DateTime.UtcNow; else redir = new RedirectUrl { Url = url, ContentKey = contentKey }; repo.AddOrUpdate(redir); - uow.Commit(); + uow.Complete(); } } public void Delete(IRedirectUrl redirectUrl) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); repo.Delete(redirectUrl); - uow.Commit(); + uow.Complete(); } } public void Delete(int id) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); repo.Delete(id); - uow.Commit(); + uow.Complete(); } } public void DeleteContentRedirectUrls(Guid contentKey) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); repo.DeleteContentUrls(contentKey); - uow.Commit(); + uow.Complete(); } } public void DeleteAll() { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); repo.DeleteAll(); - uow.Commit(); + uow.Complete(); } } public IRedirectUrl GetMostRecentRedirectUrl(string url) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); var rule = repo.GetMostRecentUrl(url); - uow.Commit(); + uow.Complete(); return rule; } } public IEnumerable GetContentRedirectUrls(Guid contentKey) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); var rules = repo.GetContentUrls(contentKey); - uow.Commit(); + uow.Complete(); return rules; } } public IEnumerable GetAllRedirectUrls(long pageIndex, int pageSize, out long total) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); var rules = repo.GetAllUrls(pageIndex, pageSize, out total); - uow.Commit(); + uow.Complete(); return rules; } } public IEnumerable GetAllRedirectUrls(int rootContentId, long pageIndex, int pageSize, out long total) { - using (var uow = UowProvider.GetUnitOfWork()) - using (var repo = RepositoryFactory.CreateRedirectUrlRepository(uow)) + using (var uow = UowProvider.CreateUnitOfWork()) { + var repo = uow.CreateRepository(); var rules = repo.GetAllUrls(rootContentId, pageIndex, pageSize, out total); - uow.Commit(); + uow.Complete(); return rules; } } diff --git a/src/Umbraco.Core/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs index a85a739fce..be9189db6a 100644 --- a/src/Umbraco.Core/Services/ServiceContext.cs +++ b/src/Umbraco.Core/Services/ServiceContext.cs @@ -34,12 +34,13 @@ namespace Umbraco.Core.Services private readonly Lazy _memberGroupService; private readonly Lazy _notificationService; private readonly Lazy _externalLoginService; + private readonly Lazy _redirectUrlService; /// /// Initializes a new instance of the class with lazy services. /// /// Used by IoC. Note that LightInject will favor lazy args when picking a constructor. - public ServiceContext(Lazy migrationEntryService, Lazy publicAccessService, Lazy taskService, Lazy domainService, Lazy auditService, Lazy localizedTextService, Lazy tagService, Lazy contentService, Lazy userService, Lazy memberService, Lazy mediaService, Lazy contentTypeService, Lazy mediaTypeService, Lazy dataTypeService, Lazy fileService, Lazy localizationService, Lazy packagingService, Lazy serverRegistrationService, Lazy entityService, Lazy relationService, Lazy treeService, Lazy sectionService, Lazy macroService, Lazy memberTypeService, Lazy memberGroupService, Lazy notificationService, Lazy externalLoginService) + public ServiceContext(Lazy migrationEntryService, Lazy publicAccessService, Lazy taskService, Lazy domainService, Lazy auditService, Lazy localizedTextService, Lazy tagService, Lazy contentService, Lazy userService, Lazy memberService, Lazy mediaService, Lazy contentTypeService, Lazy mediaTypeService, Lazy dataTypeService, Lazy fileService, Lazy localizationService, Lazy packagingService, Lazy serverRegistrationService, Lazy entityService, Lazy relationService, Lazy treeService, Lazy sectionService, Lazy macroService, Lazy memberTypeService, Lazy memberGroupService, Lazy notificationService, Lazy externalLoginService, Lazy redirectUrlService) { _migrationEntryService = migrationEntryService; _publicAccessService = publicAccessService; @@ -68,6 +69,7 @@ namespace Umbraco.Core.Services _memberGroupService = memberGroupService; _notificationService = notificationService; _externalLoginService = externalLoginService; + _redirectUrlService = redirectUrlService; } /// @@ -101,7 +103,8 @@ namespace Umbraco.Core.Services IPublicAccessService publicAccessService = null, IExternalLoginService externalLoginService = null, IMigrationEntryService migrationEntryService = null, - IServerRegistrationService serverRegistrationService = null) + IServerRegistrationService serverRegistrationService = null, + IRedirectUrlService redirectUrlService = null) { if (serverRegistrationService != null) _serverRegistrationService = new Lazy(() => serverRegistrationService); if (migrationEntryService != null) _migrationEntryService = new Lazy(() => migrationEntryService); diff --git a/src/Umbraco.Core/project.json b/src/Umbraco.Core/project.json index d44a658e40..1d8e4bd3a0 100644 --- a/src/Umbraco.Core/project.json +++ b/src/Umbraco.Core/project.json @@ -1,6 +1,7 @@ { "dependencies": { "AutoMapper": "4.2.*", + "ImageProcessor": "2.4.*", "HtmlAgilityPack": "1.4.*", "LightInject": "4.0.*", "LightInject.Annotation": "1.0.*", diff --git a/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs b/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs index e39cf426ef..d2b6503a41 100644 --- a/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs @@ -6,12 +6,9 @@ using Semver; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models.Rdbms; -using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Migrations; using Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSeven; using Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZero; -using Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSix; -using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using GlobalSettings = Umbraco.Core.Configuration.GlobalSettings; @@ -107,8 +104,11 @@ namespace Umbraco.Tests.Migrations { var logger = new DebugDiagnosticsLogger(); + var migrationContext = new MigrationContext(DatabaseContext.Database, Logger); + //Setup the MigrationRunner var migrationRunner = new MigrationRunner( + Mock.Of(), Mock.Of(), logger, new SemVersion(7, 4, 0), @@ -116,24 +116,22 @@ namespace Umbraco.Tests.Migrations GlobalSettings.UmbracoMigrationName, //pass in explicit migrations - new DeleteRedirectUrlTable(SqlSyntax, logger), - new AddRedirectUrlTable(SqlSyntax, logger), - new AddRedirectUrlTable2(SqlSyntax, logger), - new AddRedirectUrlTable3(SqlSyntax, logger), - new AddRedirectUrlTable4(SqlSyntax, logger) + new DeleteRedirectUrlTable(migrationContext), + new AddRedirectUrlTable(migrationContext), + new AddRedirectUrlTable2(migrationContext), + new AddRedirectUrlTable3(migrationContext), + new AddRedirectUrlTable4(migrationContext) ); - var db = new UmbracoDatabase("Datasource=|DataDirectory|UmbracoPetaPocoTests.sdf;Flush Interval=1;", "System.Data.SqlServerCe.4.0", Logger); - - var upgraded = migrationRunner.Execute(db, DatabaseProviders.SqlServerCE, true); + var upgraded = migrationRunner.Execute(migrationContext, true); Assert.IsTrue(upgraded); } [Migration("7.5.0", 99, GlobalSettings.UmbracoMigrationName)] public class DeleteRedirectUrlTable : MigrationBase { - public DeleteRedirectUrlTable(ISqlSyntaxProvider sqlSyntax, ILogger logger) - : base(sqlSyntax, logger) + public DeleteRedirectUrlTable(IMigrationContext context) + : base(context) { } public override void Up() diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 6848c51588..9fd8af2770 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -47,7 +47,7 @@ namespace Umbraco.Tests.Persistence.Repositories { TemplateRepository tr; var ctRepository = CreateRepository(unitOfWork, out contentTypeRepository, out tr); - dtdRepository = new DataTypeDefinitionRepository(unitOfWork, CacheHelper, Logger, SqlSyntax, contentTypeRepository); + dtdRepository = new DataTypeDefinitionRepository(unitOfWork, CacheHelper, Logger, contentTypeRepository, MappingResolver); return ctRepository; } @@ -249,16 +249,18 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void Property_Values_With_Special_DatabaseTypes_Are_Equal_Before_And_After_Being_Persisted() { - var provider = new PetaPocoUnitOfWorkProvider(Logger); - var unitOfWork = provider.GetUnitOfWork(); - ContentTypeRepository contentTypeRepository; - DataTypeDefinitionRepository dataTypeDefinitionRepository; - using (var repository = CreateRepository(unitOfWork, out contentTypeRepository, out dataTypeDefinitionRepository)) + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); + using (var unitOfWork = provider.CreateUnitOfWork()) { + ContentTypeRepository contentTypeRepository; + DataTypeDefinitionRepository dataTypeDefinitionRepository; + + var repository = CreateRepository(unitOfWork, out contentTypeRepository, out dataTypeDefinitionRepository); + // Setup var dtd = new DataTypeDefinition(-1, Constants.PropertyEditors.DecimalAlias) { Name = "test", DatabaseType = DataTypeDatabaseType.Decimal }; dataTypeDefinitionRepository.AddOrUpdate(dtd); - unitOfWork.Commit(); + unitOfWork.Complete(); const string decimalPropertyAlias = "decimalProperty"; const string intPropertyAlias = "intProperty"; @@ -274,14 +276,14 @@ namespace Umbraco.Tests.Persistence.Repositories }); var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage", propertyTypeCollection); contentTypeRepository.AddOrUpdate(contentType); - unitOfWork.Commit(); + unitOfWork.Complete(); // Int and decimal values are passed in as strings as they would be from the backoffice UI var textpage = MockedContent.CreateSimpleContentWithSpecialDatabaseTypes(contentType, "test@umbraco.org", -1, "100", "150", dateValue); // Act repository.AddOrUpdate(textpage); - unitOfWork.Commit(); + unitOfWork.Complete(); // Assert Assert.That(contentType.HasIdentity, Is.True); @@ -785,7 +787,6 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out contentTypeRepository); // Act var query = repository.Query.Where(x => x.Level == 2); - var filterQuery = Query.Builder.Where(x => x.Name.Contains("Page 2")); long totalRecords; @@ -810,7 +811,6 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out contentTypeRepository); // Act var query = repository.Query.Where(x => x.Level == 2); - var filterQuery = Query.Builder.Where(x => x.Name.Contains("Page")); long totalRecords; diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs index 1e5655c6c3..da24f24075 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs @@ -66,14 +66,15 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void Can_Persist_Member_Type_Same_Property_Keys() { - var provider = new PetaPocoUnitOfWorkProvider(Logger); - var unitOfWork = provider.GetUnitOfWork(); - using (var repository = CreateRepository(unitOfWork)) + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); + using (var unitOfWork = provider.CreateUnitOfWork()) { + var repository = CreateRepository(unitOfWork); + var memberType = (IMemberType)MockedContentTypes.CreateSimpleMemberType(); repository.AddOrUpdate(memberType); - unitOfWork.Commit(); + unitOfWork.Complete(); var propertyKeys = memberType.PropertyTypes.Select(x => x.Key).OrderBy(x => x).ToArray(); var groupKeys = memberType.PropertyGroups.Select(x => x.Key).OrderBy(x => x).ToArray(); diff --git a/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs b/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs index 084d43d24c..7891ce0733 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs @@ -30,27 +30,27 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void CanSaveAndGet() { - var provider = new PetaPocoUnitOfWorkProvider(Logger); + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurl = new RedirectUrl { ContentKey = _textpage.Key, Url = "blah" }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); } - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurl = repo.GetMostRecentUrl("blah"); - uow.Commit(); + uow.Complete(); Assert.IsNotNull(rurl); Assert.AreEqual(_textpage.Id, rurl.ContentId); @@ -60,20 +60,20 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void CanSaveAndGetMostRecent() { - var provider = new PetaPocoUnitOfWorkProvider(Logger); + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); Assert.AreNotEqual(_textpage.Id, _otherpage.Id); - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurl = new RedirectUrl { ContentKey = _textpage.Key, Url = "blah" }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); @@ -89,16 +89,16 @@ namespace Umbraco.Tests.Persistence.Repositories CreateDateUtc = rurl.CreateDateUtc.AddSeconds(1) // ensure time difference }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); } - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurl = repo.GetMostRecentUrl("blah"); - uow.Commit(); + uow.Complete(); Assert.IsNotNull(rurl); Assert.AreEqual(_otherpage.Id, rurl.ContentId); @@ -108,18 +108,18 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void CanSaveAndGetByContent() { - var provider = new PetaPocoUnitOfWorkProvider(Logger); + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurl = new RedirectUrl { ContentKey = _textpage.Key, Url = "blah" }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); @@ -132,16 +132,16 @@ namespace Umbraco.Tests.Persistence.Repositories CreateDateUtc = rurl.CreateDateUtc.AddSeconds(1) // ensure time difference }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); } - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurls = repo.GetContentUrls(_textpage.Key).ToArray(); - uow.Commit(); + uow.Complete(); Assert.AreEqual(2, rurls.Length); Assert.AreEqual("durg", rurls[0].Url); @@ -152,18 +152,18 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void CanSaveAndDelete() { - var provider = new PetaPocoUnitOfWorkProvider(Logger); + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); var rurl = new RedirectUrl { ContentKey = _textpage.Key, Url = "blah" }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); @@ -173,16 +173,16 @@ namespace Umbraco.Tests.Persistence.Repositories Url = "durg" }; repo.AddOrUpdate(rurl); - uow.Commit(); + uow.Complete(); Assert.AreNotEqual(0, rurl.Id); } - using (var uow = provider.GetUnitOfWork()) - using (var repo = CreateRepository(uow)) + using (var uow = provider.CreateUnitOfWork()) { + var repo = CreateRepository(uow); repo.DeleteContentUrls(_textpage.Key); - uow.Commit(); + uow.Complete(); var rurls = repo.GetContentUrls(_textpage.Key); @@ -192,7 +192,7 @@ namespace Umbraco.Tests.Persistence.Repositories private IRedirectUrlRepository CreateRepository(IDatabaseUnitOfWork uow) { - return new RedirectUrlRepository(uow, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax); + return new RedirectUrlRepository(uow, CacheHelper, Logger, MappingResolver); } private IContent _textpage, _subpage, _otherpage, _trashed; diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index 68f355218a..3cf973e2c2 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -282,7 +282,7 @@ namespace Umbraco.Tests.Services var contentType = MockedContentTypes.CreateSimpleContentType("page", "Page"); cts.Save(contentType); - ContentTypeService.DeletedContentType += (sender, args) => + ContentTypeService.Deleted += (sender, args) => { deletedEntities += args.DeletedEntities.Count(); }; @@ -302,7 +302,7 @@ namespace Umbraco.Tests.Services var contentType2 = MockedContentTypes.CreateSimpleContentType("otherPage", "Other page"); cts.Save(contentType2); - ContentTypeService.DeletedContentType += (sender, args) => + ContentTypeService.Deleted += (sender, args) => { deletedEntities += args.DeletedEntities.Count(); }; @@ -324,7 +324,7 @@ namespace Umbraco.Tests.Services contentType2.ParentId = contentType.Id; cts.Save(contentType2); - ContentTypeService.DeletedContentType += (sender, args) => + ContentTypeService.Deleted += (sender, args) => { deletedEntities += args.DeletedEntities.Count(); }; diff --git a/src/Umbraco.Tests/Services/MediaServiceTests.cs b/src/Umbraco.Tests/Services/MediaServiceTests.cs index a255965bed..f7c51ecc6e 100644 --- a/src/Umbraco.Tests/Services/MediaServiceTests.cs +++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs @@ -103,7 +103,7 @@ namespace Umbraco.Tests.Services { var mediaService = ServiceContext.MediaService; var mediaType = MockedContentTypes.CreateImageMediaType("Image2"); - ServiceContext.ContentTypeService.Save(mediaType); + ServiceContext.MediaTypeService.Save(mediaType); var media = MockedMedia.CreateMediaImage(mediaType, -1); mediaService.Save(media); @@ -120,7 +120,7 @@ namespace Umbraco.Tests.Services { var mediaService = ServiceContext.MediaService; var mediaType = MockedContentTypes.CreateImageMediaType("Image2"); - ServiceContext.ContentTypeService.Save(mediaType); + ServiceContext.MediaTypeService.Save(mediaType); var media = MockedMedia.CreateMediaImageWithCrop(mediaType, -1); mediaService.Save(media); diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 5b25d88f03..0a76d65268 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -2,8 +2,10 @@ using System.Configuration; using System.Data.SqlServerCe; using System.IO; +using System.Linq; using System.Web.Routing; using System.Xml; +using Moq; using NUnit.Framework; using SQLCE4Umbraco; using Umbraco.Core; @@ -96,11 +98,17 @@ namespace Umbraco.Tests.TestHelpers // create the database factory - if the test does not require an actual database, // use a mock factory; otherwise use a real factory. - var databaseFactory = DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture - ? TestObjects.GetIDatabaseFactoryMock() - : new DefaultDatabaseFactory(GetDbConnectionString(), GetDbProviderName(), sqlSyntaxProviders, Logger, new TestScopeContextAdapter(), MappingResolver); -#error ok? - databaseFactory.Reset(); + IDatabaseFactory databaseFactory; + if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture) + { + databaseFactory = TestObjects.GetIDatabaseFactoryMock(); + } + else + { + var f = new DefaultDatabaseFactory(GetDbConnectionString(), GetDbProviderName(), sqlSyntaxProviders, Logger, new TestScopeContextAdapter(), MappingResolver); + f.ResetForTests(); + databaseFactory = f; + } // so, using the above code to create a mock IDatabaseFactory if we don't have a real database // but, that will NOT prevent _appContext from NOT being configured, because it cannot connect diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs index eab7fe8310..0eb2eb9cc8 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs @@ -198,11 +198,6 @@ namespace Umbraco.Tests.TestHelpers CacheHelper = CreateCacheHelper(); } - protected virtual CacheHelper CreateCacheHelper() - { - CacheHelper = CreateCacheHelper(); - } - protected virtual CacheHelper CreateCacheHelper() { return CacheHelper.CreateDisabledCacheHelper(); @@ -220,15 +215,16 @@ namespace Umbraco.Tests.TestHelpers protected virtual ApplicationContext CreateApplicationContext() { var evtMsgs = new TransientEventMessagesFactory(); + var dbFactory = new DefaultDatabaseFactory( + Core.Configuration.GlobalSettings.UmbracoConnectionName, + TestObjects.GetDefaultSqlSyntaxProviders(Logger), + Logger, new TestScopeContextAdapter(), + Mock.Of()); + dbFactory.ResetForTests(); var applicationContext = new ApplicationContext( - //assign the db context - #error reset the factory - new DatabaseContext(new DefaultDatabaseFactory( - Core.Configuration.GlobalSettings.UmbracoConnectionName, - TestObjects.GetDefaultSqlSyntaxProviders(Logger), - Logger, new TestScopeContextAdapter(), - Mock.Of()), Logger), - //assign the service context + // assign the db context + new DatabaseContext(dbFactory, Logger), + // assign the service context TestObjects.GetServiceContext( Container.GetInstance(), TestObjects.GetDatabaseUnitOfWorkProvider(Logger), diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 1804f30a0a..7256f8265f 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -146,7 +146,7 @@ namespace Umbraco.Tests.TestHelpers var userService = new Lazy(() => new UserService(provider, logger, eventMessagesFactory)); var dataTypeService = new Lazy(() => new DataTypeService(provider, logger, eventMessagesFactory)); var contentService = new Lazy(() => new ContentService(provider, logger, eventMessagesFactory, dataTypeService.Value, userService.Value, urlSegmentProviders)); - var notificationService = new Lazy(() => new NotificationService(provider, userService.Value, contentService.Value, repositoryFactory, logger)); + var notificationService = new Lazy(() => new NotificationService(provider, userService.Value, contentService.Value, logger)); var serverRegistrationService = new Lazy(() => new ServerRegistrationService(provider, logger, eventMessagesFactory)); var memberGroupService = new Lazy(() => new MemberGroupService(provider, logger, eventMessagesFactory)); var memberService = new Lazy(() => new MemberService(provider, logger, eventMessagesFactory, memberGroupService.Value, dataTypeService.Value)); @@ -170,6 +170,8 @@ namespace Umbraco.Tests.TestHelpers var tagService = new Lazy(() => new TagService(provider, logger, eventMessagesFactory)); var sectionService = new Lazy(() => new SectionService(userService.Value, treeService.Value, provider, cache)); + var redirectUrlService = new Lazy(() => new RedirectUrlService(provider, logger, eventMessagesFactory)); + return new ServiceContext( migrationEntryService, publicAccessService, @@ -197,7 +199,8 @@ namespace Umbraco.Tests.TestHelpers memberTypeService, memberGroupService, notificationService, - externalLoginService); + externalLoginService, + redirectUrlService); } public static IDatabaseUnitOfWorkProvider GetDatabaseUnitOfWorkProvider(ILogger logger) diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs index faa68929f0..a6731c3ed1 100644 --- a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs +++ b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs @@ -42,8 +42,7 @@ namespace Umbraco.Tests.UmbracoExamine if (contentService == null) { long longTotalRecs; - int intTotalRecs; - var demoData = new ExamineDemoDataContentService(); + var demoData = new ExamineDemoDataContentService(); var allRecs = demoData.GetLatestContentByXPath("//*[@isDoc]") .Root @@ -69,18 +68,10 @@ namespace Umbraco.Tests.UmbracoExamine contentService = Mock.Of( x => x.GetPagedDescendants( - It.IsAny(), It.IsAny(), It.IsAny(), out longTotalRecs, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) - == - allRecs - && x.GetPagedDescendants( It.IsAny(), It.IsAny(), It.IsAny(), out longTotalRecs, It.IsAny(), It.IsAny(), It.IsAny()) == allRecs && x.GetPagedDescendants( - It.IsAny(), It.IsAny(), It.IsAny(), out intTotalRecs, It.IsAny(), It.IsAny(), It.IsAny()) - == - allRecs - && x.GetPagedDescendants( It.IsAny(), It.IsAny(), It.IsAny(), out longTotalRecs, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>()) == allRecs); diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index 0b84c1c71d..4cda29a893 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -99,7 +99,7 @@ namespace Umbraco.Web.Editors { int nId; if (int.TryParse(item, out nId) == false) continue; - var contentType = contentTypeService.GetContentType(nId); + var contentType = contentTypeService.Get(nId); if (contentType == null) continue; contentTypes.Add(contentType); pack.Data.Documenttypes.Remove(nId.ToString(CultureInfo.InvariantCulture)); @@ -204,7 +204,7 @@ namespace Umbraco.Web.Editors library.RefreshContent(); } TreeDefinitionCollection.Instance.ReRegisterTrees(); - global::umbraco.BusinessLogic.Actions.Action.ReRegisterActionsAndHandlers(); + _Legacy.Actions.Action.ReRegisterActionsAndHandlers(); } public IEnumerable GetInstalled() @@ -260,7 +260,6 @@ namespace Umbraco.Web.Editors model.ConflictingStyleSheetNames = ins.ConflictingStyleSheetNames; model.ConflictingTemplateAliases = ins.ConflictingTemplateAliases; model.ContainsBinaryFileErrors = ins.ContainsBinaryFileErrors; - model.ContainsLegacyPropertyEditors = ins.ContainsLegacyPropertyEditors; model.ContainsMacroConflict = ins.ContainsMacroConflict; model.ContainsStyleSheetConflicts = ins.ContainsStyleSheeConflicts; model.ContainsTemplateConflicts = ins.ContainsTemplateConflicts; diff --git a/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs b/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs index 5ba16305de..5f009a7b7c 100644 --- a/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs +++ b/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs @@ -73,11 +73,11 @@ namespace Umbraco.Web.HealthCheck.Checks.DataIntegrity { var total = _services.MemberService.Count(); var memberObjectType = Guid.Parse(Constants.ObjectTypes.Member); - var subQuery = new Sql() + var subQuery = _database.Sql() .Select("Count(*)") - .From(_sqlSyntax) - .InnerJoin(_sqlSyntax) - .On(_sqlSyntax, left => left.NodeId, right => right.NodeId) + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) .Where(dto => dto.NodeObjectType == memberObjectType); var totalXml = _database.ExecuteScalar(subQuery); @@ -96,11 +96,11 @@ namespace Umbraco.Web.HealthCheck.Checks.DataIntegrity { var total = _services.MediaService.Count(); var mediaObjectType = Guid.Parse(Constants.ObjectTypes.Media); - var subQuery = new Sql() + var subQuery = _database.Sql() .Select("Count(*)") - .From(_sqlSyntax) - .InnerJoin(_sqlSyntax) - .On(_sqlSyntax, left => left.NodeId, right => right.NodeId) + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) .Where(dto => dto.NodeObjectType == mediaObjectType); var totalXml = _database.ExecuteScalar(subQuery); @@ -118,11 +118,11 @@ namespace Umbraco.Web.HealthCheck.Checks.DataIntegrity private HealthCheckStatus CheckContent() { var total = _services.ContentService.CountPublished(); - var subQuery = new Sql() + var subQuery = _database.Sql() .Select("DISTINCT cmsContentXml.nodeId") - .From(_sqlSyntax) - .InnerJoin(_sqlSyntax) - .On(_sqlSyntax, left => left.NodeId, right => right.NodeId); + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId); var totalXml = _database.ExecuteScalar("SELECT COUNT(*) FROM (" + subQuery.SQL + ") as tmp"); var actions = new List(); diff --git a/src/Umbraco.Web/HealthCheck/HealthCheckResolver.cs b/src/Umbraco.Web/HealthCheck/HealthCheckResolver.cs index dfe5b792a5..d3e2dc794d 100644 --- a/src/Umbraco.Web/HealthCheck/HealthCheckResolver.cs +++ b/src/Umbraco.Web/HealthCheck/HealthCheckResolver.cs @@ -1,13 +1,8 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Web; -using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.ObjectResolution; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Web.HealthCheck { @@ -27,10 +22,7 @@ namespace Umbraco.Web.HealthCheck /// /// Returns all health check instances /// - public IEnumerable HealthChecks - { - get { return Values; } - } + public IEnumerable HealthChecks => Values; /// /// This will ctor the HealthCheck instances diff --git a/src/Umbraco.Web/Models/LocalPackageInstallModel.cs b/src/Umbraco.Web/Models/LocalPackageInstallModel.cs index 819674d3f2..a107ac2428 100644 --- a/src/Umbraco.Web/Models/LocalPackageInstallModel.cs +++ b/src/Umbraco.Web/Models/LocalPackageInstallModel.cs @@ -16,10 +16,10 @@ namespace Umbraco.Web.Models Notifications = new List(); } - public List UploadedFiles { get; private set; } + public List UploadedFiles { get; } [DataMember(Name = "notifications")] - public List Notifications { get; private set; } + public List Notifications { get; } /// /// A flag to determine if this package is compatible to be installed @@ -54,9 +54,6 @@ namespace Umbraco.Web.Models [DataMember(Name = "containsMacroConflict")] public bool ContainsMacroConflict { get; set; } - [DataMember(Name = "containsLegacyPropertyEditors")] - public bool ContainsLegacyPropertyEditors { get; set; } - [DataMember(Name = "containsBinaryFileErrors")] public bool ContainsBinaryFileErrors { get; set; } diff --git a/src/Umbraco.Web/NotificationServiceExtensions.cs b/src/Umbraco.Web/NotificationServiceExtensions.cs index 438908caa8..a4ad00ee11 100644 --- a/src/Umbraco.Web/NotificationServiceExtensions.cs +++ b/src/Umbraco.Web/NotificationServiceExtensions.cs @@ -107,9 +107,9 @@ namespace Umbraco.Web internal static void SendNotification(this INotificationService service, IUser sender, IUmbracoEntity entity, IAction action, UmbracoContext umbracoContext, ApplicationContext applicationContext) { - if (sender == null) throw new ArgumentNullException("sender"); - if (umbracoContext == null) throw new ArgumentNullException("umbracoContext"); - if (applicationContext == null) throw new ArgumentNullException("applicationContext"); + if (sender == null) throw new ArgumentNullException(nameof(sender)); + if (umbracoContext == null) throw new ArgumentNullException(nameof(umbracoContext)); + if (applicationContext == null) throw new ArgumentNullException(nameof(applicationContext)); applicationContext.Services.NotificationService.SendNotifications( @@ -126,9 +126,9 @@ namespace Umbraco.Web internal static void SendNotification(this INotificationService service, IUser sender, IEnumerable entities, IAction action, UmbracoContext umbracoContext, ApplicationContext applicationContext) { - if (sender == null) throw new ArgumentNullException("sender"); - if (umbracoContext == null) throw new ArgumentNullException("umbracoContext"); - if (applicationContext == null) throw new ArgumentNullException("applicationContext"); + if (sender == null) throw new ArgumentNullException(nameof(sender)); + if (umbracoContext == null) throw new ArgumentNullException(nameof(umbracoContext)); + if (applicationContext == null) throw new ArgumentNullException(nameof(applicationContext)); applicationContext.Services.NotificationService.SendNotifications( @@ -137,10 +137,10 @@ namespace Umbraco.Web action.Letter.ToString(CultureInfo.InvariantCulture), applicationContext.Services.TextService.Localize("actions", action.Alias), umbracoContext.HttpContext, - (mailingUser, strings) => applicationContext.Services.TextService.Localize("notifications/mailSubject", strings, mailingUser), + (mailingUser, strings) => applicationContext.Services.TextService.Localize("notifications/mailSubject", mailingUser.GetUserCulture(applicationContext.Services.TextService), strings), (mailingUser, strings) => UmbracoConfig.For.UmbracoSettings().Content.DisableHtmlEmail - ? applicationContext.Services.TextService.Localize("notifications/mailBody", strings, mailingUser) - : applicationContext.Services.TextService.Localize("notifications/mailBodyHtml", strings, mailingUser)); + ? applicationContext.Services.TextService.Localize("notifications/mailBody", mailingUser.GetUserCulture(applicationContext.Services.TextService), strings) + : applicationContext.Services.TextService.Localize("notifications/mailBodyHtml", mailingUser.GetUserCulture(applicationContext.Services.TextService), strings)); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Redirects/RedirectTrackingEventHandler.cs b/src/Umbraco.Web/Redirects/RedirectTrackingEventHandler.cs index 6ba60b3891..cd0d4d39b7 100644 --- a/src/Umbraco.Web/Redirects/RedirectTrackingEventHandler.cs +++ b/src/Umbraco.Web/Redirects/RedirectTrackingEventHandler.cs @@ -2,13 +2,11 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Services; -using Umbraco.Core.Publishing; using Umbraco.Core.Events; using Umbraco.Web.Routing; using System.Collections.Generic; using System.Linq; using Umbraco.Core.Cache; -using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web.Cache; @@ -117,7 +115,7 @@ namespace Umbraco.Web.Redirects } } - private static void ContentService_Publishing(IPublishingStrategy sender, PublishEventArgs args) + private static void ContentService_Publishing(IContentService sender, PublishEventArgs args) { if (LockedEvents) return; @@ -169,7 +167,7 @@ namespace Umbraco.Web.Redirects OldRoutes.Remove(k); } - private static void ContentService_Published(IPublishingStrategy sender, PublishEventArgs e) + private static void ContentService_Published(IContentService sender, PublishEventArgs e) { // look note in CacheUpdated // we might want to set a flag on the entities we are seeing here diff --git a/src/Umbraco.Web/Trees/PackagesTreeController.cs b/src/Umbraco.Web/Trees/PackagesTreeController.cs index d1eb4dc8d2..5f4a7796df 100644 --- a/src/Umbraco.Web/Trees/PackagesTreeController.cs +++ b/src/Umbraco.Web/Trees/PackagesTreeController.cs @@ -1,22 +1,14 @@ using System; -using System.Collections.Generic; -using System.Globalization; using System.Linq; -using System.Net; using System.Net.Http.Formatting; -using System.Web.Http; -using Umbraco.Core; -using Umbraco.Core.Models; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; using umbraco; -using umbraco.BusinessLogic.Actions; using umbraco.cms.businesslogic.packager; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; +using Umbraco.Web._Legacy.Actions; using Constants = Umbraco.Core.Constants; -using Umbraco.Core.Services; namespace Umbraco.Web.Trees { @@ -107,7 +99,7 @@ namespace Umbraco.Web.Trees else { //it's a package node - menu.Items.Add(ui.Text("actions", ActionDelete.Instance.Alias)); + menu.Items.Add(Services.TextService.Localize("actions", ActionDelete.Instance.Alias)); } return menu; diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index a1ec1e6d9f..e321ba4548 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -508,8 +508,8 @@ namespace Umbraco.Web PluginManager.ResolveImageUrlProviders()); CultureDictionaryFactoryResolver.Current = new CultureDictionaryFactoryResolver(Container, typeof(DefaultCultureDictionaryFactory)); -#error inject! - HealthCheckResolver.Current = new HealthCheckResolver(LoggerResolver.Current.Logger, + + HealthCheckResolver.Current = new HealthCheckResolver(ProfilingLogger.Logger, () => PluginManager.ResolveTypes()); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/property/EditStyleSheetProperty.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/property/EditStyleSheetProperty.aspx.cs index 43cda4255f..2e95b585af 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/property/EditStyleSheetProperty.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/property/EditStyleSheetProperty.aspx.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Web; using System.Web.UI.WebControls; +using umbraco.cms.presentation.Trees; using Umbraco.Core; using Umbraco.Web.UI; using Umbraco.Core.Services;