diff --git a/src/Umbraco.Core/ApplicationContext.cs b/src/Umbraco.Core/ApplicationContext.cs index 8dfc2536e9..7381e5ab81 100644 --- a/src/Umbraco.Core/ApplicationContext.cs +++ b/src/Umbraco.Core/ApplicationContext.cs @@ -332,7 +332,7 @@ namespace Umbraco.Core this.ApplicationCache = null; if (_databaseContext != null) //need to check the internal field here { - if (DatabaseContext.IsDatabaseConfigured) + if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.Database != null) { DatabaseContext.Database.Dispose(); } diff --git a/src/Umbraco.Core/Cache/CacheKeys.cs b/src/Umbraco.Core/Cache/CacheKeys.cs index c370b13303..f76ff0439f 100644 --- a/src/Umbraco.Core/Cache/CacheKeys.cs +++ b/src/Umbraco.Core/Cache/CacheKeys.cs @@ -48,6 +48,7 @@ namespace Umbraco.Core.Cache [Obsolete("This is no longer used and will be removed from the codebase in the future")] public const string LanguageCacheKey = "UmbracoLanguageCache"; + [Obsolete("This is no longer used and will be removed from the codebase in the future")] public const string DomainCacheKey = "UmbracoDomainList"; [Obsolete("This is no longer used and will be removed from the codebase in the future")] diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index 13d6bd71c9..9133377f5f 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -160,10 +160,7 @@ namespace Umbraco.Core.Models /// /// Language of the data contained within this Content object. /// - /// - /// Left internal until multilingual support is implemented. - /// - [DataMember] + [Obsolete("This is not used and will be removed from the codebase in future versions")] public string Language { get { return _language; } diff --git a/src/Umbraco.Core/Models/DeepCloneHelper.cs b/src/Umbraco.Core/Models/DeepCloneHelper.cs index eb3be9d145..0e0e260c06 100644 --- a/src/Umbraco.Core/Models/DeepCloneHelper.cs +++ b/src/Umbraco.Core/Models/DeepCloneHelper.cs @@ -7,25 +7,6 @@ using System.Reflection; namespace Umbraco.Core.Models { - /// - /// Used to attribute properties that have a setter and are a reference type - /// that should be ignored for cloning when using the DeepCloneHelper - /// - /// - /// - /// This attribute must be used: - /// * when the property is backed by a field but the result of the property is the un-natural data stored in the field - /// - /// This attribute should not be used: - /// * when the property is virtual - /// * when the setter performs additional required logic other than just setting the underlying field - /// - /// - internal class DoNotCloneAttribute : Attribute - { - - } - public static class DeepCloneHelper { /// diff --git a/src/Umbraco.Core/Models/DoNotCloneAttribute.cs b/src/Umbraco.Core/Models/DoNotCloneAttribute.cs new file mode 100644 index 0000000000..a27df59b03 --- /dev/null +++ b/src/Umbraco.Core/Models/DoNotCloneAttribute.cs @@ -0,0 +1,23 @@ +using System; + +namespace Umbraco.Core.Models +{ + /// + /// Used to attribute properties that have a setter and are a reference type + /// that should be ignored for cloning when using the DeepCloneHelper + /// + /// + /// + /// This attribute must be used: + /// * when the property is backed by a field but the result of the property is the un-natural data stored in the field + /// + /// This attribute should not be used: + /// * when the property is virtual + /// * when the setter performs additional required logic other than just setting the underlying field + /// + /// + internal class DoNotCloneAttribute : Attribute + { + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/IDomain.cs b/src/Umbraco.Core/Models/IDomain.cs new file mode 100644 index 0000000000..9fb3e8019d --- /dev/null +++ b/src/Umbraco.Core/Models/IDomain.cs @@ -0,0 +1,12 @@ +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models +{ + public interface IDomain : IAggregateRoot, IRememberBeingDirty, ICanBeDirty + { + ILanguage Language { get; set; } + string DomainName { get; set; } + IContent RootContent { get; set; } + bool IsWildcard { get; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/UmbracoDomain.cs b/src/Umbraco.Core/Models/UmbracoDomain.cs new file mode 100644 index 0000000000..963535729c --- /dev/null +++ b/src/Umbraco.Core/Models/UmbracoDomain.cs @@ -0,0 +1,74 @@ +using System; +using System.Reflection; +using System.Runtime.Serialization; +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models +{ + //TODO: Need to custom serialize this + + [Serializable] + [DataContract(IsReference = true)] + public class UmbracoDomain : Entity, IDomain + { + public UmbracoDomain(string domainName) + { + _domainName = domainName; + } + + private IContent _content; + private ILanguage _language; + private string _domainName; + + private static readonly PropertyInfo DefaultLanguageSelector = ExpressionHelper.GetPropertyInfo(x => x.Language); + private static readonly PropertyInfo DomainNameSelector = ExpressionHelper.GetPropertyInfo(x => x.DomainName); + private static readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.RootContent); + + [DataMember] + public ILanguage Language + { + get { return _language; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _language = value; + return _language; + }, _language, DefaultLanguageSelector); + } + } + + [DataMember] + public string DomainName + { + get { return _domainName; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _domainName = value; + return _domainName; + }, _domainName, DomainNameSelector); + } + } + + [DataMember] + public IContent RootContent + { + get { return _content; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _content = value; + return _content; + }, _content, ContentSelector); + } + } + + public bool IsWildcard + { + get { return string.IsNullOrWhiteSpace(DomainName) || DomainName.StartsWith("*"); } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/LanguageFactory.cs b/src/Umbraco.Core/Persistence/Factories/LanguageFactory.cs index 0287a58b78..54c8aa30a8 100644 --- a/src/Umbraco.Core/Persistence/Factories/LanguageFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/LanguageFactory.cs @@ -6,11 +6,9 @@ namespace Umbraco.Core.Persistence.Factories { internal class LanguageFactory { - #region Implementation of IEntityFactory - public ILanguage BuildEntity(LanguageDto dto) { - var lang = new Language(dto.IsoCode){CultureName = dto.CultureName, Id = dto.Id}; + var lang = new Language(dto.IsoCode) { CultureName = dto.CultureName, Id = dto.Id }; //on initial construction we don't want to have dirty properties tracked // http://issues.umbraco.org/issue/U4-1946 lang.ResetDirtyProperties(false); @@ -19,13 +17,11 @@ namespace Umbraco.Core.Persistence.Factories public LanguageDto BuildDto(ILanguage entity) { - var dto = new LanguageDto{ CultureName = entity.CultureName, IsoCode = entity.IsoCode}; + var dto = new LanguageDto { CultureName = entity.CultureName, IsoCode = entity.IsoCode }; if (entity.HasIdentity) dto.Id = short.Parse(entity.Id.ToString(CultureInfo.InvariantCulture)); return dto; } - - #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/TaskFactory.cs b/src/Umbraco.Core/Persistence/Factories/TaskFactory.cs index 599eae12cb..81a6703324 100644 --- a/src/Umbraco.Core/Persistence/Factories/TaskFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/TaskFactory.cs @@ -10,8 +10,6 @@ namespace Umbraco.Core.Persistence.Factories /// internal class TaskFactory { - - public Task BuildEntity(TaskDto dto) { var entity = new Task(new TaskType(dto.TaskTypeDto.Alias) { Id = dto.TaskTypeDto.Id }) diff --git a/src/Umbraco.Core/Persistence/Factories/TaskTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/TaskTypeFactory.cs new file mode 100644 index 0000000000..a17abebad6 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Factories/TaskTypeFactory.cs @@ -0,0 +1,27 @@ +using Umbraco.Core.Models; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Factories +{ + internal class TaskTypeFactory + { + public TaskType BuildEntity(TaskTypeDto dto) + { + var entity = new TaskType(dto.Alias) {Id = dto.Id}; + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + entity.ResetDirtyProperties(false); + return entity; + } + + public TaskTypeDto BuildDto(TaskType entity) + { + var dto = new TaskTypeDto + { + Id = (byte)entity.Id, + Alias = entity.Alias + }; + return dto; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs new file mode 100644 index 0000000000..15d0852158 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs @@ -0,0 +1,29 @@ +using System.Collections.Concurrent; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Repositories; + +namespace Umbraco.Core.Persistence.Mappers +{ + [MapperFor(typeof(DomainRepository.CacheableDomain))] + public sealed class DomainMapper : BaseMapper + { + private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary(); + + public DomainMapper() + { + BuildMap(); + } + + internal override ConcurrentDictionary PropertyInfoCache + { + get { return PropertyInfoCacheInstance; } + } + + internal override void BuildMap() + { + CacheMap(src => src.Id, dto => dto.Id); + CacheMap(src => src.RootContentId, dto => dto.RootStructureId); + CacheMap(src => src.DefaultLanguageId, dto => dto.DefaultLanguage); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs b/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs index b891bc7ec8..0832aace89 100644 --- a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs @@ -16,8 +16,6 @@ namespace Umbraco.Core.Persistence.Mappers { private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary(); - //NOTE: its an internal class but the ctor must be public since we're using Activator.CreateInstance to create it - // otherwise that would fail because there is no public constructor. public LanguageMapper() { BuildMap(); diff --git a/src/Umbraco.Core/Persistence/Mappers/MapperAttribute.cs b/src/Umbraco.Core/Persistence/Mappers/MapperAttribute.cs deleted file mode 100644 index b9e033ac88..0000000000 --- a/src/Umbraco.Core/Persistence/Mappers/MapperAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace Umbraco.Core.Persistence.Mappers -{ - /// - /// An attribute used to decorate entities in order to associate with a mapper - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)] - internal sealed class MapperAttribute : Attribute - { - public Type MapperType { get; private set; } - - public MapperAttribute(Type mapperType) - { - MapperType = mapperType; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs deleted file mode 100644 index 6f43b8e304..0000000000 --- a/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Reflection; -using Umbraco.Core.Models; - -namespace Umbraco.Core.Persistence.Mappers -{ - internal class ModelDtoMapper : IMapper - { - public void GetTableInfo(Type t, TableInfo ti) - { } - - public bool MapPropertyToColumn(PropertyInfo pi, ref string columnName, ref bool resultColumn) - { - if (pi.DeclaringType == typeof(Content) || pi.DeclaringType == typeof(IContent)) - { - switch (pi.Name) - { - case "Trashed": - columnName = "[umbracoNode].[trashed]"; - return true; - case "ParentId": - columnName = "[umbracoNode].[parentID]"; - return true; - case "UserId": - columnName = "[umbracoNode].[nodeUser]"; - return true; - case "Level": - columnName = "[umbracoNode].[level]"; - return true; - case "Path": - columnName = "[umbracoNode].[path]"; - return true; - case "SortOrder": - columnName = "[umbracoNode].[sortOrder]"; - return true; - case "NodeId": - columnName = "[umbracoNode].[id]"; - return true; - case "Published": - columnName = "[cmsDocument].[published]"; - return true; - case "Key": - columnName = "[umbracoNode].[uniqueID]"; - return true; - case "CreateDate": - columnName = "[umbracoNode].[createDate]"; - return true; - case "Name": - columnName = "[umbracoNode].[text]"; - return true; - } - } - - if (pi.DeclaringType == typeof(ContentType) || pi.DeclaringType == typeof(IContentType)) - { - switch (pi.Name) - { - case "Alias": - columnName = "[cmsContentType].[alias]"; - return true; - case "Icon": - columnName = "[cmsContentType].[icon]"; - return true; - case "Thumbnail": - columnName = "[cmsContentType].[thumbnail]"; - return true; - case "Description": - columnName = "[cmsContentType].[description]"; - return true; - } - } - - return true; - } - - public Func GetFromDbConverter(PropertyInfo pi, Type sourceType) - { - return null; - } - - public Func GetToDbConverter(Type sourceType) - { - return null; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 77228039f9..60951f6086 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -63,7 +63,7 @@ namespace Umbraco.Core.Persistence.Repositories .Where(GetBaseWhereClause(), new { Id = id }) .Where(x => x.Newest) .OrderByDescending(x => x.VersionDate); - + var dto = Database.Fetch(sql).FirstOrDefault(); if (dto == null) @@ -79,7 +79,7 @@ namespace Umbraco.Core.Persistence.Repositories var sql = GetBaseQuery(false); if (ids.Any()) { - sql.Where("umbracoNode.id in (@ids)", new {ids = ids}); + sql.Where("umbracoNode.id in (@ids)", new { ids = ids }); } //we only want the newest ones with this method @@ -115,7 +115,7 @@ namespace Umbraco.Core.Persistence.Repositories .On(left => left.NodeId, right => right.NodeId) .InnerJoin() .On(left => left.NodeId, right => right.NodeId) - .Where(x => x.NodeObjectType == NodeObjectTypeId ); + .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; } @@ -260,7 +260,7 @@ namespace Umbraco.Core.Persistence.Repositories .Where(x => x.Newest != true); var dto = Database.Fetch(sql).FirstOrDefault(); - if(dto == null) return; + if (dto == null) return; using (var transaction = Database.GetTransaction()) { @@ -311,7 +311,7 @@ namespace Umbraco.Core.Persistence.Repositories //Ensure unique name on the same level entity.Name = EnsureUniqueNodeName(entity.ParentId, entity.Name); - + //Ensure that strings don't contain characters that are invalid in XML entity.SanitizeEntityPropertiesForXmlStorage(); @@ -332,7 +332,7 @@ namespace Umbraco.Core.Persistence.Repositories nodeDto.Level = short.Parse(level.ToString(CultureInfo.InvariantCulture)); nodeDto.SortOrder = sortOrder; var o = Database.IsNew(nodeDto) ? Convert.ToInt32(Database.Insert(nodeDto)) : Database.Update(nodeDto); - + //Update with new correct path nodeDto.Path = string.Concat(parent.Path, ",", nodeDto.NodeId); Database.Update(nodeDto); @@ -353,14 +353,14 @@ namespace Umbraco.Core.Persistence.Repositories if (parentPermissions.Any()) { var userPermissions = ( - from perm in parentPermissions - from p in perm.AssignedPermissions + from perm in parentPermissions + from p in perm.AssignedPermissions select new EntityPermissionSet.UserPermission(perm.UserId, p)).ToList(); permissionsRepo.ReplaceEntityPermissions(new EntityPermissionSet(entity.Id, userPermissions)); //flag the entity's permissions changed flag so we can track those changes. //Currently only used for the cache refreshers to detect if we should refresh all user permissions cache. - ((Content) entity).PermissionsChanged = true; + ((Content)entity).PermissionsChanged = true; } //Create the Content specific data - cmsContent @@ -408,8 +408,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistUpdatedItem(IContent entity) { - var publishedState = ((Content) entity).PublishedState; - + var publishedState = ((Content)entity).PublishedState; + //check if we need to make any database changes at all if (entity.RequiresSaving(publishedState) == false) { @@ -444,7 +444,7 @@ namespace Umbraco.Core.Persistence.Repositories var maxSortOrder = Database.ExecuteScalar( "SELECT coalesce(max(sortOrder),0) FROM umbracoNode WHERE parentid = @ParentId AND nodeObjectType = @NodeObjectType", - new {ParentId = entity.ParentId, NodeObjectType = NodeObjectTypeId}); + new { ParentId = entity.ParentId, NodeObjectType = NodeObjectTypeId }); entity.SortOrder = maxSortOrder + 1; //Question: If we move a node, should we update permissions to inherit from the new parent if the parent has permissions assigned? @@ -476,7 +476,7 @@ namespace Umbraco.Core.Persistence.Repositories //If Published state has changed then previous versions should have their publish state reset. //If state has been changed to unpublished the previous versions publish state should also be reset. //if (((ICanBeDirty)entity).IsPropertyDirty("Published") && (entity.Published || publishedState == PublishedState.Unpublished)) - if (entity.ShouldClearPublishedFlagForPreviousVersions(publishedState, shouldCreateNewVersion)) + if (entity.ShouldClearPublishedFlagForPreviousVersions(publishedState, shouldCreateNewVersion)) { var publishedDocs = Database.Fetch("WHERE nodeId = @Id AND published = @IsPublished", new { Id = entity.Id, IsPublished = true }); foreach (var doc in publishedDocs) @@ -543,7 +543,7 @@ namespace Umbraco.Core.Persistence.Repositories { foreach (var property in entity.Properties) { - if(keyDictionary.ContainsKey(property.PropertyTypeId) == false) continue; + if (keyDictionary.ContainsKey(property.PropertyTypeId) == false) continue; property.Id = keyDictionary[property.PropertyTypeId]; } @@ -618,6 +618,17 @@ namespace Umbraco.Core.Persistence.Repositories repo.ReplaceEntityPermissions(permissionSet); } + public void ClearPublished(IContent content) + { + // race cond! + var documentDtos = Database.Fetch("WHERE nodeId=@id AND published=@published", new { id = content.Id, published = true }); + foreach (var documentDto in documentDtos) + { + documentDto.Published = false; + Database.Update(documentDto); + } + } + public IContent GetByLanguage(int id, string language) { var sql = GetBaseQuery(false); @@ -632,7 +643,7 @@ namespace Umbraco.Core.Persistence.Repositories return GetByVersion(dto.ContentVersionDto.VersionId); } - + /// /// Assigns a single permission to the current content item for the specified user ids /// @@ -706,12 +717,12 @@ namespace Umbraco.Core.Persistence.Repositories var args = new List(); var sbWhere = new StringBuilder("AND (cmsDocument.newest = 1)"); - + if (filter.IsNullOrWhiteSpace() == false) { sbWhere.Append(" AND (cmsDocument." + SqlSyntax.GetQuotedColumnName("text") + " LIKE @" + args.Count + ")"); args.Add("%" + filter + "%"); - } + } Func> filterCallback = () => new Tuple(sbWhere.ToString(), args.ToArray()); @@ -721,7 +732,7 @@ namespace Umbraco.Core.Persistence.Repositories filterCallback); } - + #endregion #region IRecycleBinRepository members @@ -800,7 +811,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// - private IContent CreateContentFromDto(DocumentDto dto, + private IContent CreateContentFromDto(DocumentDto dto, IContentType contentType, ITemplate template, Models.PropertyCollection propCollection) @@ -873,7 +884,7 @@ namespace Umbraco.Core.Persistence.Repositories var results = dtos.OrderBy(x => x.Text, new SimilarNodeNameComparer()); foreach (var dto in results) { - if(id != 0 && id == dto.NodeId) continue; + if (id != 0 && id == dto.NodeId) continue; if (dto.Text.ToLowerInvariant().Equals(currentName.ToLowerInvariant())) { @@ -886,5 +897,19 @@ namespace Umbraco.Core.Persistence.Repositories return currentName; } + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _contentTypeRepository.Dispose(); + _templateRepository.Dispose(); + _tagRepository.Dispose(); + _contentPreviewRepository.Dispose(); + _contentXmlRepository.Dispose(); + } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs index d2f4b3bebe..15f7f0f878 100644 --- a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs @@ -42,7 +42,7 @@ namespace Umbraco.Core.Persistence.Repositories protected override IDataTypeDefinition PerformGet(int id) { - return GetAll(new[] {id}).FirstOrDefault(); + return GetAll(new[] { id }).FirstOrDefault(); } protected override IEnumerable PerformGetAll(params int[] ids) @@ -150,7 +150,7 @@ namespace Umbraco.Core.Persistence.Repositories //Cannot add a duplicate data type var exists = Database.ExecuteScalar(@"SELECT COUNT(*) FROM cmsDataType INNER JOIN umbracoNode ON cmsDataType.nodeId = umbracoNode.id -WHERE umbracoNode." + SqlSyntax.GetQuotedColumnName("text") + "= @name", new {name = entity.Name}); +WHERE umbracoNode." + SqlSyntax.GetQuotedColumnName("text") + "= @name", new { name = entity.Name }); if (exists > 0) { throw new DuplicateNameException("A data type with the name " + entity.Name + " already exists"); @@ -196,7 +196,7 @@ WHERE umbracoNode." + SqlSyntax.GetQuotedColumnName("text") + "= @name", new {na var exists = Database.ExecuteScalar(@"SELECT COUNT(*) FROM cmsDataType INNER JOIN umbracoNode ON cmsDataType.nodeId = umbracoNode.id WHERE umbracoNode." + SqlSyntax.GetQuotedColumnName("text") + @"= @name -AND umbracoNode.id <> @id", +AND umbracoNode.id <> @id", new { id = entity.Id, name = entity.Name }); if (exists > 0) { @@ -254,7 +254,7 @@ AND umbracoNode.id <> @id", } //Delete the pre-values - Database.Delete("WHERE datatypeNodeId = @Id", new {Id = entity.Id}); + Database.Delete("WHERE datatypeNodeId = @Id", new { Id = entity.Id }); //Delete Content specific data Database.Delete("WHERE nodeId = @Id", new { Id = entity.Id }); @@ -329,7 +329,7 @@ AND umbracoNode.id <> @id", public void AddOrUpdatePreValues(IDataTypeDefinition dataType, IDictionary values) { - var currentVals = new DataTypePreValueDto[]{}; + var currentVals = new DataTypePreValueDto[] { }; if (dataType.HasIdentity) { //first just get all pre-values for this data type so we can compare them to see if we need to insert or update or replace @@ -337,7 +337,7 @@ AND umbracoNode.id <> @id", .From() .Where(dto => dto.DataTypeNodeId == dataType.Id) .OrderBy(dto => dto.SortOrder); - currentVals = Database.Fetch(sql).ToArray(); + currentVals = Database.Fetch(sql).ToArray(); } //already existing, need to be updated @@ -409,7 +409,7 @@ AND umbracoNode.id <> @id", //the key will be: "UmbracoPreValDATATYPEID-CSVOFPREVALIDS var key = GetPrefixedCacheKey(dataTypeId) - + string.Join(",", collection.FormatAsDictionary().Select(x => x.Value.Id).ToArray()); + + string.Join(",", collection.FormatAsDictionary().Select(x => x.Value.Id).ToArray()); //store into cache _cacheHelper.RuntimeCache.InsertCacheItem(key, () => collection, @@ -429,7 +429,7 @@ AND umbracoNode.id <> @id", public string Value { get; set; } public string Alias { get; set; } public IDataTypeDefinition DataType { get; set; } - public int SortOrder { get; set; } + public int SortOrder { get; set; } } /// @@ -476,7 +476,7 @@ AND umbracoNode.id <> @id", protected override Guid NodeObjectTypeId { get { throw new NotImplementedException(); } - } + } #endregion protected override void PersistDeletedItem(PreValueEntity entity) @@ -579,6 +579,17 @@ AND id <> @id", } } + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _contentTypeRepository.Dispose(); + _preValRepository.Dispose(); + } } diff --git a/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs index 4c70d339b6..a8dac969d3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs @@ -224,14 +224,18 @@ namespace Umbraco.Core.Persistence.Repositories public IDictionaryItem Get(Guid uniqueId) { - var uniqueIdRepo = new DictionaryByUniqueIdRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax); - return uniqueIdRepo.Get(uniqueId); + using (var uniqueIdRepo = new DictionaryByUniqueIdRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + return uniqueIdRepo.Get(uniqueId); + } } public IDictionaryItem Get(string key) { - var keyRepo = new DictionaryByKeyRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax); - return keyRepo.Get(key); + using (var keyRepo = new DictionaryByKeyRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + return keyRepo.Get(key); + } } private class DictionaryByUniqueIdRepository : SimpleGetRepository @@ -315,5 +319,16 @@ namespace Umbraco.Core.Persistence.Repositories return "cmsDictionary." + SqlSyntax.GetQuotedColumnName("key") + " in (@ids)"; } } + + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _languageRepository.Dispose(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/DomainRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DomainRepository.cs new file mode 100644 index 0000000000..2adba8536a --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/DomainRepository.cs @@ -0,0 +1,348 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using Umbraco.Core.Cache; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + internal class DomainRepository : PetaPocoRepositoryBase, IDomainRepository + { + private readonly IContentRepository _contentRepository; + private readonly ILanguageRepository _languageRepository; + + public DomainRepository(IDatabaseUnitOfWork work, CacheHelper cache, ILogger logger, ISqlSyntaxProvider sqlSyntax, IContentRepository contentRepository, ILanguageRepository languageRepository) + : base(work, cache, logger, sqlSyntax) + { + _contentRepository = contentRepository; + _languageRepository = languageRepository; + } + + /// + /// Override the cache, this repo will not perform any cache, the caching is taken care of in the inner repository + /// + /// + /// This is required because IDomain is a deep object and we dont' want to cache it since it contains an ILanguage and an IContent, when these + /// are deep cloned the object graph that will be cached will be huge. Instead we'll have an internal repository that caches the simple + /// Domain structure and we'll use the other repositories to resolve the entities to attach + /// + protected override IRuntimeCacheProvider RuntimeCache + { + get { return new NullCacheProvider(); } + } + + protected override IDomain PerformGet(int id) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + return factory.BuildDomainEntity(repo.Get(id), _contentRepository, _languageRepository); + } + } + + protected override IEnumerable PerformGetAll(params int[] ids) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + return factory.BuildDomainEntities(repo.GetAll(ids).ToArray(), _contentRepository, _languageRepository); + } + } + + protected override IEnumerable PerformGetByQuery(IQuery query) + { + throw new NotSupportedException("This repository does not support this method"); + } + + protected override Sql GetBaseQuery(bool isCount) + { + var sql = new Sql(); + sql.Select(isCount ? "COUNT(*)" : "*").From(SqlSyntax); + return sql; + } + + protected override string GetBaseWhereClause() + { + return "umbracoDomains.id = @Id"; + } + + protected override void PersistDeletedItem(IDomain entity) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + repo.PersistDeletedItem(factory.BuildEntity(entity)); + } + } + + protected override IEnumerable GetDeleteClauses() + { + throw new NotImplementedException(); + } + + protected override Guid NodeObjectTypeId + { + get { throw new NotImplementedException(); } + } + + protected override void PersistNewItem(IDomain entity) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + var cacheableEntity = factory.BuildEntity(entity); + repo.PersistNewItem(cacheableEntity); + //re-map the id + entity.Id = cacheableEntity.Id; + entity.ResetDirtyProperties(); + } + } + + protected override void PersistUpdatedItem(IDomain entity) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + repo.PersistUpdatedItem(factory.BuildEntity(entity)); + entity.ResetDirtyProperties(); + } + } + + public bool Exists(string domainName) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var query = new Query().Where(x => x.DomainName.InvariantEquals(domainName)); + return repo.GetByQuery(query).Any(); + } + } + + public IEnumerable GetAll(bool includeWildcards) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + return factory.BuildDomainEntities(repo.GetAll().ToArray(), _contentRepository, _languageRepository) + .Where(x => includeWildcards || x.IsWildcard == false); + } + } + + public IEnumerable GetAssignedDomains(int contentId, bool includeWildcards) + { + using (var repo = new CachedDomainRepository(this, UnitOfWork, RepositoryCache, Logger, SqlSyntax)) + { + var factory = new DomainModelFactory(); + + var query = new Query().Where(x => x.RootContentId == contentId); + + return factory.BuildDomainEntities(repo.GetByQuery(query).ToArray(), _contentRepository, _languageRepository) + .Where(x => includeWildcards || x.IsWildcard == false); + } + } + + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _contentRepository.Dispose(); + _languageRepository.Dispose(); + } + + /// + /// A simple domain model that is cacheable without a large object graph + /// + internal class CacheableDomain : Entity, IAggregateRoot + { + public int? DefaultLanguageId { get; set; } + public string DomainName { get; set; } + public int? RootContentId { get; set; } + } + + /// + /// Inner repository responsible for CRUD for domains that allows caching simple data + /// + private class CachedDomainRepository : PetaPocoRepositoryBase + { + private readonly DomainRepository _domainRepo; + + public CachedDomainRepository(DomainRepository domainRepo, IDatabaseUnitOfWork work, CacheHelper cache, ILogger logger, ISqlSyntaxProvider sqlSyntax) + : base(work, cache, logger, sqlSyntax) + { + _domainRepo = domainRepo; + } + + protected override CacheableDomain PerformGet(int id) + { + var sql = GetBaseQuery(false); + sql.Where(GetBaseWhereClause(), new { Id = id }); + + var dto = Database.FirstOrDefault(sql); + if (dto == null) + return null; + + var entity = ConvertFromDto(dto); + + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + ((Entity)entity).ResetDirtyProperties(false); + + return entity; + } + + protected override IEnumerable PerformGetAll(params int[] ids) + { + var sql = GetBaseQuery(false).Where("umbracoDomains.id > 0"); + if (ids.Any()) + { + sql.Where("umbracoDomains.id in (@ids)", new { ids = ids }); + } + + return Database.Fetch(sql).Select(ConvertFromDto); + } + + protected override IEnumerable PerformGetByQuery(IQuery query) + { + var sqlClause = GetBaseQuery(false); + var translator = new SqlTranslator(sqlClause, query); + var sql = translator.Translate(); + return Database.Fetch(sql).Select(ConvertFromDto); + } + + protected override Sql GetBaseQuery(bool isCount) + { + return _domainRepo.GetBaseQuery(isCount); + } + + protected override string GetBaseWhereClause() + { + return _domainRepo.GetBaseWhereClause(); + } + + protected override IEnumerable GetDeleteClauses() + { + var list = new List + { + "DELETE FROM umbracoDomains WHERE id = @Id" + }; + return list; + } + + protected override Guid NodeObjectTypeId + { + get { throw new NotImplementedException(); } + } + + protected override void PersistNewItem(CacheableDomain entity) + { + var exists = Database.ExecuteScalar("SELECT COUNT(*) FROM umbracoDomains WHERE domainName = @domainName", new {domainName = entity.DomainName}); + if (exists > 0) throw new DuplicateNameException(string.Format("The domain name {0} is already assigned", entity.DomainName)); + + entity.AddingEntity(); + + var factory = new DomainModelFactory(); + var dto = factory.BuildDto(entity); + + var id = Convert.ToInt32(Database.Insert(dto)); + entity.Id = id; + + entity.ResetDirtyProperties(); + } + + protected override void PersistUpdatedItem(CacheableDomain entity) + { + entity.UpdatingEntity(); + + var factory = new DomainModelFactory(); + var dto = factory.BuildDto(entity); + + Database.Update(dto); + + entity.ResetDirtyProperties(); + } + + private CacheableDomain ConvertFromDto(DomainDto dto) + { + var factory = new DomainModelFactory(); + var entity = factory.BuildEntity(dto); + return entity; + } + } + + internal class DomainModelFactory + { + public IEnumerable BuildDomainEntities(CacheableDomain[] cacheableDomains, IContentRepository contentRepository, ILanguageRepository languageRepository) + { + var contentIds = cacheableDomains.Select(x => x.RootContentId).Where(x => x.HasValue).Select(x => x.Value).Distinct().ToArray(); + var langIds = cacheableDomains.Select(x => x.DefaultLanguageId).Where(x => x.HasValue).Select(x => x.Value).Distinct().ToArray(); + var contentItems = contentRepository.GetAll(contentIds); + var langItems = languageRepository.GetAll(langIds); + + return cacheableDomains + .WhereNotNull() + .Select(cacheableDomain => new UmbracoDomain(cacheableDomain.DomainName) + { + Id = cacheableDomain.Id, + //lookup from repo - this will be cached + Language = cacheableDomain.DefaultLanguageId.HasValue ? langItems.FirstOrDefault(l => l.Id == cacheableDomain.DefaultLanguageId.Value) : null, + //lookup from repo - this will be cached + RootContent = cacheableDomain.RootContentId.HasValue ? contentItems.FirstOrDefault(l => l.Id == cacheableDomain.RootContentId.Value) : null, + }); + } + + public IDomain BuildDomainEntity(CacheableDomain cacheableDomain, IContentRepository contentRepository, ILanguageRepository languageRepository) + { + if (cacheableDomain == null) return null; + + return new UmbracoDomain(cacheableDomain.DomainName) + { + Id = cacheableDomain.Id, + //lookup from repo - this will be cached + Language = cacheableDomain.DefaultLanguageId.HasValue ? languageRepository.Get(cacheableDomain.DefaultLanguageId.Value) : null, + //lookup from repo - this will be cached + RootContent = cacheableDomain.RootContentId.HasValue ? contentRepository.Get(cacheableDomain.RootContentId.Value) : null + }; + } + + public CacheableDomain BuildEntity(IDomain entity) + { + var domain = new CacheableDomain + { + Id = entity.Id, + DefaultLanguageId = entity.Language == null ? null : (int?)entity.Language.Id, + DomainName = entity.DomainName, + RootContentId = entity.RootContent == null ? null : (int?)entity.RootContent.Id + }; + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + domain.ResetDirtyProperties(false); + return domain; + } + + public CacheableDomain BuildEntity(DomainDto dto) + { + var domain = new CacheableDomain { Id = dto.Id, DefaultLanguageId = dto.DefaultLanguage, DomainName = dto.DomainName, RootContentId = dto.RootStructureId }; + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + domain.ResetDirtyProperties(false); + return domain; + } + + public DomainDto BuildDto(CacheableDomain entity) + { + var dto = new DomainDto { DefaultLanguage = entity.DefaultLanguageId, DomainName = entity.DomainName, Id = entity.Id, RootStructureId = entity.RootContentId }; + return dto; + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs index ac0fcebbe7..5cb470b7cd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs @@ -27,6 +27,12 @@ namespace Umbraco.Core.Persistence.Repositories /// void ReplaceContentPermissions(EntityPermissionSet permissionSet); + /// + /// Clears the published flag for a content. + /// + /// + void ClearPublished(IContent content); + /// /// Gets a specific language version of an /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDomainRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDomainRepository.cs new file mode 100644 index 0000000000..030251d805 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDomainRepository.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Persistence.Repositories +{ + public interface IDomainRepository : IRepositoryQueryable + { + bool Exists(string domainName); + IEnumerable GetAll(bool includeWildcards); + IEnumerable GetAssignedDomains(int contentId, bool includeWildcards); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITaskRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITaskRepository.cs index aac8f09872..d2b4770082 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITaskRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITaskRepository.cs @@ -4,15 +4,13 @@ using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories { + public interface ITaskTypeRepository : IRepositoryQueryable + { + + } + public interface ITaskRepository : IRepositoryQueryable { - //IEnumerable GetTasks(Guid? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false); IEnumerable GetTasks(int? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false); - - //IEnumerable GetTasksForItem(int id); - //IEnumerable GetTasksForItem(Guid uniqueId); - //IEnumerable GetTasksByType(int typeId); - //IEnumerable GetTasksByType(string typeAlias); - } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs index 898dae9497..1403d5e6c4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs @@ -51,6 +51,11 @@ namespace Umbraco.Core.Persistence.Repositories sql.Where("umbracoLanguage.id in (@ids)", new { ids = ids }); } + //this needs to be sorted since that is the way legacy worked - default language is the first one!! + //even though legacy didn't sort, it should be by id + sql.OrderBy(dto => dto.Id, SqlSyntax); + + return Database.Fetch(sql).Select(ConvertFromDto); } @@ -70,7 +75,7 @@ namespace Umbraco.Core.Persistence.Repositories { var sql = new Sql(); sql.Select(isCount ? "COUNT(*)" : "*") - .From(); + .From(SqlSyntax); return sql; } @@ -200,6 +205,9 @@ namespace Umbraco.Core.Persistence.Repositories } } + /// + /// Inner repository for looking up languages by culture name, this deals with caching by a string key + /// private class LanguageByCultureNameRepository : SimpleGetRepository { private readonly LanguageRepository _languageRepository; diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index e5334bfac2..9f9ac2e3bf 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -217,7 +217,7 @@ namespace Umbraco.Core.Persistence.Repositories var id = contentTypeId; var query = Query.Builder.Where(x => x.ContentTypeId == id && x.Trashed == false); RebuildXmlStructuresProcessQuery(serializer, query, tr, groupSize); - } + } } tr.Complete(); @@ -434,7 +434,7 @@ namespace Umbraco.Core.Persistence.Repositories { get { return Constants.System.RecycleBinMedia; } } - + #endregion /// @@ -581,6 +581,18 @@ namespace Umbraco.Core.Persistence.Repositories return currentName; } - + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _mediaTypeRepository.Dispose(); + _tagRepository.Dispose(); + _contentXmlRepository.Dispose(); + _contentPreviewRepository.Dispose(); + } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index 8c08bf38c2..79d35d99a4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -782,5 +782,20 @@ namespace Umbraco.Core.Persistence.Repositories ((Entity)member).ResetDirtyProperties(false); return member; } + + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _memberTypeRepository.Dispose(); + _tagRepository.Dispose(); + _memberGroupRepository.Dispose(); + _contentXmlRepository.Dispose(); + _contentPreviewRepository.Dispose(); + } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs index c9a6c2f96a..69e0307c09 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs @@ -146,5 +146,16 @@ namespace Umbraco.Core.Persistence.Repositories } #endregion + + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _relationTypeRepository.Dispose(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs index 10a9e1fe2c..a6bbff353a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs @@ -46,6 +46,14 @@ namespace Umbraco.Core.Persistence.Repositories get { return _cache; } } + /// + /// The runtime cache used for this repo - by standard this is the runtime cache exposed by the CacheHelper but can be overridden + /// + protected virtual IRuntimeCacheProvider RuntimeCache + { + get { return _cache.RuntimeCache; } + } + public static string GetCacheIdKey(object id) { return string.Format("{0}{1}", GetCacheTypeKey(), id); @@ -77,7 +85,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// Adds or Updates an entity of type TEntity /// - /// This method is backed by an cache + /// This method is backed by an cache /// public void AddOrUpdate(TEntity entity) { @@ -105,13 +113,13 @@ namespace Umbraco.Core.Persistence.Repositories protected abstract TEntity PerformGet(TId id); /// - /// Gets an entity by the passed in Id + /// Gets an entity by the passed in Id utilizing the repository's runtime cache /// /// /// public TEntity Get(TId id) { - return RepositoryCache.RuntimeCache.GetCacheItem( + return RuntimeCache.GetCacheItem( GetCacheIdKey(id), () => { var entity = PerformGet(id); @@ -149,14 +157,14 @@ namespace Umbraco.Core.Persistence.Repositories if (ids.Any()) { - var entities = ids.Select(x => RepositoryCache.RuntimeCache.GetCacheItem(GetCacheIdKey(x))).ToArray(); + var entities = ids.Select(x => RuntimeCache.GetCacheItem(GetCacheIdKey(x))).ToArray(); if (ids.Count().Equals(entities.Count()) && entities.Any(x => x == null) == false) return entities.Select(x => (TEntity)x); } else { - var allEntities = RepositoryCache.RuntimeCache.GetCacheItemsByKeySearch(GetCacheTypeKey()).ToArray(); + var allEntities = RuntimeCache.GetCacheItemsByKeySearch(GetCacheTypeKey()).ToArray(); if (allEntities.Any()) { @@ -185,7 +193,7 @@ namespace Umbraco.Core.Persistence.Repositories if (entity != null) { var localCopy = entity; - RepositoryCache.RuntimeCache.InsertCacheItem(GetCacheIdKey(entity.Id), () => localCopy); + RuntimeCache.InsertCacheItem(GetCacheIdKey(entity.Id), () => localCopy); } } @@ -213,7 +221,7 @@ namespace Umbraco.Core.Persistence.Repositories /// public bool Exists(TId id) { - var fromCache = RepositoryCache.RuntimeCache.GetCacheItem(GetCacheIdKey(id)); + var fromCache = RuntimeCache.GetCacheItem(GetCacheIdKey(id)); if (fromCache != null) { return true; @@ -245,13 +253,13 @@ namespace Umbraco.Core.Persistence.Repositories try { PersistNewItem((TEntity)entity); - RepositoryCache.RuntimeCache.InsertCacheItem(GetCacheIdKey(entity.Id), () => entity); + RuntimeCache.InsertCacheItem(GetCacheIdKey(entity.Id), () => entity); } catch (Exception) { //if an exception is thrown we need to remove the entry from cache, this is ONLY a work around because of the way // that we cache entities: http://issues.umbraco.org/issue/U4-4259 - RepositoryCache.RuntimeCache.ClearCacheItem(GetCacheIdKey(entity.Id)); + RuntimeCache.ClearCacheItem(GetCacheIdKey(entity.Id)); throw; } @@ -266,14 +274,14 @@ namespace Umbraco.Core.Persistence.Repositories try { PersistUpdatedItem((TEntity)entity); - RepositoryCache.RuntimeCache.InsertCacheItem(GetCacheIdKey(entity.Id), () => entity); + RuntimeCache.InsertCacheItem(GetCacheIdKey(entity.Id), () => entity); } catch (Exception) { //if an exception is thrown we need to remove the entry from cache, this is ONLY a work around because of the way // that we cache entities: http://issues.umbraco.org/issue/U4-4259 //RepositoryCache.Delete(typeof(TEntity), entity); - RepositoryCache.RuntimeCache.ClearCacheItem(GetCacheIdKey(entity.Id)); + RuntimeCache.ClearCacheItem(GetCacheIdKey(entity.Id)); throw; } @@ -286,7 +294,7 @@ namespace Umbraco.Core.Persistence.Repositories public virtual void PersistDeletedItem(IEntity entity) { PersistDeletedItem((TEntity)entity); - RepositoryCache.RuntimeCache.ClearCacheItem(GetCacheIdKey(entity.Id)); + RuntimeCache.ClearCacheItem(GetCacheIdKey(entity.Id)); } #endregion diff --git a/src/Umbraco.Core/Persistence/Repositories/TaskRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TaskRepository.cs index c6a569eb9f..f30f945851 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TaskRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TaskRepository.cs @@ -40,7 +40,7 @@ namespace Umbraco.Core.Persistence.Repositories if (ids.Any()) { - sql.Where("cmsTask.id IN (@ids)", new {ids = ids}); + sql.Where("cmsTask.id IN (@ids)", new { ids = ids }); } var factory = new TaskFactory(); @@ -109,10 +109,10 @@ namespace Umbraco.Core.Persistence.Repositories entity.AddingEntity(); //ensure the task type exists - var taskType = Database.SingleOrDefault("Where alias = @alias", new {alias = entity.TaskType.Alias}); + var taskType = Database.SingleOrDefault("Where alias = @alias", new { alias = entity.TaskType.Alias }); if (taskType == null) { - var taskTypeId = Convert.ToInt32(Database.Insert(new TaskTypeDto {Alias = entity.TaskType.Alias})); + var taskTypeId = Convert.ToInt32(Database.Insert(new TaskTypeDto { Alias = entity.TaskType.Alias })); entity.TaskType.Id = taskTypeId; } else @@ -141,19 +141,6 @@ namespace Umbraco.Core.Persistence.Repositories entity.ResetDirtyProperties(); } - //public IEnumerable GetTasks(Guid? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false) - //{ - // var sql = GetGetTasksQuery(assignedUser, ownerUser, taskTypeAlias, includeClosed); - // if (itemId.HasValue) - // { - // sql.Where(dto => dto.UniqueId == itemId.Value); - // } - - // var dtos = Database.Fetch(sql); - // var entities = Mapper.Map>(dtos); - // return entities; - //} - public IEnumerable GetTasks(int? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false) { var sql = GetGetTasksQuery(assignedUser, ownerUser, taskTypeAlias, includeClosed); @@ -181,11 +168,11 @@ namespace Umbraco.Core.Persistence.Repositories } if (ownerUser.HasValue) { - sql.Where(dto => dto.UserId == ownerUser.Value); + sql.Where(dto => dto.ParentUserId == ownerUser.Value); } if (assignedUser.HasValue) { - sql.Where(dto => dto.ParentUserId == assignedUser.Value); + sql.Where(dto => dto.UserId == assignedUser.Value); } return sql; } diff --git a/src/Umbraco.Core/Persistence/Repositories/TaskTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TaskTypeRepository.cs new file mode 100644 index 0000000000..564e949172 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/TaskTypeRepository.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Factories; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + internal class TaskTypeRepository : PetaPocoRepositoryBase, ITaskTypeRepository + { + public TaskTypeRepository(IDatabaseUnitOfWork work, CacheHelper cache, ILogger logger, ISqlSyntaxProvider sqlSyntax) + : base(work, cache, logger, sqlSyntax) + { + } + + protected override TaskType PerformGet(int id) + { + var sql = GetBaseQuery(false); + sql.Where(GetBaseWhereClause(), new { Id = id }); + + var taskDto = Database.Fetch(sql).FirstOrDefault(); + if (taskDto == null) + return null; + + var factory = new TaskTypeFactory(); + var entity = factory.BuildEntity(taskDto); + return entity; + } + + protected override IEnumerable PerformGetAll(params int[] ids) + { + var sql = GetBaseQuery(false); + + if (ids.Any()) + { + sql.Where("cmsTaskType.id IN (@ids)", new { ids = ids }); + } + + var factory = new TaskTypeFactory(); + var dtos = Database.Fetch(sql); + return dtos.Select(factory.BuildEntity); + } + + protected override IEnumerable PerformGetByQuery(IQuery query) + { + var sqlClause = GetBaseQuery(false); + var translator = new SqlTranslator(sqlClause, query); + var sql = translator.Translate(); + + var factory = new TaskTypeFactory(); + var dtos = Database.Fetch(sql); + return dtos.Select(factory.BuildEntity); + } + + protected override Sql GetBaseQuery(bool isCount) + { + var sql = new Sql(); + sql.Select("*").From(SqlSyntax); + return sql; + } + + protected override string GetBaseWhereClause() + { + return "cmsTaskType.id = @Id"; + } + + protected override IEnumerable GetDeleteClauses() + { + var list = new List + { + "DELETE FROM cmsTask WHERE taskTypeId = @Id", + "DELETE FROM cmsTaskType WHERE id = @Id" + }; + return list; + } + + protected override Guid NodeObjectTypeId + { + get { throw new NotImplementedException(); } + } + + protected override void PersistNewItem(TaskType entity) + { + entity.AddingEntity(); + + //TODO: Just remove the task type db table or add a unique index to the alias + + //ensure the task type exists + var taskType = Database.SingleOrDefault("Where alias = @alias", new { alias = entity.Alias }); + if (taskType != null) + { + throw new InvalidOperationException("A task type already exists with the given alias " + entity.Alias); + } + + var factory = new TaskTypeFactory(); + var dto = factory.BuildDto(entity); + + var id = Convert.ToInt32(Database.Insert(dto)); + entity.Id = id; + + entity.ResetDirtyProperties(); + } + + protected override void PersistUpdatedItem(TaskType entity) + { + entity.UpdatingEntity(); + + var factory = new TaskTypeFactory(); + var dto = factory.BuildDto(entity); + + Database.Update(dto); + + entity.ResetDirtyProperties(); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index e56771fc7d..fb66dc7ade 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -374,6 +374,17 @@ namespace Umbraco.Core.Persistence.Repositories var userFactory = new UserFactory(userType); return userFactory.BuildEntity(dto); }); - } + } + + /// + /// Dispose disposable properties + /// + /// + /// Ensure the unit of work is disposed + /// + protected override void DisposeResources() + { + _userTypeRepository.Dispose(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index fa39f013ca..2afe184b3a 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -66,7 +66,9 @@ namespace Umbraco.Core.Persistence public virtual ITaskRepository CreateTaskRepository(IDatabaseUnitOfWork uow) { - return new TaskRepository(uow, _cacheHelper, _logger, _sqlSyntax); + return new TaskRepository(uow, + CacheHelper.CreateDisabledCacheHelper(), //never cache + _logger, _sqlSyntax); } public virtual IAuditRepository CreateAuditRepository(IDatabaseUnitOfWork uow) @@ -263,5 +265,16 @@ namespace Umbraco.Core.Persistence return new EntityRepository(uow); } + public IDomainRepository CreateDomainRepository(IDatabaseUnitOfWork uow) + { + return new DomainRepository(uow, _cacheHelper, _logger, _sqlSyntax, CreateContentRepository(uow), CreateLanguageRepository(uow)); + } + + public ITaskTypeRepository CreateTaskTypeRepository(IDatabaseUnitOfWork uow) + { + return new TaskTypeRepository(uow, + CacheHelper.CreateDisabledCacheHelper(), //never cache + _logger, _sqlSyntax); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Publishing/PublishingStrategy.cs b/src/Umbraco.Core/Publishing/PublishingStrategy.cs index 899567bf8d..1c33f87c5e 100644 --- a/src/Umbraco.Core/Publishing/PublishingStrategy.cs +++ b/src/Umbraco.Core/Publishing/PublishingStrategy.cs @@ -303,32 +303,7 @@ namespace Umbraco.Core.Publishing /// True if the unpublish operation was successfull and not cancelled, otherwise false public override bool UnPublish(IContent content, int userId) { - if (UnPublishing.IsRaisedEventCancelled(new PublishEventArgs(content), this)) - { - LogHelper.Info( - string.Format("Content '{0}' with Id '{1}' will not be un-published, the event was cancelled.", content.Name, content.Id)); - return false; - } - - - //If Content has a release date set to before now, it should be removed so it doesn't interrupt an unpublish - //Otherwise it would remain released == published - if (content.ReleaseDate.HasValue && content.ReleaseDate.Value <= DateTime.Now) - { - content.ReleaseDate = null; - - LogHelper.Info( - string.Format( - "Content '{0}' with Id '{1}' had its release date removed, because it was unpublished.", - content.Name, content.Id)); - } - - content.ChangePublishedState(PublishedState.Unpublished); - - LogHelper.Info( - string.Format("Content '{0}' with Id '{1}' has been unpublished.", - content.Name, content.Id)); - return true; + return UnPublishInternal(content, userId).Success; } /// @@ -337,43 +312,47 @@ namespace Umbraco.Core.Publishing /// An enumerable list of /// Id of the User issueing the unpublish operation /// A list of publish statuses - internal IEnumerable> UnPublishInternal(IEnumerable content, int userId) + private IEnumerable> UnPublishInternal(IEnumerable content, int userId) { - var result = new List>(); + return content.Select(x => UnPublishInternal(x, userId)); + } - //Only update content thats already been published - foreach (var item in content.Where(x => x.Published == true)) + private Attempt UnPublishInternal(IContent content, int userId) + { + // content should (is assumed to ) be the newest version, which may not be published + // don't know how to test this, so it's not verified + // NOTE + // if published != newest, then the published flags need to be reseted by whoever is calling that method + // at the moment it's done by the content service + + //Fire UnPublishing event + if (UnPublishing.IsRaisedEventCancelled(new PublishEventArgs(content), this)) { - //Fire UnPublishing event - if (UnPublishing.IsRaisedEventCancelled(new PublishEventArgs(item), this)) - { - LogHelper.Info( - string.Format("Content '{0}' with Id '{1}' will not be published, the event was cancelled.", item.Name, item.Id)); - result.Add(Attempt.Fail(new PublishStatus(item, PublishStatusType.FailedCancelledByEvent))); - continue; - } - - //If Content has a release date set to before now, it should be removed so it doesn't interrupt an unpublish - //Otherwise it would remain released == published - if (item.ReleaseDate.HasValue && item.ReleaseDate.Value <= DateTime.Now) - { - item.ReleaseDate = null; - - LogHelper.Info( - string.Format("Content '{0}' with Id '{1}' had its release date removed, because it was unpublished.", - item.Name, item.Id)); - } - - item.ChangePublishedState(PublishedState.Unpublished); - LogHelper.Info( - string.Format("Content '{0}' with Id '{1}' has been unpublished.", - item.Name, item.Id)); - - result.Add(Attempt.Succeed(new PublishStatus(item))); + string.Format("Content '{0}' with Id '{1}' will not be unpublished, the event was cancelled.", content.Name, content.Id)); + return Attempt.Fail(new PublishStatus(content, PublishStatusType.FailedCancelledByEvent)); } - return result; + //If Content has a release date set to before now, it should be removed so it doesn't interrupt an unpublish + //Otherwise it would remain released == published + if (content.ReleaseDate.HasValue && content.ReleaseDate.Value <= DateTime.Now) + { + content.ReleaseDate = null; + + LogHelper.Info( + string.Format("Content '{0}' with Id '{1}' had its release date removed, because it was unpublished.", + content.Name, content.Id)); + } + + // if newest is published, unpublish + if (content.Published) + content.ChangePublishedState(PublishedState.Unpublished); + + LogHelper.Info( + string.Format("Content '{0}' with Id '{1}' has been unpublished.", + content.Name, content.Id)); + + return Attempt.Succeed(new PublishStatus(content)); } /// diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index e5a99cf038..c4181a80a4 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -27,7 +27,7 @@ namespace Umbraco.Core.Services /// public class ContentService : RepositoryService, IContentService { - + private readonly IPublishingStrategy _publishingStrategy; private readonly EntityXmlSerializer _entitySerializer = new EntityXmlSerializer(); private readonly IDataTypeService _dataTypeService; @@ -1698,6 +1698,13 @@ namespace Umbraco.Core.Services /// True if unpublishing succeeded, otherwise False private bool UnPublishDo(IContent content, bool omitCacheRefresh = false, int userId = 0) { + var newest = GetById(content.Id); // ensure we have the newest version + if (content.Version != newest.Version) // but use the original object if it's already the newest version + content = newest; + var published = content.Published ? content : GetPublishedVersion(content.Id); // get the published version + if (published == null) + return false; // already unpublished + var unpublished = _publishingStrategy.UnPublish(content, userId); if (unpublished) { @@ -1706,6 +1713,9 @@ namespace Umbraco.Core.Services { content.WriterId = userId; repository.AddOrUpdate(content); + // is published is not newest, reset the published flag on published version + if (published.Version != content.Version) + repository.ClearPublished(published); repository.DeleteContentXml(content); uow.Commit(); diff --git a/src/Umbraco.Core/Services/DomainService.cs b/src/Umbraco.Core/Services/DomainService.cs new file mode 100644 index 0000000000..f2ff88e001 --- /dev/null +++ b/src/Umbraco.Core/Services/DomainService.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Events; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Services +{ + public class DomainService : RepositoryService, IDomainService + { + public DomainService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger) + : base(provider, repositoryFactory, logger) + { + } + + public bool Exists(string domainName) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + { + return repo.Exists(domainName); + } + } + + public void Delete(IDomain domain) + { + if (Deleting.IsRaisedEventCancelled(new DeleteEventArgs(domain), this)) + return; + + var uow = UowProvider.GetUnitOfWork(); + using (var repository = RepositoryFactory.CreateDomainRepository(uow)) + { + repository.Delete(domain); + uow.Commit(); + } + + var args = new DeleteEventArgs(domain, false); + Deleted.RaiseEvent(args, this); + } + + public IDomain GetByName(string name) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repository = RepositoryFactory.CreateDomainRepository(uow)) + { + return repository.GetByQuery(new Query().Where(x => x.DomainName.InvariantEquals(name))).FirstOrDefault(); + } + } + + public IDomain GetById(int id) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + { + return repo.Get(id); + } + } + + public IEnumerable GetAll(bool includeWildcards) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + { + return repo.GetAll(includeWildcards); + } + } + + public IEnumerable GetAssignedDomains(int contentId, bool includeWildcards) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + { + return repo.GetAssignedDomains(contentId, includeWildcards); + } + } + + public void Save(IDomain domainEntity, bool raiseEvents = true) + { + if (raiseEvents) + { + if (Saving.IsRaisedEventCancelled(new SaveEventArgs(domainEntity), this)) + return; + } + + var uow = UowProvider.GetUnitOfWork(); + using (var repository = RepositoryFactory.CreateDomainRepository(uow)) + { + repository.AddOrUpdate(domainEntity); + uow.Commit(); + } + + if (raiseEvents) + Saved.RaiseEvent(new SaveEventArgs(domainEntity, false), this); + } + + #region Event Handlers + /// + /// Occurs before Delete + /// + public static event TypedEventHandler> Deleting; + + /// + /// Occurs after Delete + /// + public static event TypedEventHandler> Deleted; + + /// + /// Occurs before Save + /// + public static event TypedEventHandler> Saving; + + /// + /// Occurs after Save + /// + public static event TypedEventHandler> Saved; + + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Services/EntityXmlSerializer.cs b/src/Umbraco.Core/Services/EntityXmlSerializer.cs index 3e5eb6483b..949b4e61c7 100644 --- a/src/Umbraco.Core/Services/EntityXmlSerializer.cs +++ b/src/Umbraco.Core/Services/EntityXmlSerializer.cs @@ -5,6 +5,7 @@ using System.Xml; using System.Xml.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Strings; using umbraco.interfaces; @@ -177,6 +178,27 @@ namespace Umbraco.Core.Services return xml; } + public XElement Serialize(Stylesheet stylesheet) + { + var xml = new XElement("Stylesheet", + new XElement("Name", stylesheet.Alias), + new XElement("FileName", stylesheet.Path), + new XElement("Content", new XCData(stylesheet.Content))); + + var props = new XElement("Properties"); + xml.Add(props); + + foreach (var prop in stylesheet.Properties) + { + props.Add(new XElement("Property", + new XElement("Name", prop.Name), + new XElement("Alias", prop.Alias), + new XElement("Value", prop.Value))); + } + + return xml; + } + public XElement Serialize(ILanguage language) { var xml = new XElement("Language", diff --git a/src/Umbraco.Core/Services/IDomainService.cs b/src/Umbraco.Core/Services/IDomainService.cs new file mode 100644 index 0000000000..7026eca041 --- /dev/null +++ b/src/Umbraco.Core/Services/IDomainService.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Services +{ + public interface IDomainService : IService + { + bool Exists(string domainName); + void Delete(IDomain domain); + IDomain GetByName(string name); + IDomain GetById(int id); + IEnumerable GetAll(bool includeWildcards); + IEnumerable GetAssignedDomains(int contentId, bool includeWildcards); + void Save(IDomain domainEntity, bool raiseEvents = true); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Services/IRelationService.cs b/src/Umbraco.Core/Services/IRelationService.cs index 9dcc6df615..3719993a75 100644 --- a/src/Umbraco.Core/Services/IRelationService.cs +++ b/src/Umbraco.Core/Services/IRelationService.cs @@ -108,6 +108,8 @@ namespace Umbraco.Core.Services /// An enumerable list of objects IEnumerable GetByParentOrChildId(int id); + IEnumerable GetByParentOrChildId(int id, string relationTypeAlias); + /// /// Gets a list of objects by the Name of the /// diff --git a/src/Umbraco.Core/Services/ITaskService.cs b/src/Umbraco.Core/Services/ITaskService.cs index 4c9038350d..2586f4ea89 100644 --- a/src/Umbraco.Core/Services/ITaskService.cs +++ b/src/Umbraco.Core/Services/ITaskService.cs @@ -4,8 +4,13 @@ using Umbraco.Core.Models; namespace Umbraco.Core.Services { - public interface ITaskService + public interface ITaskService : IService { + TaskType GetTaskTypeByAlias(string taskTypeAlias); + TaskType GetTaskTypeById(int id); + void Save(TaskType taskType); + void Delete(TaskType taskTypeEntity); + //IEnumerable GetTasks(Guid? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false); IEnumerable GetTasks(int? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false); @@ -14,5 +19,9 @@ namespace Umbraco.Core.Services /// /// void Save(Task task); + void Delete(Task task); + + IEnumerable GetAllTaskTypes(); + Task GetTaskById(int id); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/LocalizedTextService.cs b/src/Umbraco.Core/Services/LocalizedTextService.cs index cdd52d0787..164ed77d50 100644 --- a/src/Umbraco.Core/Services/LocalizedTextService.cs +++ b/src/Umbraco.Core/Services/LocalizedTextService.cs @@ -46,10 +46,13 @@ namespace Umbraco.Core.Services /// Initializes with a source of a dictionary of culture -> areas -> sub dictionary of keys/values /// /// - public LocalizedTextService(IDictionary>> source) + /// + public LocalizedTextService(IDictionary>> source, ILogger logger) { if (source == null) throw new ArgumentNullException("source"); + if (logger == null) throw new ArgumentNullException("logger"); _dictionarySource = source; + _logger = logger; } public string Localize(string key, CultureInfo culture, IDictionary tokens = null) diff --git a/src/Umbraco.Core/Services/RelationService.cs b/src/Umbraco.Core/Services/RelationService.cs index becde9c416..db2328047d 100644 --- a/src/Umbraco.Core/Services/RelationService.cs +++ b/src/Umbraco.Core/Services/RelationService.cs @@ -203,6 +203,23 @@ namespace Umbraco.Core.Services } } + public IEnumerable GetByParentOrChildId(int id, string relationTypeAlias) + { + var uow = UowProvider.GetUnitOfWork(); + using (var relationTypeRepository = RepositoryFactory.CreateRelationTypeRepository(uow)) + { + var rtQuery = new Query().Where(x => x.Alias == relationTypeAlias); + var relationType = relationTypeRepository.GetByQuery(rtQuery).FirstOrDefault(); + if (relationType == null) return Enumerable.Empty(); + + using (var relationRepo = RepositoryFactory.CreateRelationRepository(uow)) + { + var query = new Query().Where(x => (x.ChildId == id || x.ParentId == id) && x.RelationTypeId == relationType.Id); + return relationRepo.GetByQuery(query); + } + } + } + /// /// Gets a list of objects by the Name of the /// diff --git a/src/Umbraco.Core/Services/SectionService.cs b/src/Umbraco.Core/Services/SectionService.cs index fd9519bc1c..58026ceb1d 100644 --- a/src/Umbraco.Core/Services/SectionService.cs +++ b/src/Umbraco.Core/Services/SectionService.cs @@ -210,7 +210,6 @@ namespace Umbraco.Core.Services /// The application name. /// The application alias. /// The application icon, which has to be located in umbraco/images/tray folder. - [MethodImpl(MethodImplOptions.Synchronized)] public void MakeNew(string name, string alias, string icon) { MakeNew(name, alias, icon, GetSections().Max(x => x.SortOrder) + 1); @@ -223,7 +222,6 @@ namespace Umbraco.Core.Services /// The alias. /// The icon. /// The sort order. - [MethodImpl(MethodImplOptions.Synchronized)] public void MakeNew(string name, string alias, string icon, int sortOrder) { if (GetSections().All(x => x.Alias != alias)) diff --git a/src/Umbraco.Core/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs index c4e2d83796..b635e33e9b 100644 --- a/src/Umbraco.Core/Services/ServiceContext.cs +++ b/src/Umbraco.Core/Services/ServiceContext.cs @@ -6,6 +6,7 @@ using Umbraco.Core.IO; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Publishing; +using umbraco.interfaces; namespace Umbraco.Core.Services { @@ -16,6 +17,8 @@ namespace Umbraco.Core.Services /// public class ServiceContext { + private Lazy _taskService; + private Lazy _domainService; private Lazy _auditService; private Lazy _localizedTextService; private Lazy _tagService; @@ -39,7 +42,7 @@ namespace Umbraco.Core.Services private Lazy _notificationService; /// - /// public ctor - will generally just be used for unit testing + /// public ctor - will generally just be used for unit testing all items are optional and if not specified, the defaults will be used /// /// /// @@ -60,46 +63,52 @@ namespace Umbraco.Core.Services /// /// /// + /// + /// public ServiceContext( - IContentService contentService, - IMediaService mediaService, - IContentTypeService contentTypeService, - IDataTypeService dataTypeService, - IFileService fileService, - ILocalizationService localizationService, - IPackagingService packagingService, - IEntityService entityService, - IRelationService relationService, - IMemberGroupService memberGroupService, - IMemberTypeService memberTypeService, - IMemberService memberService, - IUserService userService, - ISectionService sectionService, - IApplicationTreeService treeService, - ITagService tagService, - INotificationService notificationService, - ILocalizedTextService localizedTextService, - IAuditService auditService) + IContentService contentService = null, + IMediaService mediaService = null, + IContentTypeService contentTypeService = null, + IDataTypeService dataTypeService = null, + IFileService fileService = null, + ILocalizationService localizationService = null, + IPackagingService packagingService = null, + IEntityService entityService = null, + IRelationService relationService = null, + IMemberGroupService memberGroupService = null, + IMemberTypeService memberTypeService = null, + IMemberService memberService = null, + IUserService userService = null, + ISectionService sectionService = null, + IApplicationTreeService treeService = null, + ITagService tagService = null, + INotificationService notificationService = null, + ILocalizedTextService localizedTextService = null, + IAuditService auditService = null, + IDomainService domainService = null, + ITaskService taskService = null) { - _auditService = new Lazy(() => auditService); - _localizedTextService = new Lazy(() => localizedTextService); - _tagService = new Lazy(() => tagService); - _contentService = new Lazy(() => contentService); - _mediaService = new Lazy(() => mediaService); - _contentTypeService = new Lazy(() => contentTypeService); - _dataTypeService = new Lazy(() => dataTypeService); - _fileService = new Lazy(() => fileService); - _localizationService = new Lazy(() => localizationService); - _packagingService = new Lazy(() => packagingService); - _entityService = new Lazy(() => entityService); - _relationService = new Lazy(() => relationService); - _sectionService = new Lazy(() => sectionService); - _memberGroupService = new Lazy(() => memberGroupService); - _memberTypeService = new Lazy(() => memberTypeService); - _treeService = new Lazy(() => treeService); - _memberService = new Lazy(() => memberService); - _userService = new Lazy(() => userService); - _notificationService = new Lazy(() => notificationService); + if (_auditService != null) _auditService = new Lazy(() => auditService); + if (_localizedTextService != null) _localizedTextService = new Lazy(() => localizedTextService); + if (_tagService != null) _tagService = new Lazy(() => tagService); + if (_contentService != null) _contentService = new Lazy(() => contentService); + if (_mediaService != null) _mediaService = new Lazy(() => mediaService); + if (_contentTypeService != null) _contentTypeService = new Lazy(() => contentTypeService); + if (_dataTypeService != null) _dataTypeService = new Lazy(() => dataTypeService); + if (_fileService != null) _fileService = new Lazy(() => fileService); + if (_localizationService != null) _localizationService = new Lazy(() => localizationService); + if (_packagingService != null) _packagingService = new Lazy(() => packagingService); + if (_entityService != null) _entityService = new Lazy(() => entityService); + if (_relationService != null) _relationService = new Lazy(() => relationService); + if (_sectionService != null) _sectionService = new Lazy(() => sectionService); + if (_memberGroupService != null) _memberGroupService = new Lazy(() => memberGroupService); + if (_memberTypeService != null) _memberTypeService = new Lazy(() => memberTypeService); + if (_treeService != null) _treeService = new Lazy(() => treeService); + if (_memberService != null) _memberService = new Lazy(() => memberService); + if (_userService != null) _userService = new Lazy(() => userService); + if (_notificationService != null) _notificationService = new Lazy(() => notificationService); + if (_domainService != null) _domainService = new Lazy(() => domainService); + if (_taskService != null) _taskService = new Lazy(() => taskService); } internal ServiceContext( @@ -129,6 +138,12 @@ namespace Umbraco.Core.Services var provider = dbUnitOfWorkProvider; var fileProvider = fileUnitOfWorkProvider; + if (_taskService == null) + _taskService = new Lazy(() => new TaskService(provider, repositoryFactory, logger)); + + if (_domainService == null) + _domainService = new Lazy(() => new DomainService(provider, repositoryFactory, logger)); + if (_auditService == null) _auditService = new Lazy(() => new AuditService(provider, repositoryFactory, logger)); @@ -198,6 +213,22 @@ namespace Umbraco.Core.Services } + /// + /// Gets the + /// + public ITaskService TaskService + { + get { return _taskService.Value; } + } + + /// + /// Gets the + /// + public IDomainService DomainService + { + get { return _domainService.Value; } + } + /// /// Gets the /// diff --git a/src/Umbraco.Core/Services/TaskService.cs b/src/Umbraco.Core/Services/TaskService.cs index 08a641c359..861e49c9fc 100644 --- a/src/Umbraco.Core/Services/TaskService.cs +++ b/src/Umbraco.Core/Services/TaskService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Linq.Expressions; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -16,13 +17,50 @@ namespace Umbraco.Core.Services { } - //public IEnumerable GetTasks(Guid? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false) - //{ - // using (var repo = RepositoryFactory.CreateTaskRepository(UowProvider.GetUnitOfWork())) - // { - // return repo.GetTasks(itemId, assignedUser, ownerUser, taskTypeAlias); - // } - //} + public TaskType GetTaskTypeByAlias(string taskTypeAlias) + { + using (var repo = RepositoryFactory.CreateTaskTypeRepository(UowProvider.GetUnitOfWork())) + { + return repo.GetByQuery(new Query().Where(type => type.Alias == taskTypeAlias)).FirstOrDefault(); + } + } + + public TaskType GetTaskTypeById(int id) + { + using (var repo = RepositoryFactory.CreateTaskTypeRepository(UowProvider.GetUnitOfWork())) + { + return repo.Get(id); + } + } + + public void Save(TaskType taskType) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateTaskTypeRepository(uow)) + { + repo.AddOrUpdate(taskType); + uow.Commit(); + } + } + + public void Delete(TaskType taskTypeEntity) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateTaskTypeRepository(uow)) + { + repo.Delete(taskTypeEntity); + uow.Commit(); + } + } + + public IEnumerable GetAllTaskTypes() + { + using (var repo = RepositoryFactory.CreateTaskTypeRepository(UowProvider.GetUnitOfWork())) + { + return repo.GetAll(); + } + } + public IEnumerable GetTasks(int? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false) { @@ -45,5 +83,23 @@ namespace Umbraco.Core.Services uow.Commit(); } } + + public void Delete(Task task) + { + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateTaskRepository(uow)) + { + repo.Delete(task); + uow.Commit(); + } + } + + public Task GetTaskById(int id) + { + using (var repo = RepositoryFactory.CreateTaskRepository(UowProvider.GetUnitOfWork())) + { + return repo.Get(id); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index ab608bb089..7ab46ed973 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -84,10 +84,16 @@ + + ..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Extensions.dll + ..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll False + + ..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Primitives.dll + @@ -300,12 +306,20 @@ + + + + + + + + @@ -316,7 +330,9 @@ + + diff --git a/src/Umbraco.Core/packages.config b/src/Umbraco.Core/packages.config index 0a7e3b962b..7e5c37bd94 100644 --- a/src/Umbraco.Core/packages.config +++ b/src/Umbraco.Core/packages.config @@ -10,7 +10,7 @@ - + diff --git a/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7TagsUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7TagsUpgradeTest.cs index e8fccc48f8..f784dc3bea 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7TagsUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7TagsUpgradeTest.cs @@ -25,10 +25,10 @@ namespace Umbraco.Tests.Migrations.Upgrades { private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { - var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()); - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); - var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, contentTypeRepository, templateRepository, tagRepository); + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, templateRepository); + var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, contentTypeRepository, templateRepository, tagRepository); return repository; } diff --git a/src/Umbraco.Tests/MockTests.cs b/src/Umbraco.Tests/MockTests.cs index 68a01810fa..e7fdfea54d 100644 --- a/src/Umbraco.Tests/MockTests.cs +++ b/src/Umbraco.Tests/MockTests.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Profiling; using Umbraco.Core.Services; using Moq; +using Umbraco.Tests.TestHelpers; using Umbraco.Web; namespace Umbraco.Tests @@ -31,40 +32,7 @@ namespace Umbraco.Tests [Test] public void Can_Create_Service_Context() { - var svcCtx = new ServiceContext( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new PackagingService( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mock.Of(), Mock.Of()), - new Mock().Object), - new Mock().Object, - new RelationService( - new Mock().Object, - new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mock.Of(), Mock.Of()), - new Mock().Object), - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - Mock.Of(), - Mock.Of()); + var svcCtx = MockHelper.GetMockedServiceContext(); Assert.Pass(); } @@ -80,40 +48,7 @@ namespace Umbraco.Tests { var appCtx = new ApplicationContext( new DatabaseContext(new Mock().Object, Mock.Of(), Mock.Of(), "test"), - new ServiceContext( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new PackagingService( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mock.Of(), Mock.Of()), - new Mock().Object), - new Mock().Object, - new RelationService( - new Mock().Object, - new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mock.Of(), Mock.Of()), - new Mock().Object), - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - Mock.Of(), - Mock.Of()), + MockHelper.GetMockedServiceContext(), CacheHelper.CreateDisabledCacheHelper(), new ProfilingLogger(Mock.Of(), Mock.Of())); @@ -146,6 +81,7 @@ namespace Umbraco.Tests var umbCtx = UmbracoContext.EnsureContext( new Mock().Object, appCtx, + Mock.Of(), true); Assert.AreEqual(umbCtx, UmbracoContext.Current); diff --git a/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs index f5ffee1ce3..9c76cbefe0 100644 --- a/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs @@ -6,7 +6,15 @@ using System.Text; using System.Web.Mvc; using System.Web.Routing; using System.Xml; +using Moq; using NUnit.Framework; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Profiling; +using Umbraco.Core.Services; using Umbraco.Web.Security; using umbraco.BusinessLogic; using Umbraco.Core; @@ -366,11 +374,56 @@ namespace Umbraco.Tests.Mvc #region Test helpers + ServiceContext GetServiceContext(IUmbracoSettingsSection umbracoSettings, ILogger logger) + { + var svcCtx = new ServiceContext( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new PackagingService( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), logger, Mock.Of(), umbracoSettings), + new Mock().Object), + new Mock().Object, + new RelationService( + new Mock().Object, + new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), logger, Mock.Of(), umbracoSettings), + logger, + new Mock().Object), + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + Mock.Of(), + Mock.Of(), + Mock.Of()); + return svcCtx; + } + ViewContext GetViewContext() { - var umbracoContext = GetUmbracoContext("/dang", 0); + var settings = SettingsForTests.GetDefault(); + var logger = Mock.Of(); + var umbracoContext = GetUmbracoContext( + logger, settings, + "/dang", 0); - var urlProvider = new UrlProvider(umbracoContext, new IUrlProvider[] { new DefaultUrlProvider() }); + var urlProvider = new UrlProvider(umbracoContext, settings.WebRouting, new IUrlProvider[] { new DefaultUrlProvider() }); var routingContext = new RoutingContext( umbracoContext, Enumerable.Empty(), @@ -389,7 +442,7 @@ namespace Umbraco.Tests.Mvc return context; } - protected UmbracoContext GetUmbracoContext(string url, int templateId, RouteData routeData = null, bool setSingleton = false) + protected UmbracoContext GetUmbracoContext(ILogger logger, IUmbracoSettingsSection umbracoSettings, string url, int templateId, RouteData routeData = null, bool setSingleton = false) { var cache = new PublishedContentCache(); @@ -403,7 +456,14 @@ namespace Umbraco.Tests.Mvc //PublishedContentCache.UnitTesting = true; // ApplicationContext.Current = new ApplicationContext(false) { IsReady = true }; - var appCtx = new ApplicationContext(CacheHelper.CreateDisabledCacheHelper()) { IsReady = true }; + var svcCtx = GetServiceContext(umbracoSettings, logger); + + var appCtx = new ApplicationContext( + new DatabaseContext(Mock.Of(), logger, Mock.Of(), "test"), + svcCtx, + CacheHelper.CreateDisabledCacheHelper(), + new ProfilingLogger(logger, Mock.Of())) { IsReady = true }; + var http = GetHttpContextFactory(url, routeData).HttpContext; var ctx = new UmbracoContext( GetHttpContextFactory(url, routeData).HttpContext, diff --git a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs index c8b4a54b96..e5c74e4faa 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs @@ -58,7 +58,7 @@ namespace Umbraco.Tests.Persistence.Querying IDictionary> allAssociatedTemplates; IDictionary> allParentContentTypeIds; var contentTypes = ContentTypeRepository.ContentTypeQueryMapper.MapContentTypes( - new[] {99997, 99998}, DatabaseContext.Database, SqlSyntaxProvider, out allAssociatedTemplates, out allParentContentTypeIds) + new[] {99997, 99998}, DatabaseContext.Database, SqlSyntax, out allAssociatedTemplates, out allParentContentTypeIds) .ToArray(); var contentType1 = contentTypes.SingleOrDefault(x => x.Id == 99997); @@ -111,7 +111,7 @@ namespace Umbraco.Tests.Persistence.Querying IDictionary> allParentContentTypeIds; var contentTypes = ContentTypeRepository.ContentTypeQueryMapper.MapMediaTypes( - new[] { 99997, 99998 }, DatabaseContext.Database, SqlSyntaxProvider, out allParentContentTypeIds) + new[] { 99997, 99998 }, DatabaseContext.Database, SqlSyntax, out allParentContentTypeIds) .ToArray(); var contentType1 = contentTypes.SingleOrDefault(x => x.Id == 99997); @@ -172,7 +172,7 @@ namespace Umbraco.Tests.Persistence.Querying IDictionary allPropTypeCollection; IDictionary allPropGroupCollection; - ContentTypeRepository.ContentTypeQueryMapper.MapGroupsAndProperties(new[] { 99999 }, DatabaseContext.Database, SqlSyntaxProvider, out allPropTypeCollection, out allPropGroupCollection); + ContentTypeRepository.ContentTypeQueryMapper.MapGroupsAndProperties(new[] { 99999 }, DatabaseContext.Database, SqlSyntax, out allPropTypeCollection, out allPropGroupCollection); var propGroupCollection = allPropGroupCollection[99999]; var propTypeCollection = allPropTypeCollection[99999]; diff --git a/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs index c3cefc1e35..08012a24c4 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs @@ -1,10 +1,22 @@ +using System; +using System.Collections.Generic; using System.Linq; +using System.Xml.Linq; using NUnit.Framework; +using umbraco; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; + +using Umbraco.Core.Persistence.Mappers; +using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Tests.TestHelpers; +using umbraco.editorControls.tinyMCE3; +using umbraco.interfaces; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Tests.Persistence.Repositories { @@ -17,7 +29,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new AuditRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new AuditRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { repo.AddOrUpdate(new AuditItem(-1, "This is a System audit trail", AuditType.System, 0)); unitOfWork.Commit(); diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 9dcd1a60ce..3d004a5022 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -41,10 +41,10 @@ namespace Umbraco.Tests.Persistence.Repositories private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { - var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()); - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); - var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, contentTypeRepository, templateRepository, tagRepository); + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax); + contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, templateRepository); + var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, contentTypeRepository, templateRepository, tagRepository); return repository; } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs index 79061564cc..058dd0330e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs @@ -39,17 +39,17 @@ namespace Umbraco.Tests.Persistence.Repositories private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { - var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()); - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); - var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, contentTypeRepository, templateRepository, tagRepository); + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, templateRepository); + var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, contentTypeRepository, templateRepository, tagRepository); return repository; } private ContentTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()); - var contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, templateRepository); return contentTypeRepository; } @@ -62,7 +62,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var templateRepo = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of())) + using (var templateRepo = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of())) using (var repository = CreateRepository(unitOfWork)) { var templates = new[] diff --git a/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs index 9c9b084a48..3cb4e57efd 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs @@ -34,9 +34,9 @@ namespace Umbraco.Tests.Persistence.Repositories var dataTypeDefinitionRepository = new DataTypeDefinitionRepository( unitOfWork, CacheHelper.CreateDisabledCacheHelper(), CacheHelper.CreateDisabledCacheHelper(), - Mock.Of(), SqlSyntaxProvider, - new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, - new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()))); + Mock.Of(), SqlSyntax, + new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, + new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()))); return dataTypeDefinitionRepository; } @@ -363,9 +363,9 @@ namespace Umbraco.Tests.Persistence.Repositories Func creator = () => new DataTypeDefinitionRepository( unitOfWork, CacheHelper.CreateDisabledCacheHelper(), cache, - Mock.Of(), SqlSyntaxProvider, - new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, - new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()))); + Mock.Of(), SqlSyntax, + new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, + new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()))); DataTypeDefinition dtd; using (var repository = creator()) @@ -402,9 +402,9 @@ namespace Umbraco.Tests.Persistence.Repositories Func creator = () => new DataTypeDefinitionRepository( unitOfWork, CacheHelper.CreateDisabledCacheHelper(), cache, - Mock.Of(), SqlSyntaxProvider, - new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, - new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()))); + Mock.Of(), SqlSyntax, + new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, + new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()))); DataTypeDefinition dtd; using (var repository = creator()) diff --git a/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs index b520997ba9..25fcc5e13a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs @@ -29,7 +29,7 @@ namespace Umbraco.Tests.Persistence.Repositories private DictionaryRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out LanguageRepository languageRepository) { - languageRepository = new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + languageRepository = new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); var dictionaryRepository = new DictionaryRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), new SqlCeSyntaxProvider(), languageRepository); return dictionaryRepository; } @@ -341,7 +341,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - var languageRepository = new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + var languageRepository = new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); var repository = new DictionaryRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), new SqlCeSyntaxProvider(), languageRepository); var languageNo = new Language("nb-NO") { CultureName = "nb-NO" }; diff --git a/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs new file mode 100644 index 0000000000..7fa4f8aef0 --- /dev/null +++ b/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs @@ -0,0 +1,410 @@ +using System.Collections.Generic; +using System.Data; +using System.Linq; +using Moq; +using NUnit.Framework; +using umbraco.cms.businesslogic.contentitem; +using Umbraco.Core; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.IO; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.TestHelpers.Entities; + +namespace Umbraco.Tests.Persistence.Repositories +{ + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] + [TestFixture] + public class DomainRepositoryTest : BaseDatabaseFactoryTest + { + private DomainRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository, out ContentRepository contentRepository, out LanguageRepository languageRepository) + { + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax); + contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, templateRepository); + contentRepository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, contentTypeRepository, templateRepository, tagRepository); + languageRepository = new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax); + var domainRepository = new DomainRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, contentRepository, languageRepository); + return domainRepository; + } + + private int CreateTestData(string isoName, out ContentType ct) + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = new Language(isoName); + langRepo.AddOrUpdate(lang); + + ct = MockedContentTypes.CreateBasicContentType("test", "Test"); + contentTypeRepo.AddOrUpdate(ct); + var content = new Content("test", -1, ct) { CreatorId = 0, WriterId = 0 }; + contentRepo.AddOrUpdate(content); + unitOfWork.Commit(); + return content.Id; + } + } + + [Test] + public void Can_Create_And_Get_By_Id() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = langRepo.GetByIsoCode("en-AU"); + var content = contentRepo.Get(contentId); + + var domain = (IDomain)new UmbracoDomain("test.com") { RootContent = content, Language = lang }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + + //re-get + domain = repo.Get(domain.Id); + + Assert.NotNull(domain); + Assert.IsTrue(domain.HasIdentity); + Assert.Greater(domain.Id, 0); + Assert.AreEqual("test.com", domain.DomainName); + Assert.AreEqual(content.Id, domain.RootContent.Id); + Assert.AreEqual(lang.Id, domain.Language.Id); + } + + + } + + [Test] + public void Cant_Create_Duplicate_Domain_Name() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = langRepo.GetByIsoCode("en-AU"); + var content = contentRepo.Get(contentId); + + var domain1 = (IDomain)new UmbracoDomain("test.com") { RootContent = content, Language = lang }; + repo.AddOrUpdate(domain1); + unitOfWork.Commit(); + + var domain2 = (IDomain)new UmbracoDomain("test.com") { RootContent = content, Language = lang }; + repo.AddOrUpdate(domain2); + + Assert.Throws(unitOfWork.Commit); + + + } + + + } + + [Test] + public void Can_Delete() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = langRepo.GetByIsoCode("en-AU"); + var content = contentRepo.Get(contentId); + + var domain = (IDomain)new UmbracoDomain("test.com") { RootContent = content, Language = lang }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + + repo.Delete(domain); + unitOfWork.Commit(); + + //re-get + domain = repo.Get(domain.Id); + + + Assert.IsNull(domain); + } + + + } + + [Test] + public void Can_Update() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId1 = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var content1 = contentRepo.Get(contentId1); + + //more test data + var lang1 = langRepo.GetByIsoCode("en-AU"); + var lang2 = new Language("es"); + langRepo.AddOrUpdate(lang2); + var content2 = new Content("test", -1, ct) { CreatorId = 0, WriterId = 0 }; + contentRepo.AddOrUpdate(content2); + unitOfWork.Commit(); + + + var domain = (IDomain)new UmbracoDomain("test.com") { RootContent = content1, Language = lang1 }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + + //re-get + domain = repo.Get(domain.Id); + + domain.DomainName = "blah.com"; + domain.RootContent = content2; + domain.Language = lang2; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + + //re-get + domain = repo.Get(domain.Id); + + Assert.AreEqual("blah.com", domain.DomainName); + Assert.AreEqual(content2.Id, domain.RootContent.Id); + Assert.AreEqual(lang2.Id, domain.Language.Id); + } + + + } + + [Test] + public void Get_All() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = langRepo.GetByIsoCode("en-AU"); + var content = contentRepo.Get(contentId); + + for (int i = 0; i < 10; i++) + { + var domain = (IDomain)new UmbracoDomain("test " + i + ".com") { RootContent = content, Language = lang }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + } + + var all = repo.GetAll(); + + Assert.AreEqual(10, all.Count()); + } + } + + [Test] + public void Get_All_Ids() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = langRepo.GetByIsoCode("en-AU"); + var content = contentRepo.Get(contentId); + + var ids = new List(); + for (int i = 0; i < 10; i++) + { + var domain = (IDomain)new UmbracoDomain("test " + i + ".com") { RootContent = content, Language = lang }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + ids.Add(domain.Id); + } + + var all = repo.GetAll(ids.Take(8).ToArray()); + + Assert.AreEqual(8, all.Count()); + } + } + + [Test] + public void Get_All_Without_Wildcards() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var lang = langRepo.GetByIsoCode("en-AU"); + var content = contentRepo.Get(contentId); + + for (int i = 0; i < 10; i++) + { + var domain = (IDomain)new UmbracoDomain((i % 2 == 0) ? "test " + i + ".com" : ("*" + i)) + { + RootContent = content, + Language = lang + }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + } + + var all = repo.GetAll(false); + + Assert.AreEqual(5, all.Count()); + } + } + + [Test] + public void Get_All_For_Content() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var contentItems = new List(); + + var lang = langRepo.GetByIsoCode("en-AU"); + contentItems.Add(contentRepo.Get(contentId)); + + //more test data (3 content items total) + for (int i = 0; i < 2; i++) + { + var c = new Content("test" + i, -1, ct) { CreatorId = 0, WriterId = 0 }; + contentRepo.AddOrUpdate(c); + unitOfWork.Commit(); + contentItems.Add(c); + } + + for (int i = 0; i < 10; i++) + { + var domain = (IDomain)new UmbracoDomain((i % 2 == 0) ? "test " + i + ".com" : ("*" + i)) + { + RootContent = (i % 2 == 0) ? contentItems[0] : contentItems[1], + Language = lang + }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + } + + var all1 = repo.GetAssignedDomains(contentItems[0].Id, true); + Assert.AreEqual(5, all1.Count()); + + var all2 = repo.GetAssignedDomains(contentItems[1].Id, true); + Assert.AreEqual(5, all2.Count()); + + var all3 = repo.GetAssignedDomains(contentItems[2].Id, true); + Assert.AreEqual(0, all3.Count()); + } + } + + [Test] + public void Get_All_For_Content_Without_Wildcards() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + + ContentType ct; + var contentId = CreateTestData("en-AU", out ct); + + ContentRepository contentRepo; + LanguageRepository langRepo; + ContentTypeRepository contentTypeRepo; + + using (var repo = CreateRepository(unitOfWork, out contentTypeRepo, out contentRepo, out langRepo)) + { + var contentItems = new List(); + + var lang = langRepo.GetByIsoCode("en-AU"); + contentItems.Add(contentRepo.Get(contentId)); + + //more test data (3 content items total) + for (int i = 0; i < 2; i++) + { + var c = new Content("test" + i, -1, ct) { CreatorId = 0, WriterId = 0 }; + contentRepo.AddOrUpdate(c); + unitOfWork.Commit(); + contentItems.Add(c); + } + + for (int i = 0; i < 10; i++) + { + var domain = (IDomain)new UmbracoDomain((i % 2 == 0) ? "test " + i + ".com" : ("*" + i)) + { + RootContent = (i % 2 == 0) ? contentItems[0] : contentItems[1], + Language = lang + }; + repo.AddOrUpdate(domain); + unitOfWork.Commit(); + } + + var all1 = repo.GetAssignedDomains(contentItems[0].Id, false); + Assert.AreEqual(5, all1.Count()); + + var all2 = repo.GetAssignedDomains(contentItems[1].Id, false); + Assert.AreEqual(0, all2.Count()); + + } + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs index e07dc79141..e4c403b280 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs @@ -28,7 +28,7 @@ namespace Umbraco.Tests.Persistence.Repositories private LanguageRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - return new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + return new LanguageRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs index 005b1a211a..251fb7c566 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs @@ -34,7 +34,7 @@ namespace Umbraco.Tests.Persistence.Repositories var unitOfWork = provider.GetUnitOfWork(); // Act - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = new Macro("test1", "Test", "~/usercontrol/blah.ascx", "MyAssembly", "test.xslt", "~/views/macropartials/test.cshtml"); repository.AddOrUpdate(macro); @@ -52,7 +52,7 @@ namespace Umbraco.Tests.Persistence.Repositories var unitOfWork = provider.GetUnitOfWork(); // Act - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = repository.Get(1); macro.Alias = "test2"; @@ -70,7 +70,7 @@ namespace Umbraco.Tests.Persistence.Repositories var unitOfWork = provider.GetUnitOfWork(); // Act - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Assert Assert.That(repository, Is.Not.Null); @@ -83,7 +83,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var macro = repository.Get(1); @@ -113,7 +113,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var macros = repository.GetAll(); @@ -130,7 +130,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var query = Query.Builder.Where(x => x.Alias.ToUpper() == "TEST1"); @@ -147,7 +147,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var query = Query.Builder.Where(x => x.Name.StartsWith("Test")); @@ -164,7 +164,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var macro = new Macro("test", "Test", "~/usercontrol/blah.ascx", "MyAssembly", "test.xslt", "~/views/macropartials/test.cshtml"); @@ -185,7 +185,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var macro = repository.Get(2); @@ -226,7 +226,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var macro = repository.Get(3); @@ -247,7 +247,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { // Act var exists = repository.Exists(3); @@ -265,7 +265,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = repository.Get(1); macro.Properties.Add(new MacroProperty("new1", "New1", 3, "test")); @@ -292,7 +292,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = new Macro("newmacro", "A new macro", "~/usercontrol/test1.ascx", "MyAssembly1", "test1.xslt", "~/views/macropartials/test1.cshtml"); macro.Properties.Add(new MacroProperty("blah1", "New1", 4, "test.editor")); @@ -317,7 +317,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = new Macro("newmacro", "A new macro", "~/usercontrol/test1.ascx", "MyAssembly1", "test1.xslt", "~/views/macropartials/test1.cshtml"); macro.Properties.Add(new MacroProperty("blah1", "New1", 4, "test.editor")); @@ -342,7 +342,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = new Macro("newmacro", "A new macro", "~/usercontrol/test1.ascx", "MyAssembly1", "test1.xslt", "~/views/macropartials/test1.cshtml"); var prop1 = new MacroProperty("blah1", "New1", 4, "test.editor"); @@ -373,7 +373,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = repository.Get(1); macro.Properties.Add(new MacroProperty("new1", "New1", 3, "test")); @@ -401,7 +401,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { var macro = repository.Get(1); macro.Properties.Add(new MacroProperty("new1", "New1", 3, "test")); @@ -430,7 +430,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); using (var unitOfWork = provider.GetUnitOfWork()) - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { repository.AddOrUpdate(new Macro("test1", "Test1", "~/usercontrol/test1.ascx", "MyAssembly1", "test1.xslt", "~/views/macropartials/test1.cshtml")); repository.AddOrUpdate(new Macro("test2", "Test2", "~/usercontrol/test2.ascx", "MyAssembly2", "test2.xslt", "~/views/macropartials/test2.cshtml")); diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs index 7ad3bb59f9..918577635c 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs @@ -28,7 +28,7 @@ namespace Umbraco.Tests.Persistence.Repositories private MediaTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - return new MediaTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + return new MediaTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); } [Test] diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index c8be935f36..9769a91cb2 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -35,10 +35,10 @@ namespace Umbraco.Tests.Persistence.Repositories private MemberRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out MemberTypeRepository memberTypeRepository, out MemberGroupRepository memberGroupRepository) { - memberTypeRepository = new MemberTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - memberGroupRepository = new MemberGroupRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, CacheHelper.CreateDisabledCacheHelper()); - var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - var repository = new MemberRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, memberTypeRepository, memberGroupRepository, tagRepo); + memberTypeRepository = new MemberTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + memberGroupRepository = new MemberGroupRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, CacheHelper.CreateDisabledCacheHelper()); + var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + var repository = new MemberRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, memberTypeRepository, memberGroupRepository, tagRepo); return repository; } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs index 2ec84225b5..1360500d96 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs @@ -32,7 +32,7 @@ namespace Umbraco.Tests.Persistence.Repositories private MemberTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - return new MemberTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + return new MemberTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); } [Test] diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index 1c41460219..ad021920fa 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -30,8 +30,8 @@ namespace Umbraco.Tests.Persistence.Repositories private RelationRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out RelationTypeRepository relationTypeRepository) { - relationTypeRepository = new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - var repository = new RelationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, relationTypeRepository); + relationTypeRepository = new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + var repository = new RelationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, relationTypeRepository); return repository; } @@ -265,8 +265,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - var relationTypeRepository = new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - var relationRepository = new RelationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, relationTypeRepository); + var relationTypeRepository = new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + var relationRepository = new RelationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, relationTypeRepository); relationTypeRepository.AddOrUpdate(relateContent); relationTypeRepository.AddOrUpdate(relateContentType); diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs index 15bf31291d..2a95957ea8 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs @@ -29,7 +29,7 @@ namespace Umbraco.Tests.Persistence.Repositories private RelationTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - return new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + return new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); } @@ -235,7 +235,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - var repository = new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + var repository = new RelationTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); repository.AddOrUpdate(relateContent);//Id 2 repository.AddOrUpdate(relateContentType);//Id 3 diff --git a/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs index cbd8aa9deb..9433c9a2b6 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs @@ -28,7 +28,7 @@ namespace Umbraco.Tests.Persistence.Repositories private ServerRegistrationRepository CreateRepositor(IDatabaseUnitOfWork unitOfWork) { - return new ServerRegistrationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + return new ServerRegistrationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); } [Test] @@ -246,7 +246,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); using (var unitOfWork = provider.GetUnitOfWork()) - using (var repository = new ServerRegistrationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new ServerRegistrationRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { repository.AddOrUpdate(new ServerRegistration("http://localhost", "COMPUTER1", DateTime.Now) { IsActive = true }); repository.AddOrUpdate(new ServerRegistration("http://www.mydomain.com", "COMPUTER2", DateTime.Now)); diff --git a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs index f6714728ce..93089b6e93 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs @@ -35,7 +35,7 @@ namespace Umbraco.Tests.Persistence.Repositories private TagRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); return tagRepository; } @@ -939,18 +939,18 @@ namespace Umbraco.Tests.Persistence.Repositories private ContentRepository CreateContentRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { - var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()); - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); - var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, contentTypeRepository, templateRepository, tagRepository); + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, templateRepository); + var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, contentTypeRepository, templateRepository, tagRepository); return repository; } private MediaRepository CreateMediaRepository(IDatabaseUnitOfWork unitOfWork, out MediaTypeRepository mediaTypeRepository) { - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - mediaTypeRepository = new MediaTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - var repository = new MediaRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, mediaTypeRepository, tagRepository); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + mediaTypeRepository = new MediaTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + var repository = new MediaRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, mediaTypeRepository, tagRepository); return repository; } } diff --git a/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs index 4bb55ba472..1477f62e9f 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs @@ -12,12 +12,39 @@ namespace Umbraco.Tests.Persistence.Repositories [TestFixture] public class TaskRepositoryTest : BaseDatabaseFactoryTest { + [Test] + public void Can_Delete() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) + { + var created = DateTime.Now; + var task = new Task(new TaskType("asdfasdf")) + { + AssigneeUserId = 0, + Closed = false, + Comment = "hello world", + EntityId = -1, + OwnerUserId = 0 + }; + repo.AddOrUpdate(task); + unitOfWork.Commit(); + + repo.Delete(task); + unitOfWork.Commit(); + + task = repo.Get(task.Id); + Assert.IsNull(task); + } + } + [Test] public void Can_Add() { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var created = DateTime.Now; repo.AddOrUpdate(new Task(new TaskType("asdfasdf")) @@ -49,7 +76,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var task = new Task(new TaskType("asdfasdf")) { @@ -79,7 +106,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var task = new Task(new TaskType("asdfasdf")) { @@ -107,7 +134,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var found = repo.GetAll().ToArray(); Assert.AreEqual(20, found.Count()); @@ -122,7 +149,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var found = repo.GetTasks(includeClosed: true).ToArray(); Assert.AreEqual(15, found.Count()); @@ -137,7 +164,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var found = repo.GetTasks(itemId:-20).ToArray(); Assert.AreEqual(10, found.Count()); @@ -152,7 +179,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { var found = repo.GetTasks(includeClosed: false); Assert.AreEqual(10, found.Count()); @@ -163,7 +190,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntaxProvider)) + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { for (int i = 0; i < count; i++) { diff --git a/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs new file mode 100644 index 0000000000..ef80df5f3a --- /dev/null +++ b/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using NUnit.Framework; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Persistence.Repositories +{ + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] + [TestFixture] + public class TaskTypeRepositoryTest : BaseDatabaseFactoryTest + { + [Test] + public void Can_Delete() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + var taskType = new TaskType("asdfasdf"); + using (var repo = new TaskRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) + using (var taskTypeRepo = new TaskTypeRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) + { + var created = DateTime.Now; + var task = new Task(taskType) + { + AssigneeUserId = 0, + Closed = false, + Comment = "hello world", + EntityId = -1, + OwnerUserId = 0 + }; + repo.AddOrUpdate(task); + unitOfWork.Commit(); + + var alltasktypes = taskTypeRepo.GetAll(); + + taskTypeRepo.Delete(taskType); + unitOfWork.Commit(); + + Assert.AreEqual(alltasktypes.Count() - 1, taskTypeRepo.GetAll().Count()); + Assert.AreEqual(0, repo.GetAll().Count()); + } + + + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs index 4987309e34..a8cc8b41e3 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs @@ -28,7 +28,7 @@ namespace Umbraco.Tests.Persistence.Repositories private ITemplateRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, ITemplatesSection templatesSection = null) { - return new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, _masterPageFileSystem, _viewsFileSystem, + return new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, _masterPageFileSystem, _viewsFileSystem, templatesSection ?? Mock.Of(t => t.DefaultRenderingEngine == RenderingEngine.Mvc)); } @@ -404,9 +404,9 @@ namespace Umbraco.Tests.Persistence.Repositories using (var templateRepository = CreateRepository(unitOfWork)) { - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - var contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); - var contentRepo = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, contentTypeRepository, templateRepository, tagRepository); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + var contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, templateRepository); + var contentRepo = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, contentTypeRepository, templateRepository, tagRepository); using (contentRepo) { diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 7f6051a62e..1d26e59113 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -34,8 +34,8 @@ namespace Umbraco.Tests.Persistence.Repositories private UserRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out UserTypeRepository userTypeRepository) { - userTypeRepository = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, userTypeRepository); + userTypeRepository = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, userTypeRepository); return repository; } @@ -175,8 +175,8 @@ namespace Umbraco.Tests.Persistence.Repositories unitOfWork.Commit(); var id = user.Id; - using (var utRepo = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) - using (var repository2 = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, utRepo)) + using (var utRepo = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) + using (var repository2 = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, utRepo)) { repository2.Delete(user); unitOfWork.Commit(); @@ -483,8 +483,8 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var utRepo = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) - using (var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, utRepo)) + using (var utRepo = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) + using (var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, utRepo)) { // Act @@ -534,7 +534,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var repository = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) + using (var repository = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) { var userType = MockedUserType.CreateUserType(); repository.AddOrUpdate(userType); diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs index c84397049d..5efc139931 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs @@ -32,7 +32,7 @@ namespace Umbraco.Tests.Persistence.Repositories private UserTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { - return new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); + return new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); } [Test] @@ -143,7 +143,7 @@ namespace Umbraco.Tests.Persistence.Repositories unitOfWork.Commit(); var id = userType.Id; - using (var repository2 = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) + using (var repository2 = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) { repository2.Delete(userType); unitOfWork.Commit(); diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentRequestEngineTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentRequestEngineTests.cs index 25fa7df5f7..ff72ad1d1e 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentRequestEngineTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentRequestEngineTests.cs @@ -16,7 +16,11 @@ namespace Umbraco.Tests.PublishedContent [Test] public void Ctor_Throws_On_Null_PCR() { - Assert.Throws(() => new PublishedContentRequestEngine(null)); + Assert.Throws(() => new PublishedContentRequestEngine( + ServiceContext.DomainService, + ServiceContext.LocalizationService, + ProfilingLogger, + null)); } [Test] @@ -25,6 +29,9 @@ namespace Umbraco.Tests.PublishedContent var routeCtx = GetRoutingContext("/test"); var pcre = new PublishedContentRequestEngine( + ServiceContext.DomainService, + ServiceContext.LocalizationService, + ProfilingLogger, new PublishedContentRequest( routeCtx.UmbracoContext.CleanedUmbracoUrl, routeCtx)); @@ -42,7 +49,11 @@ namespace Umbraco.Tests.PublishedContent pcr.PublishedContent = pc.Object; pcr.Culture = new CultureInfo("en-AU"); pcr.SetRedirect("/hello"); - var pcre = new PublishedContentRequestEngine(pcr); + var pcre = new PublishedContentRequestEngine( + ServiceContext.DomainService, + ServiceContext.LocalizationService, + ProfilingLogger, + pcr); var result = pcre.ConfigureRequest(); Assert.IsFalse(result); @@ -57,7 +68,11 @@ namespace Umbraco.Tests.PublishedContent var pc = GetPublishedContentMock(); pcr.PublishedContent = pc.Object; pcr.Culture = new CultureInfo("en-AU"); - var pcre = new PublishedContentRequestEngine(pcr); + var pcre = new PublishedContentRequestEngine( + ServiceContext.DomainService, + ServiceContext.LocalizationService, + ProfilingLogger, + pcr); pcre.ConfigureRequest(); @@ -74,7 +89,11 @@ namespace Umbraco.Tests.PublishedContent var pc = GetPublishedContentMock(); pcr.Culture = new CultureInfo("en-AU"); pcr.PublishedContent = pc.Object; - var pcre = new PublishedContentRequestEngine(pcr); + var pcre = new PublishedContentRequestEngine( + ServiceContext.DomainService, + ServiceContext.LocalizationService, + ProfilingLogger, + pcr); pcre.ConfigureRequest(); diff --git a/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs index 9674baf920..f8cb9d1f94 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs @@ -1,14 +1,14 @@ using Moq; using NUnit.Framework; using Umbraco.Core.Logging; -using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; namespace Umbraco.Tests.Routing { + //TODO: We should be able to decouple this from the base db tests since we're just mocking the services now [TestFixture] - public class ContentFinderByAliasTests : BaseRoutingTest + public class ContentFinderByAliasTests : UrlRoutingTestBase { [TestCase("/this/is/my/alias", 1001)] [TestCase("/anotheralias", 1001)] diff --git a/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs index e52498033e..d69a6133ed 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs @@ -1,53 +1,15 @@ -using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core.Logging; -using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; -using umbraco.cms.businesslogic.language; -using umbraco.cms.businesslogic.web; namespace Umbraco.Tests.Routing { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [TestFixture] public class ContentFinderByAliasWithDomainsTests : ContentFinderByAliasTests { - public override void Initialize() - { - base.Initialize(); - // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); - - InitializeLanguagesAndDomains(); - } - - void InitializeLanguagesAndDomains() - { - var domains = Domain.GetDomains(); - foreach (var d in domains) - d.Delete(); - - var langs = Language.GetAllAsList(); - foreach (var l in langs.Skip(1)) - l.Delete(); - - // en-US is there by default - Language.MakeNew("fr-FR"); - Language.MakeNew("de-DE"); - } - - void SetDomains1() - { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); - var langDe = Language.GetByCultureCode("de-DE"); - - Domain.MakeNew("domain1.com/", 1001, langDe.id); - Domain.MakeNew("domain1.com/en", 10011, langEn.id); - Domain.MakeNew("domain1.com/fr", 10012, langFr.id); - } [TestCase("http://domain1.com/this/is/my/alias", "de-DE", -1001)] // alias to domain's page fails - no alias on domain's home @@ -62,7 +24,7 @@ namespace Umbraco.Tests.Routing [TestCase("http://domain1.com/en/bar/nil", "en-US", 100111)] // ok, alias includes "en/" public void Lookup_By_Url_Alias_And_Domain(string inputUrl, string expectedCulture, int expectedNode) { - SetDomains1(); + //SetDomains1(); var routingContext = GetRoutingContext(inputUrl); var url = routingContext.UmbracoContext.CleanedUmbracoUrl; //very important to use the cleaned up umbraco url diff --git a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs index 1d3727ce42..3dcc127f86 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs @@ -1,65 +1,35 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Moq; -using NUnit.Framework; -using Umbraco.Core.Logging; +using NUnit.Framework; +using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; -using umbraco.cms.businesslogic.web; -using umbraco.cms.businesslogic.language; -using System.Configuration; namespace Umbraco.Tests.Routing { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [TestFixture] - public class ContentFinderByNiceUrlWithDomainsTests : BaseRoutingTest + public class ContentFinderByNiceUrlWithDomainsTests : UrlRoutingTestBase { - public override void Initialize() - { - base.Initialize(); - - // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); - - InitializeLanguagesAndDomains(); - } - - void InitializeLanguagesAndDomains() - { - var domains = Domain.GetDomains(); - foreach (var d in domains) - d.Delete(); - - var langs = Language.GetAllAsList(); - foreach (var l in langs.Skip(1)) - l.Delete(); - - Language.MakeNew("fr-FR"); - } - void SetDomains3() { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); + SetupDomainServiceMock(new[] + { + new UmbracoDomain("domain1.com/") {Id = 1, Language = new Language("de-DE"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}} + }); - Domain.MakeNew("domain1.com/", 1001, langEn.id); } void SetDomains4() { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); + SetupDomainServiceMock(new[] + { + new UmbracoDomain("domain1.com/") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}}, + new UmbracoDomain("domain1.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test2", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("domain1.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test3", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("http://domain3.com/") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1003}}, + new UmbracoDomain("http://domain3.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test2", -1, new ContentType(-1)) {Id = 10031}}, + new UmbracoDomain("http://domain3.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test3", -1, new ContentType(-1)) {Id = 10032}} + }); - Domain.MakeNew("domain1.com/", 1001, langEn.id); - Domain.MakeNew("domain1.com/en", 10011, langEn.id); - Domain.MakeNew("domain1.com/fr", 10012, langFr.id); - - Domain.MakeNew("http://domain3.com/", 1003, langEn.id); - Domain.MakeNew("http://domain3.com/en", 10031, langEn.id); - Domain.MakeNew("http://domain3.com/fr", 10032, langFr.id); } protected override string GetXmlContent(int templateId) @@ -162,7 +132,7 @@ namespace Umbraco.Tests.Routing // must lookup domain else lookup by url fails pcr.Engine.FindDomain(); - var lookup = new ContentFinderByNiceUrl(Logger); + var lookup = new ContentFinderByNiceUrl(); var result = lookup.TryFindContent(pcr); Assert.IsTrue(result); Assert.AreEqual(expectedId, pcr.PublishedContent.Id); @@ -201,7 +171,7 @@ namespace Umbraco.Tests.Routing pcr.Engine.FindDomain(); Assert.AreEqual(expectedCulture, pcr.Culture.Name); - var lookup = new ContentFinderByNiceUrl(Logger); + var lookup = new ContentFinderByNiceUrl(); var result = lookup.TryFindContent(pcr); Assert.IsTrue(result); Assert.AreEqual(expectedId, pcr.PublishedContent.Id); diff --git a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs index 4b7aa91dc6..9042bbca53 100644 --- a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs +++ b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs @@ -4,72 +4,41 @@ using System.Linq; using System.Text; using Moq; using NUnit.Framework; -using Umbraco.Core.Logging; +using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; using umbraco.cms.businesslogic.web; -using umbraco.cms.businesslogic.language; +using System.Configuration; namespace Umbraco.Tests.Routing { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - class DomainsAndCulturesTests : BaseRoutingTest + class DomainsAndCulturesTests : UrlRoutingTestBase { - public override void Initialize() - { - base.Initialize(); - - // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); - - InitializeLanguagesAndDomains(); - } - - void InitializeLanguagesAndDomains() - { - var domains = Domain.GetDomains(true); // we want wildcards too here - foreach (var d in domains) - d.Delete(); - - var langs = Language.GetAllAsList(); - foreach (var l in langs.Skip(1)) - l.Delete(); - - // en-US is there by default - Language.MakeNew("fr-FR"); - Language.MakeNew("de-DE"); - - Language.MakeNew("da-DK"); - Language.MakeNew("cs-CZ"); - Language.MakeNew("nl-NL"); - } - void SetDomains1() { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); - var langDe = Language.GetByCultureCode("de-DE"); - - Domain.MakeNew("domain1.com/", 1001, langDe.id); - Domain.MakeNew("domain1.com/en", 10011, langEn.id); - Domain.MakeNew("domain1.com/fr", 10012, langFr.id); + SetupDomainServiceMock(new[] + { + new UmbracoDomain("domain1.com/") {Id = 1, Language = new Language("de-DE"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}}, + new UmbracoDomain("domain1.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("domain1.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}} + }); } void SetDomains2() { - SetDomains1(); - - var langDk = Language.GetByCultureCode("da-DK"); - var langCz = Language.GetByCultureCode("cs-CZ"); - var langNl = Language.GetByCultureCode("nl-NL"); - - Domain.MakeNew("*1001", 1001, langDk.id); - Domain.MakeNew("*10011", 10011, langCz.id); - Domain.MakeNew("*100112", 100112, langNl.id); - Domain.MakeNew("*1001122", 1001122, langDk.id); - Domain.MakeNew("*10012", 10012, langNl.id); - Domain.MakeNew("*10031", 10031, langNl.id); + SetupDomainServiceMock(new[] + { + new UmbracoDomain("domain1.com/") {Id = 1, Language = new Language("de-DE"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}}, + new UmbracoDomain("domain1.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("domain1.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("*1001") {Id = 1, Language = new Language("de-DE"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}}, + new UmbracoDomain("*10011") {Id = 1, Language = new Language("cs-CZ"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("*100112") {Id = 1, Language = new Language("nl-NL"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 100112}}, + new UmbracoDomain("*1001122") {Id = 1, Language = new Language("da-DK"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001122}}, + new UmbracoDomain("*10012") {Id = 1, Language = new Language("nl-NL"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("*10031") {Id = 1, Language = new Language("nl-NL"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10031}} + }); } protected override string GetXmlContent(int templateId) @@ -183,8 +152,8 @@ namespace Umbraco.Tests.Routing Assert.AreEqual(expectedCulture, pcr.Culture.Name); - SettingsForTests.HideTopLevelNodeFromPath = false; - var finder = new ContentFinderByNiceUrl(Logger); + SettingsForTests.HideTopLevelNodeFromPath = false; + var finder = new ContentFinderByNiceUrl(); var result = finder.TryFindContent(pcr); Assert.IsTrue(result); @@ -227,7 +196,7 @@ namespace Umbraco.Tests.Routing // find document SettingsForTests.HideTopLevelNodeFromPath = false; - var finder = new ContentFinderByNiceUrl(Logger); + var finder = new ContentFinderByNiceUrl(); var result = finder.TryFindContent(pcr); // apply wildcard domain diff --git a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs index 670de640ff..3a64389104 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs @@ -1,111 +1,84 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using Moq; using NUnit.Framework; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Web.PublishedCache.XmlPublishedCache; using Umbraco.Web.Routing; using umbraco.cms.businesslogic.web; -using umbraco.cms.businesslogic.language; - +using System.Configuration; namespace Umbraco.Tests.Routing { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] - [TestFixture] - public class NiceUrlsProviderWithDomainsTests : BaseRoutingTest - { - public override void Initialize() - { - base.Initialize(); - - //generate new mock settings and assign so we can configure in individual tests - _umbracoSettings = SettingsForTests.GenerateMockSettings(); - SettingsForTests.ConfigureSettings(_umbracoSettings); - - // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); - } - - private IUmbracoSettingsSection _umbracoSettings; - + [TestFixture] + public class NiceUrlsProviderWithDomainsTests : UrlRoutingTestBase + { protected override void FreezeResolution() { SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); base.FreezeResolution(); } - void InitializeLanguagesAndDomains() - { - var domains = Domain.GetDomains(); - foreach (var d in domains) - d.Delete(); - var langs = Language.GetAllAsList(); - foreach (var l in langs.Skip(1)) - l.Delete(); + void SetDomains1() + { - Language.MakeNew("fr-FR"); - } + SetupDomainServiceMock(new[] + { + new UmbracoDomain("domain1.com") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}} + }); + } - void SetDomains1() - { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); + void SetDomains2() + { + SetupDomainServiceMock(new[] + { + new UmbracoDomain("http://domain1.com/foo") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}} + }); + } - Domain.MakeNew("domain1.com", 1001, langFr.id); - } + void SetDomains3() + { + SetupDomainServiceMock(new[] + { + new UmbracoDomain("http://domain1.com/") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}} + }); + } - void SetDomains2() - { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); + void SetDomains4() + { + SetupDomainServiceMock(new[] + { + new UmbracoDomain("http://domain1.com/") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}}, + new UmbracoDomain("http://domain1.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("http://domain1.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("http://domain3.com/") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1003}}, + new UmbracoDomain("http://domain3.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10031}}, + new UmbracoDomain("http://domain3.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10032}} + }); + } - Domain.MakeNew("http://domain1.com/foo", 1001, langFr.id); - } + void SetDomains5() + { + SetupDomainServiceMock(new[] + { + new UmbracoDomain("http://domain1.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("http://domain1a.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("http://domain1b.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}}, + new UmbracoDomain("http://domain1.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("http://domain1a.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("http://domain1b.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10012}}, + new UmbracoDomain("http://domain3.com/en") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10031}}, + new UmbracoDomain("http://domain3.com/fr") {Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10032}} + }); + } - void SetDomains3() - { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); - - Domain.MakeNew("http://domain1.com/", 10011, langFr.id); - } - - void SetDomains4() - { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); - - Domain.MakeNew("http://domain1.com/", 1001, langEn.id); - Domain.MakeNew("http://domain1.com/en", 10011, langEn.id); - Domain.MakeNew("http://domain1.com/fr", 10012, langFr.id); - - Domain.MakeNew("http://domain3.com/", 1003, langEn.id); - Domain.MakeNew("http://domain3.com/en", 10031, langEn.id); - Domain.MakeNew("http://domain3.com/fr", 10032, langFr.id); - } - - void SetDomains5() - { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); - - Domain.MakeNew("http://domain1.com/en", 10011, langEn.id); - Domain.MakeNew("http://domain1a.com/en", 10011, langEn.id); - Domain.MakeNew("http://domain1b.com/en", 10011, langEn.id); - Domain.MakeNew("http://domain1.com/fr", 10012, langFr.id); - Domain.MakeNew("http://domain1a.com/fr", 10012, langFr.id); - Domain.MakeNew("http://domain1b.com/fr", 10012, langFr.id); - - Domain.MakeNew("http://domain3.com/en", 10031, langEn.id); - Domain.MakeNew("http://domain3.com/fr", 10032, langFr.id); - } - - protected override string GetXmlContent(int templateId) - { - return @" + protected override string GetXmlContent(int templateId) + { + return @" @@ -184,229 +157,233 @@ namespace Umbraco.Tests.Routing "; - } + } - // with one simple domain "domain1.com" - // basic tests - [TestCase(1001, "http://domain1.com", false, "/")] - [TestCase(10011, "http://domain1.com", false, "/1001-1/")] - [TestCase(1002, "http://domain1.com", false, "/1002/")] - // absolute tests - [TestCase(1001, "http://domain1.com", true, "http://domain1.com/")] - [TestCase(10011, "http://domain1.com", true, "http://domain1.com/1001-1/")] - // different current tests - [TestCase(1001, "http://domain2.com", false, "http://domain1.com/")] - [TestCase(10011, "http://domain2.com", false, "http://domain1.com/1001-1/")] - [TestCase(1001, "https://domain1.com", false, "/")] - [TestCase(10011, "https://domain1.com", false, "/1001-1/")] - public void Get_Nice_Url_SimpleDomain(int nodeId, string currentUrl, bool absolute, string expected) - { - var routingContext = GetRoutingContext("/test", 1111); + // with one simple domain "domain1.com" + // basic tests + [TestCase(1001, "http://domain1.com", false, "/")] + [TestCase(10011, "http://domain1.com", false, "/1001-1/")] + [TestCase(1002, "http://domain1.com", false, "/1002/")] + // absolute tests + [TestCase(1001, "http://domain1.com", true, "http://domain1.com/")] + [TestCase(10011, "http://domain1.com", true, "http://domain1.com/1001-1/")] + // different current tests + [TestCase(1001, "http://domain2.com", false, "http://domain1.com/")] + [TestCase(10011, "http://domain2.com", false, "http://domain1.com/1001-1/")] + [TestCase(1001, "https://domain1.com", false, "/")] + [TestCase(10011, "https://domain1.com", false, "/1001-1/")] + public void Get_Nice_Url_SimpleDomain(int nodeId, string currentUrl, bool absolute, string expected) + { + var settings = SettingsForTests.GenerateMockSettings(); + var request = Mock.Get(settings.RequestHandler); + request.Setup(x => x.UseDomainPrefixes).Returns(false); - SettingsForTests.UseDirectoryUrls = true; - SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - - InitializeLanguagesAndDomains(); - SetDomains1(); - - var currentUri = new Uri(currentUrl); - var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); - Assert.AreEqual(expected, result); - } - - // with one complete domain "http://domain1.com/foo" - // basic tests - [TestCase(1001, "http://domain1.com", false, "/foo/")] - [TestCase(10011, "http://domain1.com", false, "/foo/1001-1/")] - [TestCase(1002, "http://domain1.com", false, "/1002/")] - // absolute tests - [TestCase(1001, "http://domain1.com", true, "http://domain1.com/foo/")] - [TestCase(10011, "http://domain1.com", true, "http://domain1.com/foo/1001-1/")] - // different current tests - [TestCase(1001, "http://domain2.com", false, "http://domain1.com/foo/")] - [TestCase(10011, "http://domain2.com", false, "http://domain1.com/foo/1001-1/")] - [TestCase(1001, "https://domain1.com", false, "http://domain1.com/foo/")] - [TestCase(10011, "https://domain1.com", false, "http://domain1.com/foo/1001-1/")] - public void Get_Nice_Url_SimpleWithSchemeAndPath(int nodeId, string currentUrl, bool absolute, string expected) - { - var routingContext = GetRoutingContext("/test", 1111); + var routingContext = GetRoutingContext("/test", 1111, umbracoSettings: settings); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - InitializeLanguagesAndDomains(); - SetDomains2(); + SetDomains1(); - var currentUri = new Uri(currentUrl); - var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); - Assert.AreEqual(expected, result); - } + var currentUri = new Uri(currentUrl); + var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); + Assert.AreEqual(expected, result); + } - // with one domain, not at root - [TestCase(1001, "http://domain1.com", false, "/1001/")] - [TestCase(10011, "http://domain1.com", false, "/")] - [TestCase(100111, "http://domain1.com", false, "/1001-1-1/")] - [TestCase(1002, "http://domain1.com", false, "/1002/")] - public void Get_Nice_Url_DeepDomain(int nodeId, string currentUrl, bool absolute, string expected) - { - var routingContext = GetRoutingContext("/test", 1111); + // with one complete domain "http://domain1.com/foo" + // basic tests + [TestCase(1001, "http://domain1.com", false, "/foo/")] + [TestCase(10011, "http://domain1.com", false, "/foo/1001-1/")] + [TestCase(1002, "http://domain1.com", false, "/1002/")] + // absolute tests + [TestCase(1001, "http://domain1.com", true, "http://domain1.com/foo/")] + [TestCase(10011, "http://domain1.com", true, "http://domain1.com/foo/1001-1/")] + // different current tests + [TestCase(1001, "http://domain2.com", false, "http://domain1.com/foo/")] + [TestCase(10011, "http://domain2.com", false, "http://domain1.com/foo/1001-1/")] + [TestCase(1001, "https://domain1.com", false, "http://domain1.com/foo/")] + [TestCase(10011, "https://domain1.com", false, "http://domain1.com/foo/1001-1/")] + public void Get_Nice_Url_SimpleWithSchemeAndPath(int nodeId, string currentUrl, bool absolute, string expected) + { + var settings = SettingsForTests.GenerateMockSettings(); + var request = Mock.Get(settings.RequestHandler); + request.Setup(x => x.UseDomainPrefixes).Returns(false); + + var routingContext = GetRoutingContext("/test", 1111, umbracoSettings: settings); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - InitializeLanguagesAndDomains(); - SetDomains3(); + SetDomains2(); - var currentUri = new Uri(currentUrl); - var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); - Assert.AreEqual(expected, result); - } + var currentUri = new Uri(currentUrl); + var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); + Assert.AreEqual(expected, result); + } - // with nested domains - [TestCase(1001, "http://domain1.com", false, "/")] - [TestCase(10011, "http://domain1.com", false, "/en/")] - [TestCase(100111, "http://domain1.com", false, "/en/1001-1-1/")] - [TestCase(10012, "http://domain1.com", false, "/fr/")] - [TestCase(100121, "http://domain1.com", false, "/fr/1001-2-1/")] - [TestCase(10013, "http://domain1.com", false, "/1001-3/")] - [TestCase(1002, "http://domain1.com", false, "/1002/")] - [TestCase(1003, "http://domain3.com", false, "/")] - [TestCase(10031, "http://domain3.com", false, "/en/")] - [TestCase(100321, "http://domain3.com", false, "/fr/1003-2-1/")] - public void Get_Nice_Url_NestedDomains(int nodeId, string currentUrl, bool absolute, string expected) - { - var routingContext = GetRoutingContext("/test", 1111); + // with one domain, not at root + [TestCase(1001, "http://domain1.com", false, "/1001/")] + [TestCase(10011, "http://domain1.com", false, "/")] + [TestCase(100111, "http://domain1.com", false, "/1001-1-1/")] + [TestCase(1002, "http://domain1.com", false, "/1002/")] + public void Get_Nice_Url_DeepDomain(int nodeId, string currentUrl, bool absolute, string expected) + { + var settings = SettingsForTests.GenerateMockSettings(); + var request = Mock.Get(settings.RequestHandler); + request.Setup(x => x.UseDomainPrefixes).Returns(false); + + var routingContext = GetRoutingContext("/test", 1111, umbracoSettings: settings); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - - InitializeLanguagesAndDomains(); - SetDomains4(); - var currentUri = new Uri(currentUrl); - var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); - Assert.AreEqual(expected, result); - } + SetDomains3(); - [Test] - public void Get_Nice_Url_DomainsAndCache() - { - var routingContext = GetRoutingContext("/test", 1111); + var currentUri = new Uri(currentUrl); + var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); + Assert.AreEqual(expected, result); + } + + // with nested domains + [TestCase(1001, "http://domain1.com", false, "/")] + [TestCase(10011, "http://domain1.com", false, "/en/")] + [TestCase(100111, "http://domain1.com", false, "/en/1001-1-1/")] + [TestCase(10012, "http://domain1.com", false, "/fr/")] + [TestCase(100121, "http://domain1.com", false, "/fr/1001-2-1/")] + [TestCase(10013, "http://domain1.com", false, "/1001-3/")] + [TestCase(1002, "http://domain1.com", false, "/1002/")] + [TestCase(1003, "http://domain3.com", false, "/")] + [TestCase(10031, "http://domain3.com", false, "/en/")] + [TestCase(100321, "http://domain3.com", false, "/fr/1003-2-1/")] + public void Get_Nice_Url_NestedDomains(int nodeId, string currentUrl, bool absolute, string expected) + { + var settings = SettingsForTests.GenerateMockSettings(); + var request = Mock.Get(settings.RequestHandler); + request.Setup(x => x.UseDomainPrefixes).Returns(false); + + var routingContext = GetRoutingContext("/test", 1111, umbracoSettings: settings); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - InitializeLanguagesAndDomains(); - SetDomains4(); + SetDomains4(); - string ignore; - ignore = routingContext.UrlProvider.GetUrl(1001, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(10011, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(100111, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(10012, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(100121, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(10013, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(1002, new Uri("http://domain1.com"), false); - ignore = routingContext.UrlProvider.GetUrl(1001, new Uri("http://domain2.com"), false); - ignore = routingContext.UrlProvider.GetUrl(10011, new Uri("http://domain2.com"), false); - ignore = routingContext.UrlProvider.GetUrl(100111, new Uri("http://domain2.com"), false); - ignore = routingContext.UrlProvider.GetUrl(1002, new Uri("http://domain2.com"), false); + var currentUri = new Uri(currentUrl); + var result = routingContext.UrlProvider.GetUrl(nodeId, currentUri, absolute); + Assert.AreEqual(expected, result); + } + + [Test] + public void Get_Nice_Url_DomainsAndCache() + { + var settings = SettingsForTests.GenerateMockSettings(); + var request = Mock.Get(settings.RequestHandler); + request.Setup(x => x.UseDomainPrefixes).Returns(false); + + var routingContext = GetRoutingContext("/test", 1111, umbracoSettings: settings); + + SettingsForTests.UseDirectoryUrls = true; + SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains + + SetDomains4(); + + string ignore; + ignore = routingContext.UrlProvider.GetUrl(1001, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(10011, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(100111, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(10012, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(100121, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(10013, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(1002, new Uri("http://domain1.com"), false); + ignore = routingContext.UrlProvider.GetUrl(1001, new Uri("http://domain2.com"), false); + ignore = routingContext.UrlProvider.GetUrl(10011, new Uri("http://domain2.com"), false); + ignore = routingContext.UrlProvider.GetUrl(100111, new Uri("http://domain2.com"), false); + ignore = routingContext.UrlProvider.GetUrl(1002, new Uri("http://domain2.com"), false); var cache = routingContext.UmbracoContext.ContentCache.InnerCache as PublishedContentCache; if (cache == null) throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported."); var cachedRoutes = cache.RoutesCache.GetCachedRoutes(); Assert.AreEqual(7, cachedRoutes.Count); - var cachedIds = cache.RoutesCache.GetCachedIds(); - Assert.AreEqual(7, cachedIds.Count); + var cachedIds = cache.RoutesCache.GetCachedIds(); + Assert.AreEqual(7, cachedIds.Count); - CheckRoute(cachedRoutes, cachedIds, 1001, "1001/"); - CheckRoute(cachedRoutes, cachedIds, 10011, "10011/"); - CheckRoute(cachedRoutes, cachedIds, 100111, "10011/1001-1-1"); - CheckRoute(cachedRoutes, cachedIds, 10012, "10012/"); - CheckRoute(cachedRoutes, cachedIds, 100121, "10012/1001-2-1"); - CheckRoute(cachedRoutes, cachedIds, 10013, "1001/1001-3"); - CheckRoute(cachedRoutes, cachedIds, 1002, "/1002"); + CheckRoute(cachedRoutes, cachedIds, 1001, "1001/"); + CheckRoute(cachedRoutes, cachedIds, 10011, "10011/"); + CheckRoute(cachedRoutes, cachedIds, 100111, "10011/1001-1-1"); + CheckRoute(cachedRoutes, cachedIds, 10012, "10012/"); + CheckRoute(cachedRoutes, cachedIds, 100121, "10012/1001-2-1"); + CheckRoute(cachedRoutes, cachedIds, 10013, "1001/1001-3"); + CheckRoute(cachedRoutes, cachedIds, 1002, "/1002"); - // use the cache - Assert.AreEqual("/", routingContext.UrlProvider.GetUrl(1001, new Uri("http://domain1.com"), false)); - Assert.AreEqual("/en/", routingContext.UrlProvider.GetUrl(10011, new Uri("http://domain1.com"), false)); - Assert.AreEqual("/en/1001-1-1/", routingContext.UrlProvider.GetUrl(100111, new Uri("http://domain1.com"), false)); - Assert.AreEqual("/fr/", routingContext.UrlProvider.GetUrl(10012, new Uri("http://domain1.com"), false)); - Assert.AreEqual("/fr/1001-2-1/", routingContext.UrlProvider.GetUrl(100121, new Uri("http://domain1.com"), false)); - Assert.AreEqual("/1001-3/", routingContext.UrlProvider.GetUrl(10013, new Uri("http://domain1.com"), false)); - Assert.AreEqual("/1002/", routingContext.UrlProvider.GetUrl(1002, new Uri("http://domain1.com"), false)); + // use the cache + Assert.AreEqual("/", routingContext.UrlProvider.GetUrl(1001, new Uri("http://domain1.com"), false)); + Assert.AreEqual("/en/", routingContext.UrlProvider.GetUrl(10011, new Uri("http://domain1.com"), false)); + Assert.AreEqual("/en/1001-1-1/", routingContext.UrlProvider.GetUrl(100111, new Uri("http://domain1.com"), false)); + Assert.AreEqual("/fr/", routingContext.UrlProvider.GetUrl(10012, new Uri("http://domain1.com"), false)); + Assert.AreEqual("/fr/1001-2-1/", routingContext.UrlProvider.GetUrl(100121, new Uri("http://domain1.com"), false)); + Assert.AreEqual("/1001-3/", routingContext.UrlProvider.GetUrl(10013, new Uri("http://domain1.com"), false)); + Assert.AreEqual("/1002/", routingContext.UrlProvider.GetUrl(1002, new Uri("http://domain1.com"), false)); - Assert.AreEqual("http://domain1.com/fr/1001-2-1/", routingContext.UrlProvider.GetUrl(100121, new Uri("http://domain2.com"), false)); - } + Assert.AreEqual("http://domain1.com/fr/1001-2-1/", routingContext.UrlProvider.GetUrl(100121, new Uri("http://domain2.com"), false)); + } - void CheckRoute(IDictionary routes, IDictionary ids, int id, string route) - { - Assert.IsTrue(routes.ContainsKey(id)); - Assert.AreEqual(route, routes[id]); - Assert.IsTrue(ids.ContainsKey(route)); - Assert.AreEqual(id, ids[route]); - } + void CheckRoute(IDictionary routes, IDictionary ids, int id, string route) + { + Assert.IsTrue(routes.ContainsKey(id)); + Assert.AreEqual(route, routes[id]); + Assert.IsTrue(ids.ContainsKey(route)); + Assert.AreEqual(id, ids[route]); + } - [Test] - public void Get_Nice_Url_Relative_Or_Absolute() - { - var routingContext = GetRoutingContext("http://domain1.com/test", 1111); + [Test] + public void Get_Nice_Url_Relative_Or_Absolute() + { + var settings = SettingsForTests.GenerateMockSettings(); + var requestMock = Mock.Get(settings.RequestHandler); + requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); + + var routingContext = GetRoutingContext("http://domain1.com/test", 1111, umbracoSettings: settings); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; - InitializeLanguagesAndDomains(); - SetDomains4(); + SetDomains4(); - //mock the Umbraco settings that we need - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - Assert.AreEqual("/en/1001-1-1/", routingContext.UrlProvider.GetUrl(100111)); - Assert.AreEqual("http://domain3.com/en/1003-1-1/", routingContext.UrlProvider.GetUrl(100311)); + Assert.AreEqual("http://domain3.com/en/1003-1-1/", routingContext.UrlProvider.GetUrl(100311)); requestMock.Setup(x => x.UseDomainPrefixes).Returns(true); Assert.AreEqual("http://domain1.com/en/1001-1-1/", routingContext.UrlProvider.GetUrl(100111)); - Assert.AreEqual("http://domain3.com/en/1003-1-1/", routingContext.UrlProvider.GetUrl(100311)); + Assert.AreEqual("http://domain3.com/en/1003-1-1/", routingContext.UrlProvider.GetUrl(100311)); requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); routingContext.UrlProvider.Mode = UrlProviderMode.Absolute; - Assert.AreEqual("http://domain1.com/en/1001-1-1/", routingContext.UrlProvider.GetUrl(100111)); - Assert.AreEqual("http://domain3.com/en/1003-1-1/", routingContext.UrlProvider.GetUrl(100311)); - } + Assert.AreEqual("http://domain1.com/en/1001-1-1/", routingContext.UrlProvider.GetUrl(100111)); + Assert.AreEqual("http://domain3.com/en/1003-1-1/", routingContext.UrlProvider.GetUrl(100311)); + } - [Test] - public void Get_Nice_Url_Alternate() - { - var routingContext = GetRoutingContext("http://domain1.com/en/test", 1111); + [Test] + public void Get_Nice_Url_Alternate() + { + var settings = SettingsForTests.GenerateMockSettings(); + var routingContext = GetRoutingContext("http://domain1.com/en/test", 1111, umbracoSettings: settings); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; - InitializeLanguagesAndDomains(); - SetDomains5(); + SetDomains5(); - var url = routingContext.UrlProvider.GetUrl(100111, true); + var url = routingContext.UrlProvider.GetUrl(100111, true); Assert.AreEqual("http://domain1.com/en/1001-1-1/", url); - var result = routingContext.UrlProvider.GetOtherUrls(100111).ToArray(); - - Assert.AreEqual(2, result.Count()); - Assert.IsTrue(result.Contains("http://domain1a.com/en/1001-1-1/")); - Assert.IsTrue(result.Contains("http://domain1b.com/en/1001-1-1/")); - } - } + var result = routingContext.UrlProvider.GetOtherUrls(100111).ToArray(); + + Assert.AreEqual(2, result.Count()); + Assert.IsTrue(result.Contains("http://domain1a.com/en/1001-1-1/")); + Assert.IsTrue(result.Contains("http://domain1b.com/en/1001-1-1/")); + } + } } diff --git a/src/Umbraco.Tests/Routing/SiteDomainHelperTests.cs b/src/Umbraco.Tests/Routing/SiteDomainHelperTests.cs index 9a046925ef..4abbf43e63 100644 --- a/src/Umbraco.Tests/Routing/SiteDomainHelperTests.cs +++ b/src/Umbraco.Tests/Routing/SiteDomainHelperTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; +using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; using umbraco.cms.businesslogic.web; @@ -181,8 +182,8 @@ namespace Umbraco.Tests.Routing var current = new Uri("http://domain1.com/foo/bar"); var output = helper.MapDomain(current, new[] { - new DomainAndUri(new MockDomain("domain1.com"), Uri.UriSchemeHttp), - new DomainAndUri(new MockDomain("domain2.com"), Uri.UriSchemeHttp), + new DomainAndUri(new UmbracoDomain("domain1.com"), Uri.UriSchemeHttp), + new DomainAndUri(new UmbracoDomain("domain2.com"), Uri.UriSchemeHttp), }).Uri.ToString(); Assert.AreEqual("http://domain1.com/", output); @@ -192,8 +193,8 @@ namespace Umbraco.Tests.Routing current = new Uri("http://domain1.com/foo/bar"); output = helper.MapDomain(current, new[] { - new DomainAndUri(new MockDomain("domain1.net"), Uri.UriSchemeHttp), - new DomainAndUri(new MockDomain("domain2.net"), Uri.UriSchemeHttp) + new DomainAndUri(new UmbracoDomain("domain1.net"), Uri.UriSchemeHttp), + new DomainAndUri(new UmbracoDomain("domain2.net"), Uri.UriSchemeHttp) }).Uri.ToString(); Assert.AreEqual("http://domain1.net/", output); @@ -204,8 +205,8 @@ namespace Umbraco.Tests.Routing current = new Uri("http://domain1.com/foo/bar"); output = helper.MapDomain(current, new[] { - new DomainAndUri(new MockDomain("domain2.net"), Uri.UriSchemeHttp), - new DomainAndUri(new MockDomain("domain1.net"), Uri.UriSchemeHttp) + new DomainAndUri(new UmbracoDomain("domain2.net"), Uri.UriSchemeHttp), + new DomainAndUri(new UmbracoDomain("domain1.net"), Uri.UriSchemeHttp) }).Uri.ToString(); Assert.AreEqual("http://domain1.net/", output); } @@ -231,11 +232,11 @@ namespace Umbraco.Tests.Routing var current = new Uri("http://domain1.com/foo/bar"); var output = helper.MapDomains(current, new[] { - new DomainAndUri(new MockDomain("domain1.com"), Uri.UriSchemeHttp), // no: current + what MapDomain would pick - new DomainAndUri(new MockDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain3.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) + new DomainAndUri(new UmbracoDomain("domain1.com"), Uri.UriSchemeHttp), // no: current + what MapDomain would pick + new DomainAndUri(new UmbracoDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain3.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) }, true).ToArray(); Assert.AreEqual(1, output.Count()); @@ -246,11 +247,11 @@ namespace Umbraco.Tests.Routing current = new Uri("http://domain1.com/foo/bar"); output = helper.MapDomains(current, new[] { - new DomainAndUri(new MockDomain("domain1.net"), Uri.UriSchemeHttp), // no: what MapDomain would pick - new DomainAndUri(new MockDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain3.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) + new DomainAndUri(new UmbracoDomain("domain1.net"), Uri.UriSchemeHttp), // no: what MapDomain would pick + new DomainAndUri(new UmbracoDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain3.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) }, true).ToArray(); Assert.AreEqual(1, output.Count()); @@ -264,12 +265,12 @@ namespace Umbraco.Tests.Routing current = new Uri("http://domain1.com/foo/bar"); output = helper.MapDomains(current, new[] { - new DomainAndUri(new MockDomain("domain1.com"), Uri.UriSchemeHttp), // no: current + what MapDomain would pick - new DomainAndUri(new MockDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain3.com"), Uri.UriSchemeHttp), // yes: bound site - new DomainAndUri(new MockDomain("domain3.org"), Uri.UriSchemeHttp), // yes: bound site - new DomainAndUri(new MockDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) + new DomainAndUri(new UmbracoDomain("domain1.com"), Uri.UriSchemeHttp), // no: current + what MapDomain would pick + new DomainAndUri(new UmbracoDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain3.com"), Uri.UriSchemeHttp), // yes: bound site + new DomainAndUri(new UmbracoDomain("domain3.org"), Uri.UriSchemeHttp), // yes: bound site + new DomainAndUri(new UmbracoDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) }, true).ToArray(); Assert.AreEqual(3, output.Count()); @@ -282,12 +283,12 @@ namespace Umbraco.Tests.Routing current = new Uri("http://domain1.com/foo/bar"); output = helper.MapDomains(current, new[] { - new DomainAndUri(new MockDomain("domain1.net"), Uri.UriSchemeHttp), // no: what MapDomain would pick - new DomainAndUri(new MockDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain3.com"), Uri.UriSchemeHttp), // yes: bound site - new DomainAndUri(new MockDomain("domain3.org"), Uri.UriSchemeHttp), // yes: bound site - new DomainAndUri(new MockDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site - new DomainAndUri(new MockDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) + new DomainAndUri(new UmbracoDomain("domain1.net"), Uri.UriSchemeHttp), // no: what MapDomain would pick + new DomainAndUri(new UmbracoDomain("domain2.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain3.com"), Uri.UriSchemeHttp), // yes: bound site + new DomainAndUri(new UmbracoDomain("domain3.org"), Uri.UriSchemeHttp), // yes: bound site + new DomainAndUri(new UmbracoDomain("domain4.com"), Uri.UriSchemeHttp), // no: not same site + new DomainAndUri(new UmbracoDomain("domain1.org"), Uri.UriSchemeHttp), // yes: same site (though bogus setup) }, true).ToArray(); Assert.AreEqual(3, output.Count()); @@ -296,14 +297,14 @@ namespace Umbraco.Tests.Routing Assert.Contains("http://domain3.org/", output.Select(d => d.Uri.ToString()).ToArray()); } - class MockDomain : Domain - { - private static readonly FieldInfo NameField = typeof (Domain).GetField("_name", BindingFlags.Instance | BindingFlags.NonPublic); + //class MockDomain : Domain + //{ + // private static readonly FieldInfo NameField = typeof (Domain).GetField("_name", BindingFlags.Instance | BindingFlags.NonPublic); - public MockDomain(string name) - { - NameField.SetValue(this, name); - } - } + // public MockDomain(string name) + // { + // NameField.SetValue(this, name); + // } + //} } } diff --git a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs new file mode 100644 index 0000000000..089f78ac3e --- /dev/null +++ b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Linq; +using Moq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Services; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Routing +{ + [DatabaseTestBehavior(DatabaseBehavior.NoDatabasePerFixture)] + [TestFixture] + public abstract class UrlRoutingTestBase : BaseRoutingTest + { + /// + /// Sets up the mock domain service + /// + /// + protected void SetupDomainServiceMock(IEnumerable allDomains) + { + var domainService = Mock.Get(ServiceContext.DomainService); + //setup mock domain service + domainService.Setup(service => service.GetAll(It.IsAny())) + .Returns((bool incWildcards) => incWildcards ? allDomains : allDomains.Where(d => d.IsWildcard == false)); + domainService.Setup(service => service.GetAssignedDomains(It.IsAny(), It.IsAny())) + .Returns((int id, bool incWildcards) => allDomains.Where(d => d.RootContent.Id == id && (incWildcards || d.IsWildcard == false))); + } + + protected ServiceContext GetServiceContext(IUmbracoSettingsSection umbracoSettings, ILogger logger) + { + //get the mocked service context to get the mocked domain service + var svcCtx = MockHelper.GetMockedServiceContext(umbracoSettings, logger); + var domainService = Mock.Get(svcCtx.DomainService); + //setup mock domain service + domainService.Setup(service => service.GetAll(It.IsAny())) + .Returns((bool incWildcards) => new[] + { + new UmbracoDomain("domain1.com/"){Id = 1, Language = new Language("de-DE"), RootContent = new Content("test1", -1, new ContentType(-1)){ Id = 1001}}, + new UmbracoDomain("domain1.com/en"){Id = 1, Language = new Language("en-US"), RootContent = new Content("test2", -1, new ContentType(-1)){ Id = 10011}}, + new UmbracoDomain("domain1.com/fr"){Id = 1, Language = new Language("fr-FR"), RootContent = new Content("test3", -1, new ContentType(-1)){ Id = 10012}} + }); + return svcCtx; + } + + protected override void SetupApplicationContext() + { + var settings = SettingsForTests.GetDefault(); + ApplicationContext.Current = new ApplicationContext( + new DatabaseContext(Mock.Of(), Logger, Mock.Of(), "test"), + GetServiceContext(settings, Logger), + CacheHelper, + ProfilingLogger) + { + IsReady = true + }; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index 6f4d0e136b..1378cd3547 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -1,20 +1,21 @@ using System; +using System.Collections.Generic; using System.Linq; +using System.Text; using Moq; using NUnit.Framework; using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Logging; +using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Web.PublishedCache.XmlPublishedCache; -using umbraco.cms.businesslogic.web; -using umbraco.cms.businesslogic.language; using Umbraco.Web.Routing; +using umbraco.cms.businesslogic.web; +using System.Configuration; namespace Umbraco.Tests.Routing { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - public class UrlsWithNestedDomains : BaseRoutingTest + public class UrlsWithNestedDomains : UrlRoutingTestBase { // in the case of nested domains more than 1 url may resolve to a document // but only one route can be cached - the 'canonical' route ie the route @@ -26,17 +27,18 @@ namespace Umbraco.Tests.Routing { SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains - var requestMock = Mock.Get(_umbracoSettings.RequestHandler); - requestMock.Setup(x => x.UseDomainPrefixes).Returns(true); - InitializeLanguagesAndDomains(); + var settings = SettingsForTests.GenerateMockSettings(); + var request = Mock.Get(settings.RequestHandler); + request.Setup(x => x.UseDomainPrefixes).Returns(true); + SetDomains1(); RoutingContext routingContext; string url = "http://domain1.com/1001-1/1001-1-1"; // get the nice url for 100111 - routingContext = GetRoutingContext(url); + routingContext = GetRoutingContext(url, 9999, umbracoSettings: settings); Assert.AreEqual("http://domain2.com/1001-1-1/", routingContext.UrlProvider.GetUrl(100111, true)); // check that the proper route has been cached @@ -53,7 +55,7 @@ namespace Umbraco.Tests.Routing Assert.IsTrue(pcr.HasDomain); // check that it's been routed - var lookup = new ContentFinderByNiceUrl(Logger); + var lookup = new ContentFinderByNiceUrl(); var result = lookup.TryFindContent(pcr); Assert.IsTrue(result); Assert.AreEqual(100111, pcr.PublishedContent.Id); @@ -68,46 +70,20 @@ namespace Umbraco.Tests.Routing //Assert.AreEqual("http://domain1.com/1001-1/1001-1-1", routingContext.NiceUrlProvider.GetNiceUrl(100111, true)); // bad } - private IUmbracoSettingsSection _umbracoSettings; - - public override void Initialize() - { - base.Initialize(); - - // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); - - //generate new mock settings and assign so we can configure in individual tests - _umbracoSettings = SettingsForTests.GenerateMockSettings(); - SettingsForTests.ConfigureSettings(_umbracoSettings); - } - protected override void FreezeResolution() { SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); base.FreezeResolution(); } - void InitializeLanguagesAndDomains() - { - var domains = Domain.GetDomains(); - foreach (var d in domains) - d.Delete(); - - var langs = Language.GetAllAsList(); - foreach (var l in langs.Skip(1)) - l.Delete(); - - Language.MakeNew("fr-FR"); - } - void SetDomains1() { - var langEn = Language.GetByCultureCode("en-US"); - var langFr = Language.GetByCultureCode("fr-FR"); + SetupDomainServiceMock(new[] + { + new UmbracoDomain("http://domain1.com/") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 1001}}, + new UmbracoDomain("http://domain2.com/") {Id = 1, Language = new Language("en-US"), RootContent = new Content("test1", -1, new ContentType(-1)) {Id = 10011}} + }); - Domain.MakeNew("http://domain1.com/", 1001, langEn.id); - Domain.MakeNew("http://domain2.com/", 10011, langEn.id); } protected override string GetXmlContent(int templateId) diff --git a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs index d7509cf68e..4a26d917e1 100644 --- a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs +++ b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs @@ -148,10 +148,10 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of())) - using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) - using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, tRepository)) - using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, ctRepository, tRepository, tagRepo)) + using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of())) + using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) + using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, tRepository)) + using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, ctRepository, tRepository, tagRepo)) { // Act Stopwatch watch = Stopwatch.StartNew(); @@ -179,10 +179,10 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of())) - using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) - using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, tRepository)) - using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, ctRepository, tRepository, tagRepo)) + using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of())) + using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) + using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, tRepository)) + using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, ctRepository, tRepository, tagRepo)) { // Act Stopwatch watch = Stopwatch.StartNew(); @@ -209,10 +209,10 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of())) - using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) - using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, tRepository)) - using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, ctRepository, tRepository, tagRepo)) + using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of())) + using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) + using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, tRepository)) + using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, ctRepository, tRepository, tagRepo)) { // Act @@ -242,10 +242,10 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); - using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of())) - using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider)) - using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, tRepository)) - using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntaxProvider, ctRepository, tRepository, tagRepo)) + using (var tRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of())) + using (var tagRepo = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax)) + using (var ctRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, tRepository)) + using (var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, SqlSyntax, ctRepository, tRepository, tagRepo)) { // Act diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 5c469cdcd8..e517d835cd 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -1442,10 +1442,10 @@ namespace Umbraco.Tests.Services private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { - var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, Mock.Of(), Mock.Of(), Mock.Of()); - var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider); - contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, templateRepository); - var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider, contentTypeRepository, templateRepository, tagRepository); + var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, Mock.Of(), Mock.Of(), Mock.Of()); + var tagRepository = new TagRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax); + contentTypeRepository = new ContentTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, templateRepository); + var repository = new ContentRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax, contentTypeRepository, templateRepository, tagRepository); return repository; } } diff --git a/src/Umbraco.Tests/Services/LocalizedTextServiceTests.cs b/src/Umbraco.Tests/Services/LocalizedTextServiceTests.cs index 3a492c84c7..17e58fb408 100644 --- a/src/Umbraco.Tests/Services/LocalizedTextServiceTests.cs +++ b/src/Umbraco.Tests/Services/LocalizedTextServiceTests.cs @@ -41,7 +41,7 @@ namespace Umbraco.Tests.Services }, } } - }); + }, Mock.Of()); var result = txtService.GetAllStoredValues(culture); @@ -130,7 +130,7 @@ namespace Umbraco.Tests.Services } } } - }); + }, Mock.Of()); var result = txtService.Localize("testArea/testKey", culture); @@ -155,7 +155,7 @@ namespace Umbraco.Tests.Services } } } - }); + }, Mock.Of()); var result = txtService.Localize("testKey", culture); @@ -180,7 +180,7 @@ namespace Umbraco.Tests.Services } } } - }); + }, Mock.Of()); var result = txtService.Localize("testArea/doNotFind", culture); @@ -206,7 +206,7 @@ namespace Umbraco.Tests.Services } } } - }); + }, Mock.Of()); var result = txtService.Localize("doNotFind", culture); @@ -231,7 +231,7 @@ namespace Umbraco.Tests.Services } } } - }); + }, Mock.Of()); var result = txtService.Localize("testKey", culture, new Dictionary { { "0", "world" }, { "1", "great" }, { "2", "planet" } }); @@ -342,7 +342,7 @@ namespace Umbraco.Tests.Services } [Test] - public void Using_Dictionary_Throws_When_No_Culture_Found() + public void Using_Dictionary_Returns_Default_Text__When_No_Culture_Found() { var culture = CultureInfo.GetCultureInfo("en-US"); var txtService = new LocalizedTextService( @@ -359,9 +359,9 @@ namespace Umbraco.Tests.Services } } } - }); + }, Mock.Of()); - Assert.Throws(() => txtService.Localize("testArea/testKey", CultureInfo.GetCultureInfo("en-AU"))); + Assert.AreEqual("[testKey]", txtService.Localize("testArea/testKey", CultureInfo.GetCultureInfo("en-AU"))); } [Test] diff --git a/src/Umbraco.Tests/Services/MacroServiceTests.cs b/src/Umbraco.Tests/Services/MacroServiceTests.cs index 4d4a0ee4f0..5e52140bb5 100644 --- a/src/Umbraco.Tests/Services/MacroServiceTests.cs +++ b/src/Umbraco.Tests/Services/MacroServiceTests.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(Logger); using (var unitOfWork = provider.GetUnitOfWork()) - using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntaxProvider)) + using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), SqlSyntax)) { repository.AddOrUpdate(new Macro("test1", "Test1", "~/usercontrol/test1.ascx", "MyAssembly1", "test1.xslt", "~/views/macropartials/test1.cshtml")); repository.AddOrUpdate(new Macro("test2", "Test2", "~/usercontrol/test2.ascx", "MyAssembly2", "test2.xslt", "~/views/macropartials/test2.cshtml")); diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index 5c3babb011..f67289e644 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -44,7 +44,7 @@ namespace Umbraco.Tests.Services //here we are going to override the ServiceContext because normally with our test cases we use a //global Database object but this is NOT how it should work in the web world or in any multi threaded scenario. //we need a new Database object for each thread. - var repositoryFactory = new RepositoryFactory(cacheHelper, Logger, SqlSyntaxProvider, SettingsForTests.GenerateMockSettings()); + var repositoryFactory = new RepositoryFactory(cacheHelper, Logger, SqlSyntax, SettingsForTests.GenerateMockSettings()); _uowProvider = new PerThreadPetaPocoUnitOfWorkProvider(_dbFactory); ApplicationContext.Services = new ServiceContext( repositoryFactory, diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 1d2efcbdb9..e0e1e5fa14 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -73,11 +73,11 @@ namespace Umbraco.Tests.TestHelpers GetDbProviderName(), Logger); - var repositoryFactory = new RepositoryFactory(cacheHelper, Logger, SqlSyntaxProvider, SettingsForTests.GenerateMockSettings()); + var repositoryFactory = new RepositoryFactory(cacheHelper, Logger, SqlSyntax, SettingsForTests.GenerateMockSettings()); _appContext = new ApplicationContext( //assign the db context - new DatabaseContext(dbFactory, Logger, SqlSyntaxProvider, "System.Data.SqlServerCe.4.0"), + new DatabaseContext(dbFactory, Logger, SqlSyntax, "System.Data.SqlServerCe.4.0"), //assign the service context new ServiceContext(repositoryFactory, new PetaPocoUnitOfWorkProvider(dbFactory), new FileUnitOfWorkProvider(), new PublishingStrategy(), cacheHelper, Logger), cacheHelper, @@ -101,7 +101,7 @@ namespace Umbraco.Tests.TestHelpers } } - protected virtual ISqlSyntaxProvider SqlSyntaxProvider + protected virtual ISqlSyntaxProvider SqlSyntax { get { return new SqlCeSyntaxProvider(); } } @@ -236,7 +236,7 @@ namespace Umbraco.Tests.TestHelpers || (_isFirstTestInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture))) { - var schemaHelper = new DatabaseSchemaHelper(DatabaseContext.Database, Logger, SqlSyntaxProvider); + var schemaHelper = new DatabaseSchemaHelper(DatabaseContext.Database, Logger, SqlSyntax); //Create the umbraco database and its base data schemaHelper.CreateDatabaseSchema(false, ApplicationContext); diff --git a/src/Umbraco.Tests/TestHelpers/BaseRoutingTest.cs b/src/Umbraco.Tests/TestHelpers/BaseRoutingTest.cs index d55a437976..81e85ae2a0 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseRoutingTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseRoutingTest.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Web.Routing; using NUnit.Framework; using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Web; @@ -13,7 +14,7 @@ namespace Umbraco.Tests.TestHelpers { [TestFixture, RequiresSTA] public abstract class BaseRoutingTest : BaseWebTest - { + { /// /// Return a new RoutingContext /// @@ -24,11 +25,17 @@ namespace Umbraco.Tests.TestHelpers /// /// /// set to true to also set the singleton UmbracoContext.Current to the context created with this method + /// /// - protected RoutingContext GetRoutingContext(string url, int templateId, RouteData routeData = null, bool setUmbracoContextCurrent = false) - { + protected RoutingContext GetRoutingContext(string url, int templateId, RouteData routeData = null, bool setUmbracoContextCurrent = false, IUmbracoSettingsSection umbracoSettings = null) + { + if (umbracoSettings == null) umbracoSettings = SettingsForTests.GetDefault(); + var umbracoContext = GetUmbracoContext(url, templateId, routeData); - var urlProvider = new UrlProvider(umbracoContext, new IUrlProvider[] { new DefaultUrlProvider() }); + var urlProvider = new UrlProvider(umbracoContext, umbracoSettings.WebRouting, new IUrlProvider[] + { + new DefaultUrlProvider(umbracoSettings.RequestHandler) + }); var routingContext = new RoutingContext( umbracoContext, Enumerable.Empty(), diff --git a/src/Umbraco.Tests/TestHelpers/MockHelper.cs b/src/Umbraco.Tests/TestHelpers/MockHelper.cs new file mode 100644 index 0000000000..ae7245b855 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/MockHelper.cs @@ -0,0 +1,59 @@ +using Moq; +using Umbraco.Core; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Services; + +namespace Umbraco.Tests.TestHelpers +{ + public static class MockHelper + { + public static ServiceContext GetMockedServiceContext(IUmbracoSettingsSection settings = null, ILogger logger = null, CacheHelper cacheHelper = null, ISqlSyntaxProvider sqlSyntax = null) + { + if (settings == null) settings = SettingsForTests.GetDefault(); + if (logger == null) logger = Mock.Of(); + if (cacheHelper == null) cacheHelper = CacheHelper.CreateDisabledCacheHelper(); + if (sqlSyntax == null) sqlSyntax = Mock.Of(); + + return new ServiceContext( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new PackagingService( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new RepositoryFactory(cacheHelper, logger, sqlSyntax, settings), + new Mock().Object), + new Mock().Object, + new RelationService( + new Mock().Object, + new RepositoryFactory(cacheHelper, logger, sqlSyntax, settings), + logger, + new Mock().Object), + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs index 723f621356..91ca2b1e0f 100644 --- a/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web.Mvc; using System.Web.Routing; using System.Web.SessionState; +using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Web; @@ -34,20 +36,26 @@ namespace Umbraco.Tests.TestHelpers.Stubs if (t == null) return null; + var possibleParams = new object[] + { + _umbracoContext, _logger + }; var ctors = t.GetConstructors(); - if (ctors.Any(x => + foreach (var ctor in ctors.OrderByDescending(x => x.GetParameters().Count())) { - var parameters = x.GetParameters(); - if (parameters.Length != 2) return false; - return parameters.First().ParameterType == typeof (ILogger) && parameters.Last().ParameterType == typeof (UmbracoContext); - })) - { - return Activator.CreateInstance(t, new object[]{_logger, _umbracoContext}) as IController; - } - else - { - return Activator.CreateInstance(t) as IController; + var args = new List(); + var allParams = ctor.GetParameters().ToArray(); + foreach (var parameter in allParams) + { + var found = possibleParams.SingleOrDefault(x => x.GetType() == parameter.ParameterType); + if (found != null) args.Add(found); + } + if (args.Count == allParams.Length) + { + return Activator.CreateInstance(t, args.ToArray()) as IController; + } } + return null; } public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName) diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index 7f881ba559..eec71f9a7f 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -12,7 +12,7 @@ using GlobalSettings = umbraco.GlobalSettings; namespace Umbraco.Tests.TestHelpers { - /// + /// /// Common helper properties and methods useful to testing /// public static class TestHelper diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index e54c0d304d..035ad0123a 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -111,9 +111,15 @@ + + ..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Extensions.dll + ..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll + + ..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Primitives.dll + @@ -169,8 +175,11 @@ + + + @@ -396,6 +405,7 @@ + @@ -667,6 +677,11 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" /Y /F /E /D + + + + + + + + + + \ No newline at end of file diff --git a/src/Umbraco.Web/UmbracoContext.cs b/src/Umbraco.Web/UmbracoContext.cs index ba2f6aee46..efbe290f15 100644 --- a/src/Umbraco.Web/UmbracoContext.cs +++ b/src/Umbraco.Web/UmbracoContext.cs @@ -1,13 +1,16 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Web; using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; using Umbraco.Web.Security; -using umbraco; using umbraco.BusinessLogic; using umbraco.presentation.preview; +using GlobalSettings = umbraco.GlobalSettings; using IOHelper = Umbraco.Core.IO.IOHelper; using SystemDirectories = Umbraco.Core.IO.SystemDirectories; @@ -24,8 +27,8 @@ namespace Umbraco.Web private bool _replacing; private bool? _previewing; - private Lazy _contentCache; - private Lazy _mediaCache; + private readonly Lazy _contentCache; + private readonly Lazy _mediaCache; /// /// Used if not running in a web application (no real HttpContext) @@ -34,6 +37,57 @@ namespace Umbraco.Web private static UmbracoContext _umbracoContext; #region EnsureContext methods + + #region Obsolete + [Obsolete("Use the method that specifies IUmbracoSettings instead")] + [EditorBrowsable(EditorBrowsableState.Never)] + public static UmbracoContext EnsureContext( + HttpContextBase httpContext, + ApplicationContext applicationContext, + WebSecurity webSecurity) + { + return EnsureContext(httpContext, applicationContext, webSecurity, false); + } + [Obsolete("Use the method that specifies IUmbracoSettings instead")] + [EditorBrowsable(EditorBrowsableState.Never)] + public static UmbracoContext EnsureContext( + HttpContextBase httpContext, + ApplicationContext applicationContext) + { + return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), false); + } + [Obsolete("Use the method that specifies IUmbracoSettings instead")] + [EditorBrowsable(EditorBrowsableState.Never)] + public static UmbracoContext EnsureContext( + HttpContextBase httpContext, + ApplicationContext applicationContext, + bool replaceContext) + { + return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), replaceContext); + } + [Obsolete("Use the method that specifies IUmbracoSettings instead")] + [EditorBrowsable(EditorBrowsableState.Never)] + public static UmbracoContext EnsureContext( + HttpContextBase httpContext, + ApplicationContext applicationContext, + WebSecurity webSecurity, + bool replaceContext) + { + return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), replaceContext, null); + } + [Obsolete("Use the method that specifies IUmbracoSettings instead")] + [EditorBrowsable(EditorBrowsableState.Never)] + public static UmbracoContext EnsureContext( + HttpContextBase httpContext, + ApplicationContext applicationContext, + WebSecurity webSecurity, + bool replaceContext, + bool? preview) + { + return EnsureContext(httpContext, applicationContext, webSecurity, UmbracoConfig.For.UmbracoSettings(), replaceContext, preview); + } + #endregion + /// /// This is a helper method which is called to ensure that the singleton context is created and the nice url and routing /// context is created and assigned. @@ -41,6 +95,7 @@ namespace Umbraco.Web /// /// /// + /// /// /// The Singleton context object /// @@ -53,17 +108,21 @@ namespace Umbraco.Web public static UmbracoContext EnsureContext( HttpContextBase httpContext, ApplicationContext applicationContext, - WebSecurity webSecurity) + WebSecurity webSecurity, + IUmbracoSettingsSection umbracoSettings) { - return EnsureContext(httpContext, applicationContext, webSecurity, false); + return EnsureContext(httpContext, applicationContext, webSecurity, umbracoSettings, false); } + + /// /// This is a helper method which is called to ensure that the singleton context is created and the nice url and routing /// context is created and assigned. /// /// /// + /// /// /// The Singleton context object /// @@ -75,17 +134,21 @@ namespace Umbraco.Web /// public static UmbracoContext EnsureContext( HttpContextBase httpContext, - ApplicationContext applicationContext) + ApplicationContext applicationContext, + IUmbracoSettingsSection umbracoSettings) { - return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), false); + return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), umbracoSettings, false); } + + /// /// This is a helper method which is called to ensure that the singleton context is created and the nice url and routing /// context is created and assigned. /// /// /// + /// /// /// if set to true will replace the current singleton with a new one, this is generally only ever used because /// during application startup the base url domain will not be available so after app startup we'll replace the current @@ -103,11 +166,15 @@ namespace Umbraco.Web public static UmbracoContext EnsureContext( HttpContextBase httpContext, ApplicationContext applicationContext, + IUmbracoSettingsSection umbracoSettings, bool replaceContext) { - return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), replaceContext); + return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), umbracoSettings, replaceContext); } + + + /// /// This is a helper method which is called to ensure that the singleton context is created and the nice url and routing /// context is created and assigned. @@ -115,6 +182,7 @@ namespace Umbraco.Web /// /// /// + /// /// /// if set to true will replace the current singleton with a new one, this is generally only ever used because /// during application startup the base url domain will not be available so after app startup we'll replace the current @@ -133,11 +201,14 @@ namespace Umbraco.Web HttpContextBase httpContext, ApplicationContext applicationContext, WebSecurity webSecurity, + IUmbracoSettingsSection umbracoSettings, bool replaceContext) { - return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), replaceContext, null); + return EnsureContext(httpContext, applicationContext, new WebSecurity(httpContext, applicationContext), umbracoSettings, replaceContext, null); } + + /// /// This is a helper method which is called to ensure that the singleton context is created and the nice url and routing /// context is created and assigned. @@ -145,6 +216,7 @@ namespace Umbraco.Web /// /// /// + /// /// /// if set to true will replace the current singleton with a new one, this is generally only ever used because /// during application startup the base url domain will not be available so after app startup we'll replace the current @@ -164,12 +236,13 @@ namespace Umbraco.Web HttpContextBase httpContext, ApplicationContext applicationContext, WebSecurity webSecurity, + IUmbracoSettingsSection umbracoSettings, bool replaceContext, bool? preview) { if (UmbracoContext.Current != null) { - if (!replaceContext) + if (replaceContext == false) return UmbracoContext.Current; UmbracoContext.Current._replacing = true; } @@ -189,8 +262,9 @@ namespace Umbraco.Web // create the nice urls provider // there's one per request because there are some behavior parameters that can be changed new Lazy( - () => new UrlProvider( + () => new UrlProvider( umbracoContext, + umbracoSettings.WebRouting, UrlProviderResolver.Current.Providers), false)); diff --git a/src/Umbraco.Web/WebServices/DomainsApiController.cs b/src/Umbraco.Web/WebServices/DomainsApiController.cs index 02a4269ac5..a72f7537b0 100644 --- a/src/Umbraco.Web/WebServices/DomainsApiController.cs +++ b/src/Umbraco.Web/WebServices/DomainsApiController.cs @@ -4,7 +4,10 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; +using System.Web.Services.Description; using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Web.Routing; using Umbraco.Web.WebApi; //using umbraco.cms.businesslogic.language; using umbraco.BusinessLogic.Actions; @@ -41,9 +44,9 @@ namespace Umbraco.Web.WebServices } model.Valid = true; - var domains = Routing.DomainHelper.GetNodeDomains(model.NodeId, true); - var languages = global::umbraco.cms.businesslogic.language.Language.GetAllAsList().ToArray(); - var language = model.Language > 0 ? languages.FirstOrDefault(l => l.id == model.Language) : null; + var domains = Services.DomainService.GetAssignedDomains(model.NodeId, true).ToArray(); + var languages = Services.LocalizationService.GetAllLanguages().ToArray(); + var language = model.Language > 0 ? languages.FirstOrDefault(l => l.Id == model.Language) : null; // process wildcard @@ -52,28 +55,43 @@ namespace Umbraco.Web.WebServices var wildcard = domains.FirstOrDefault(d => d.IsWildcard); if (wildcard != null) wildcard.Language = language; - else // yet there is a race condition here... - Domain.MakeNew("*" + model.NodeId, model.NodeId, model.Language); + else + { + // yet there is a race condition here... + var newDomain = new UmbracoDomain("*" + model.NodeId) + { + Language = Services.LocalizationService.GetLanguageById(model.Language), + RootContent = Services.ContentService.GetById(model.NodeId) + }; + Services.DomainService.Save(newDomain); + } + } else { var wildcard = domains.FirstOrDefault(d => d.IsWildcard); if (wildcard != null) - wildcard.Delete(); + { + Services.DomainService.Delete(wildcard); + } + } // process domains // delete every (non-wildcard) domain, that exists in the DB yet is not in the model - foreach (var domain in domains.Where(d => d.IsWildcard == false && model.Domains.All(m => m.Name.Equals(d.Name, StringComparison.OrdinalIgnoreCase) == false))) - domain.Delete(); + foreach (var domain in domains.Where(d => d.IsWildcard == false && model.Domains.All(m => m.Name.InvariantEquals(d.DomainName) == false))) + { + Services.DomainService.Delete(domain); + } + var names = new List(); // create or update domains in the model foreach (var domainModel in model.Domains.Where(m => string.IsNullOrWhiteSpace(m.Name) == false)) { - language = languages.FirstOrDefault(l => l.id == domainModel.Lang); + language = languages.FirstOrDefault(l => l.Id == domainModel.Lang); if (language == null) continue; var name = domainModel.Name.ToLowerInvariant(); @@ -83,13 +101,21 @@ namespace Umbraco.Web.WebServices continue; } names.Add(name); - var domain = domains.FirstOrDefault(d => d.Name.Equals(domainModel.Name, StringComparison.OrdinalIgnoreCase)); + var domain = domains.FirstOrDefault(d => d.DomainName.InvariantEquals(domainModel.Name)); if (domain != null) domain.Language = language; - else if (Domain.Exists(domainModel.Name)) + else if (Services.DomainService.Exists(domainModel.Name)) domainModel.Duplicate = true; - else // yet there is a race condition here... - Domain.MakeNew(name, model.NodeId, domainModel.Lang); + else + { + // yet there is a race condition here... + var newDomain = new UmbracoDomain(name) + { + Language = Services.LocalizationService.GetLanguageById(domainModel.Lang), + RootContent = Services.ContentService.GetById(model.NodeId) + }; + Services.DomainService.Save(newDomain); + } } model.Valid = model.Domains.All(m => m.Duplicate == false); diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 2e3bad534f..0889b16af4 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -17,7 +17,9 @@ - + + + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/AssignDomain2.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/AssignDomain2.aspx.cs index 5fb2a27875..136cc1a27d 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/AssignDomain2.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/AssignDomain2.aspx.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Text; using System.Linq; +using umbraco.BusinessLogic.Actions; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Web.UI.Pages; @@ -19,7 +20,7 @@ namespace umbraco.dialogs base.OnLoad(e); var nodeId = GetNodeId(); - var node = ApplicationContext.Current.Services.ContentService.GetById(nodeId); + var node = Services.ContentService.GetById(nodeId); if (node == null) { @@ -30,7 +31,7 @@ namespace umbraco.dialogs return; } - if (!UmbracoUser.GetPermissions(node.Path).Contains(BusinessLogic.Actions.ActionAssignDomain.Instance.Letter)) + if (UmbracoUser.GetPermissions(node.Path).Contains(ActionAssignDomain.Instance.Letter) == false) { feedback.Text = ui.Text("assignDomain", "permissionDenied"); pane_language.Visible = false; @@ -43,7 +44,7 @@ namespace umbraco.dialogs pane_domains.Title = ui.Text("assignDomain", "setDomains"); prop_language.Text = ui.Text("assignDomain", "language"); - var nodeDomains = DomainHelper.GetNodeDomains(nodeId, true); + var nodeDomains = Services.DomainService.GetAssignedDomains(nodeId, true).ToArray(); var wildcard = nodeDomains.FirstOrDefault(d => d.IsWildcard); var sb = new StringBuilder(); @@ -53,12 +54,12 @@ namespace umbraco.dialogs sb.AppendFormat("{0}{{ \"Id\": {1}, \"Code\": \"{2}\" }}", (i++ == 0 ? "" : ","), language.Id, language.IsoCode); sb.Append("]\r\n"); - sb.AppendFormat(",language: {0}", wildcard == null ? "undefined" : wildcard.Language.id.ToString()); + sb.AppendFormat(",language: {0}", wildcard == null ? "undefined" : wildcard.Language.Id.ToString()); sb.Append(",domains: ["); i = 0; - foreach (var domain in nodeDomains.Where(d => !d.IsWildcard)) - sb.AppendFormat("{0}{{ \"Name\": \"{1}\", \"Lang\": \"{2}\" }}", (i++ == 0 ? "" :","), domain.Name, domain.Language.id); + foreach (var domain in nodeDomains.Where(d => d.IsWildcard == false)) + sb.AppendFormat("{0}{{ \"Name\": \"{1}\", \"Lang\": \"{2}\" }}", (i++ == 0 ? "" :","), domain.DomainName, domain.Language.Id); sb.Append("]\r\n"); data.Text = sb.ToString(); @@ -67,7 +68,7 @@ namespace umbraco.dialogs protected int GetNodeId() { int nodeId; - if (!int.TryParse(Request.QueryString["id"], out nodeId)) + if (int.TryParse(Request.QueryString["id"], out nodeId) == false) nodeId = -1; return nodeId; } diff --git a/src/umbraco.businesslogic/UserType.cs b/src/umbraco.businesslogic/UserType.cs index 31604c3ce9..766b01301e 100644 --- a/src/umbraco.businesslogic/UserType.cs +++ b/src/umbraco.businesslogic/UserType.cs @@ -184,7 +184,6 @@ namespace umbraco.BusinessLogic /// /// /// - [MethodImpl(MethodImplOptions.Synchronized)] public static UserType MakeNew(string name, string defaultPermissions, string alias) { //ensure that the current alias does not exist diff --git a/src/umbraco.cms/businesslogic/Dictionary.cs b/src/umbraco.cms/businesslogic/Dictionary.cs index 04633a2177..0d34da4615 100644 --- a/src/umbraco.cms/businesslogic/Dictionary.cs +++ b/src/umbraco.cms/businesslogic/Dictionary.cs @@ -10,6 +10,7 @@ using System.Linq; using Umbraco.Core; using umbraco.cms.businesslogic.language; using Umbraco.Core.Models; +using Umbraco.Core.Services; using umbraco.DataLayer; using umbraco.BusinessLogic; using System.Runtime.CompilerServices; @@ -250,27 +251,17 @@ namespace umbraco.cms.businesslogic public XmlNode ToXml(XmlDocument xd) { - - XmlNode dictionaryItem = xd.CreateElement("DictionaryItem"); - dictionaryItem.Attributes.Append(xmlHelper.addAttribute(xd, "Key", this.key)); - foreach (Language lang in Language.GetAllAsList()) - { - XmlNode itemValue = xmlHelper.addCDataNode(xd, "Value", this.Value(lang.id)); - itemValue.Attributes.Append(xmlHelper.addAttribute(xd, "LanguageId", lang.id.ToString(CultureInfo.InvariantCulture))); - itemValue.Attributes.Append(xmlHelper.addAttribute(xd, "LanguageCultureAlias", lang.CultureAlias)); - dictionaryItem.AppendChild(itemValue); - } - + var serializer = new EntityXmlSerializer(); + var xml = serializer.Serialize(_dictionaryItem); + var xmlNode = xml.GetXmlNode(xd); if (this.hasChildren) { - foreach (DictionaryItem di in this.Children) + foreach (var di in this.Children) { - dictionaryItem.AppendChild(di.ToXml(xd)); + xmlNode.AppendChild(di.ToXml(xd)); } } - - - return dictionaryItem; + return xmlNode; } public static DictionaryItem Import(XmlNode xmlData) diff --git a/src/umbraco.cms/businesslogic/Packager/Installer.cs b/src/umbraco.cms/businesslogic/Packager/Installer.cs index 5693547a7b..0b28c434c0 100644 --- a/src/umbraco.cms/businesslogic/Packager/Installer.cs +++ b/src/umbraco.cms/businesslogic/Packager/Installer.cs @@ -347,6 +347,7 @@ namespace umbraco.cms.businesslogic.packager #region Macros foreach (XmlNode n in Config.DocumentElement.SelectNodes("//macro")) { + //TODO: Fix this, this should not use the legacy API Macro m = Macro.Import(n); if (m != null) diff --git a/src/umbraco.cms/businesslogic/language/Language.cs b/src/umbraco.cms/businesslogic/language/Language.cs index c00fbbc85b..c5badc001b 100644 --- a/src/umbraco.cms/businesslogic/language/Language.cs +++ b/src/umbraco.cms/businesslogic/language/Language.cs @@ -6,6 +6,7 @@ using System.Xml; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Logging; +using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Services; using umbraco.DataLayer; @@ -28,7 +29,8 @@ namespace umbraco.cms.businesslogic.language { #region Private members - private Umbraco.Core.Models.ILanguage _lang; + internal ILanguage LanguageEntity { get; private set; } + #endregion #region Constants and static members @@ -54,8 +56,8 @@ namespace umbraco.cms.businesslogic.language /// The id. public Language(int id) { - _lang = ApplicationContext.Current.Services.LocalizationService.GetLanguageById(id); - if (_lang == null) + LanguageEntity = ApplicationContext.Current.Services.LocalizationService.GetLanguageById(id); + if (LanguageEntity == null) { throw new ArgumentException("No language found with the specified id"); } @@ -66,6 +68,11 @@ namespace umbraco.cms.businesslogic.language /// internal Language() { } + internal Language(ILanguage langEntity) + { + LanguageEntity = langEntity; + } + #endregion #region Static methods @@ -85,7 +92,7 @@ namespace umbraco.cms.businesslogic.language CultureName = culture.DisplayName }; ApplicationContext.Current.Services.LocalizationService.Save(lang); - var ct = new Language { _lang = lang }; + var ct = new Language(lang); ct.OnNew(new NewEventArgs()); } } @@ -111,10 +118,7 @@ namespace umbraco.cms.businesslogic.language /// public static IEnumerable GetAllAsList() { - var all = ApplicationContext.Current.Services.LocalizationService.GetAllLanguages().Select(x => new Language - { - _lang = x - }).ToArray(); + var all = ApplicationContext.Current.Services.LocalizationService.GetAllLanguages().Select(x => new Language(x)).ToArray(); return all; } @@ -128,10 +132,7 @@ namespace umbraco.cms.businesslogic.language { var found = ApplicationContext.Current.Services.LocalizationService.GetLanguageByIsoCode(cultureCode); if (found == null) return null; - var lang = new Language - { - _lang = found - }; + var lang = new Language(found); return lang; } @@ -174,7 +175,7 @@ namespace umbraco.cms.businesslogic.language /// public int id { - get { return _lang.Id; } + get { return LanguageEntity.Id; } } /// @@ -182,10 +183,10 @@ namespace umbraco.cms.businesslogic.language /// public string CultureAlias { - get { return _lang.IsoCode; } + get { return LanguageEntity.IsoCode; } set { - _lang.IsoCode = value; + LanguageEntity.IsoCode = value; } } @@ -194,7 +195,7 @@ namespace umbraco.cms.businesslogic.language /// public string FriendlyName { - get { return _lang.CultureInfo.DisplayName; } + get { return LanguageEntity.CultureInfo.DisplayName; } } #endregion @@ -233,7 +234,7 @@ namespace umbraco.cms.businesslogic.language FireBeforeSave(e); //Do the update! - ApplicationContext.Current.Services.LocalizationService.Save(_lang); + ApplicationContext.Current.Services.LocalizationService.Save(LanguageEntity); if (!e.Cancel) { @@ -258,15 +259,15 @@ namespace umbraco.cms.businesslogic.language if (!e.Cancel) { - ApplicationContext.Current.Services.LocalizationService.Delete(_lang); + ApplicationContext.Current.Services.LocalizationService.Delete(LanguageEntity); FireAfterDelete(e); } } else { - var e = new DataException("Cannot remove language " + _lang.CultureInfo.DisplayName + " because it's attached to a domain on a node"); - LogHelper.Error("Cannot remove language " + _lang.CultureInfo.DisplayName + " because it's attached to a domain on a node", e); + var e = new DataException("Cannot remove language " + LanguageEntity.CultureInfo.DisplayName + " because it's attached to a domain on a node"); + LogHelper.Error("Cannot remove language " + LanguageEntity.CultureInfo.DisplayName + " because it's attached to a domain on a node", e); throw e; } } @@ -279,7 +280,7 @@ namespace umbraco.cms.businesslogic.language public XmlNode ToXml(XmlDocument xd) { var serializer = new EntityXmlSerializer(); - var xml = serializer.Serialize(_lang); + var xml = serializer.Serialize(LanguageEntity); return xml.GetXmlNode(xd); } #endregion diff --git a/src/umbraco.cms/businesslogic/macro/Macro.cs b/src/umbraco.cms/businesslogic/macro/Macro.cs index 67021792d7..64bbd6accf 100644 --- a/src/umbraco.cms/businesslogic/macro/Macro.cs +++ b/src/umbraco.cms/businesslogic/macro/Macro.cs @@ -11,6 +11,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Services; using umbraco.DataLayer; using umbraco.BusinessLogic; using System.Linq; @@ -32,7 +33,7 @@ namespace umbraco.cms.businesslogic.macro public class Macro { //initialize empty model - internal IMacro MacroItem = new Umbraco.Core.Models.Macro(); + internal IMacro MacroEntity = new Umbraco.Core.Models.Macro(); protected static ISqlHelper SqlHelper { @@ -44,7 +45,7 @@ namespace umbraco.cms.businesslogic.macro /// public int Id { - get { return MacroItem.Id; } + get { return MacroEntity.Id; } } /// @@ -52,8 +53,8 @@ namespace umbraco.cms.businesslogic.macro /// public bool UseInEditor { - get { return MacroItem.UseInEditor; } - set { MacroItem.UseInEditor = value; } + get { return MacroEntity.UseInEditor; } + set { MacroEntity.UseInEditor = value; } } /// @@ -64,8 +65,8 @@ namespace umbraco.cms.businesslogic.macro /// public int RefreshRate { - get { return MacroItem.CacheDuration; } - set { MacroItem.CacheDuration = value; } + get { return MacroEntity.CacheDuration; } + set { MacroEntity.CacheDuration = value; } } /// @@ -75,8 +76,8 @@ namespace umbraco.cms.businesslogic.macro /// public string Alias { - get { return MacroItem.Alias; } - set { MacroItem.Alias = value; } + get { return MacroEntity.Alias; } + set { MacroEntity.Alias = value; } } /// @@ -84,8 +85,8 @@ namespace umbraco.cms.businesslogic.macro /// public string Name { - get { return MacroItem.Name; } - set { MacroItem.Name = value; } + get { return MacroEntity.Name; } + set { MacroEntity.Name = value; } } /// @@ -95,8 +96,8 @@ namespace umbraco.cms.businesslogic.macro /// public string Assembly { - get { return MacroItem.ControlAssembly; } - set { MacroItem.ControlAssembly = value; } + get { return MacroEntity.ControlAssembly; } + set { MacroEntity.ControlAssembly = value; } } /// @@ -107,8 +108,8 @@ namespace umbraco.cms.businesslogic.macro /// public string Type { - get { return MacroItem.ControlType; } - set { MacroItem.ControlType = value; } + get { return MacroEntity.ControlType; } + set { MacroEntity.ControlType = value; } } /// @@ -118,8 +119,8 @@ namespace umbraco.cms.businesslogic.macro /// public string Xslt { - get { return MacroItem.XsltPath; } - set { MacroItem.XsltPath = value; } + get { return MacroEntity.XsltPath; } + set { MacroEntity.XsltPath = value; } } /// @@ -132,8 +133,8 @@ namespace umbraco.cms.businesslogic.macro /// public string ScriptingFile { - get { return MacroItem.ScriptPath; } - set { MacroItem.ScriptPath = value; } + get { return MacroEntity.ScriptPath; } + set { MacroEntity.ScriptPath = value; } } /// @@ -143,8 +144,8 @@ namespace umbraco.cms.businesslogic.macro /// public bool RenderContent { - get { return MacroItem.DontRender == false; } - set { MacroItem.DontRender = value == false; } + get { return MacroEntity.DontRender == false; } + set { MacroEntity.DontRender = value == false; } } /// @@ -153,8 +154,8 @@ namespace umbraco.cms.businesslogic.macro /// true if [cache personalized]; otherwise, false. public bool CachePersonalized { - get { return MacroItem.CacheByMember; } - set { MacroItem.CacheByMember = value; } + get { return MacroEntity.CacheByMember; } + set { MacroEntity.CacheByMember = value; } } /// @@ -163,8 +164,8 @@ namespace umbraco.cms.businesslogic.macro /// true if [cache by page]; otherwise, false. public bool CacheByPage { - get { return MacroItem.CacheByPage; } - set { MacroItem.CacheByPage = value; } + get { return MacroEntity.CacheByPage; } + set { MacroEntity.CacheByPage = value; } } /// @@ -174,7 +175,7 @@ namespace umbraco.cms.businesslogic.macro { get { - return MacroItem.Properties.Select(x => new MacroProperty + return MacroEntity.Properties.Select(x => new MacroProperty { Alias = x.Alias, Name = x.Name, @@ -203,7 +204,7 @@ namespace umbraco.cms.businesslogic.macro internal Macro(IMacro macro) { - MacroItem = macro; + MacroEntity = macro; } /// @@ -226,7 +227,7 @@ namespace umbraco.cms.businesslogic.macro if (e.Cancel == false) { - ApplicationContext.Current.Services.MacroService.Save(MacroItem); + ApplicationContext.Current.Services.MacroService.Save(MacroEntity); FireAfterSave(e); } @@ -243,12 +244,14 @@ namespace umbraco.cms.businesslogic.macro if (e.Cancel == false) { - ApplicationContext.Current.Services.MacroService.Delete(MacroItem); + ApplicationContext.Current.Services.MacroService.Delete(MacroEntity); FireAfterDelete(e); } } + //TODO: Fix this, this should wrap a new API! + public static Macro Import(XmlNode n) { var alias = XmlHelper.GetNodeValue(n.SelectSingleNode("alias")); @@ -338,7 +341,7 @@ namespace umbraco.cms.businesslogic.macro if (macro == null) throw new ArgumentException(string.Format("No Macro exists with id '{0}'", id)); - MacroItem = macro; + MacroEntity = macro; } private void Setup(string alias) @@ -348,7 +351,7 @@ namespace umbraco.cms.businesslogic.macro if (macro == null) throw new ArgumentException(string.Format("No Macro exists with alias '{0}'", alias)); - MacroItem = macro; + MacroEntity = macro; } /// @@ -358,25 +361,9 @@ namespace umbraco.cms.businesslogic.macro /// An xmlrepresentation of the macro public XmlNode ToXml(XmlDocument xd) { - XmlNode doc = xd.CreateElement("macro"); - - // info section - doc.AppendChild(XmlHelper.AddTextNode(xd, "name", this.Name)); - doc.AppendChild(XmlHelper.AddTextNode(xd, "alias", this.Alias)); - doc.AppendChild(XmlHelper.AddTextNode(xd, "scriptType", this.Type)); - doc.AppendChild(XmlHelper.AddTextNode(xd, "scriptAssembly", this.Assembly)); - doc.AppendChild(XmlHelper.AddTextNode(xd, "xslt", this.Xslt)); - doc.AppendChild(XmlHelper.AddTextNode(xd, "useInEditor", this.UseInEditor.ToString())); - doc.AppendChild(XmlHelper.AddTextNode(xd, "refreshRate", this.RefreshRate.ToString(CultureInfo.InvariantCulture))); - doc.AppendChild(XmlHelper.AddTextNode(xd, "scriptingFile", this.ScriptingFile)); - - // properties - XmlNode props = xd.CreateElement("properties"); - foreach (var p in this.Properties) - props.AppendChild(p.ToXml(xd)); - doc.AppendChild(props); - - return doc; + var serializer = new EntityXmlSerializer(); + var xml = serializer.Serialize(MacroEntity); + return xml.GetXmlNode(xd); } [Obsolete("This does nothing")] @@ -392,7 +379,6 @@ namespace umbraco.cms.businesslogic.macro /// /// Userfriendly name /// The newly macro - [MethodImpl(MethodImplOptions.Synchronized)] public static Macro MakeNew(string Name) { var macro = new Umbraco.Core.Models.Macro diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index d1c5c560d7..51a859735f 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -217,7 +217,6 @@ namespace umbraco.cms.businesslogic.member /// The umbraco usercontext /// The email of the user /// The new member - [MethodImpl(MethodImplOptions.Synchronized)] public static Member MakeNew(string Name, string LoginName, string Email, MemberType mbt, User u) { if (mbt == null) throw new ArgumentNullException("mbt"); diff --git a/src/umbraco.cms/businesslogic/member/MemberType.cs b/src/umbraco.cms/businesslogic/member/MemberType.cs index e8e5cc3078..f310741699 100644 --- a/src/umbraco.cms/businesslogic/member/MemberType.cs +++ b/src/umbraco.cms/businesslogic/member/MemberType.cs @@ -154,7 +154,6 @@ namespace umbraco.cms.businesslogic.member /// /// The name of the MemberType /// Creator of the MemberType - [MethodImpl(MethodImplOptions.Synchronized)] public static MemberType MakeNew(User u, string Text) { var alias = helpers.Casing.SafeAliasWithForcingCheck(Text); diff --git a/src/umbraco.cms/businesslogic/relation/Relation.cs b/src/umbraco.cms/businesslogic/relation/Relation.cs index 19cd4d7798..dd66cf5c4c 100644 --- a/src/umbraco.cms/businesslogic/relation/Relation.cs +++ b/src/umbraco.cms/businesslogic/relation/Relation.cs @@ -1,8 +1,10 @@ using System; using System.Data; +using System.Linq; using System.Runtime.CompilerServices; using System.Collections.Generic; - +using Umbraco.Core; +using Umbraco.Core.Models; using umbraco.DataLayer; using umbraco.BusinessLogic; @@ -11,15 +13,28 @@ namespace umbraco.cms.businesslogic.relation /// /// Summary description for Relation. /// - [Obsolete("Use the RelationService instead")] + [Obsolete("Use the IRelationService instead")] public class Relation { - private int _id; - private CMSNode _parentNode; - private CMSNode _childNode; - private string _comment; - private DateTime _datetime; - private RelationType _relType; + private CMSNode _parentNode; + private CMSNode _childNode; + + internal IRelation RelationEntity; + + internal Relation(IRelation relation) + { + RelationEntity = relation; + } + + public Relation(int Id) + { + var found = ApplicationContext.Current.Services.RelationService.GetById(Id); + if (found == null) + { + throw new NullReferenceException("No relation found with id " + Id); + } + RelationEntity = found; + } protected static ISqlHelper SqlHelper { @@ -28,133 +43,84 @@ namespace umbraco.cms.businesslogic.relation public CMSNode Parent { - get {return _parentNode;} - set - { - SqlHelper.ExecuteNonQuery("update umbracoRelation set parentId = @parent where id = " + this.Id, SqlHelper.CreateParameter("@parent", value.Id)); - _parentNode = value; - } + get { return _parentNode ?? (_parentNode = new CMSNode(RelationEntity.ParentId)); } + set + { + _parentNode = value; + RelationEntity.ParentId = value.Id; + } } public CMSNode Child { - get {return _childNode;} - set - { - SqlHelper.ExecuteNonQuery("update umbracoRelation set childId = @child where id = " + this.Id, SqlHelper.CreateParameter("@child", value.Id)); - _childNode = value; - } + get { return _childNode ?? (_childNode = new CMSNode(RelationEntity.ChildId)); } + set + { + _childNode = value; + RelationEntity.ChildId = value.Id; + } } public string Comment { - get {return _comment;} - set - { - SqlHelper.ExecuteNonQuery("update umbracoRelation set comment = @comment where id = " + this.Id, SqlHelper.CreateParameter("@comment", value)); - _comment = value; - } + get {return RelationEntity.Comment;} + set { RelationEntity.Comment = value; } } public DateTime CreateDate { - get {return _datetime;} + get {return RelationEntity.CreateDate;} } public RelationType RelType { - get {return _relType;} - set - { - SqlHelper.ExecuteNonQuery("update umbracoRelation set relType = @relType where id = " + this.Id, SqlHelper.CreateParameter("@relType", value.Id)); - _relType = value; - } + get { return new RelationType(RelationEntity.RelationType); } + set { RelationEntity.RelationType = value.RelationTypeEntity; } } public int Id { - get {return _id;} - } - - public Relation(int Id) - { - using (IRecordsReader dr = SqlHelper.ExecuteReader("select * from umbracoRelation where id = @id", SqlHelper.CreateParameter("@id", Id))) - { - if (dr.Read()) - { - this._id = dr.GetInt("id"); - this._parentNode = new CMSNode(dr.GetInt("parentId")); - this._childNode = new CMSNode(dr.GetInt("childId")); - this._relType = RelationType.GetById(dr.GetInt("relType")); - this._comment = dr.GetString("comment"); - this._datetime = dr.GetDateTime("datetime"); - } - else - { - throw new ArgumentException("No relation found for id " + Id.ToString()); - } - } + get {return RelationEntity.Id;} } /// - /// Used to persist object changes to the database. In Version3.0 it's just a stub for future compatibility + /// Used to persist object changes to the database /// public virtual void Save() { + ApplicationContext.Current.Services.RelationService.Save(RelationEntity); } - - public void Delete() + public void Delete() { - SqlHelper.ExecuteNonQuery("DELETE FROM umbracoRelation WHERE id = @id", SqlHelper.CreateParameter("@id", this.Id)); + ApplicationContext.Current.Services.RelationService.Delete(RelationEntity); } - [MethodImpl(MethodImplOptions.Synchronized)] - public static Relation MakeNew(int ParentId, int ChildId, RelationType RelType, string Comment) - { - // The method is synchronized - SqlHelper.ExecuteNonQuery("INSERT INTO umbracoRelation (childId, parentId, relType, comment) VALUES (@childId, @parentId, @relType, @comment)", - SqlHelper.CreateParameter("@childId", ChildId), - SqlHelper.CreateParameter("@parentId", ParentId), - SqlHelper.CreateParameter("@relType", RelType.Id), - SqlHelper.CreateParameter("@comment", Comment)); - return new Relation(SqlHelper.ExecuteScalar("SELECT MAX(id) FROM umbracoRelation")); - } - - - - public static List GetRelationsAsList(int NodeId) - { - List _rels = new List(); - System.Collections.ArrayList tmp = new System.Collections.ArrayList(); - using (IRecordsReader dr = SqlHelper.ExecuteReader("select umbracoRelation.id from umbracoRelation inner join umbracoRelationType on umbracoRelationType.id = umbracoRelation.relType where umbracoRelation.parentId = @id or (umbracoRelation.childId = @id and umbracoRelationType.[dual] = 1)", SqlHelper.CreateParameter("@id", NodeId))) - { - while(dr.Read()) - { - _rels.Add(new Relation(dr.GetInt("id"))); - } - } - - return _rels; - } - - public static bool IsRelated(int ParentID, int ChildId) { - int count = SqlHelper.ExecuteScalar("SELECT count(*) FROM umbracoRelation WHERE childId = @childId AND parentId = @parentId", - SqlHelper.CreateParameter("@childId", ChildId), - SqlHelper.CreateParameter("@parentId", ParentID)); - - return (count > 0); + public static Relation MakeNew(int ParentId, int ChildId, RelationType RelType, string Comment) + { + var relation = new Umbraco.Core.Models.Relation(ParentId, ChildId, RelType.RelationTypeEntity) + { + Comment = Comment + }; + ApplicationContext.Current.Services.RelationService.Save(relation); + return new Relation(relation); } - public static bool IsRelated(int ParentID, int ChildId, RelationType Filter) { - - int count = SqlHelper.ExecuteScalar("SELECT count(*) FROM umbracoRelation WHERE childId = @childId AND parentId = @parentId AND relType = @relType", - SqlHelper.CreateParameter("@childId", ChildId), - SqlHelper.CreateParameter("@parentId", ParentID), - SqlHelper.CreateParameter("@relType", Filter.Id) - ); + public static List GetRelationsAsList(int NodeId) + { + return ApplicationContext.Current.Services.RelationService.GetByParentOrChildId(NodeId) + .Select(x => new Relation(x)) + .ToList(); + } - return (count > 0); + public static bool IsRelated(int ParentID, int ChildId) + { + return ApplicationContext.Current.Services.RelationService.AreRelated(ParentID, ChildId); + } + + public static bool IsRelated(int ParentID, int ChildId, RelationType Filter) + { + return ApplicationContext.Current.Services.RelationService.AreRelated(ParentID, ChildId, Filter.Alias); } public static Relation[] GetRelations(int NodeId) @@ -164,19 +130,9 @@ namespace umbraco.cms.businesslogic.relation public static Relation[] GetRelations(int NodeId, RelationType Filter) { - System.Collections.ArrayList tmp = new System.Collections.ArrayList(); - using (IRecordsReader dr = SqlHelper.ExecuteReader("select umbracoRelation.id from umbracoRelation inner join umbracoRelationType on umbracoRelationType.id = umbracoRelation.relType and umbracoRelationType.id = @relTypeId where umbracoRelation.parentId = @id or (umbracoRelation.childId = @id and umbracoRelationType.[dual] = 1)", SqlHelper.CreateParameter("@id", NodeId), SqlHelper.CreateParameter("@relTypeId", Filter.Id))) - { - while(dr.Read()) - { - tmp.Add(dr.GetInt("id")); - } - } - - Relation[] retval = new Relation[tmp.Count]; - - for (int i = 0; i < tmp.Count; i++) retval[i] = new Relation((int)tmp[i]); - return retval; + return ApplicationContext.Current.Services.RelationService.GetByParentOrChildId(NodeId, Filter.RelationTypeEntity.Alias) + .Select(x => new Relation(x)) + .ToArray(); } } } diff --git a/src/umbraco.cms/businesslogic/relation/RelationType.cs b/src/umbraco.cms/businesslogic/relation/RelationType.cs index 43b297cbbb..bedb51e440 100644 --- a/src/umbraco.cms/businesslogic/relation/RelationType.cs +++ b/src/umbraco.cms/businesslogic/relation/RelationType.cs @@ -1,9 +1,11 @@ using System; using System.Data; +using System.Linq; using System.Web; using Umbraco.Core; using Umbraco.Core.Cache; using umbraco.BusinessLogic; +using Umbraco.Core.Models; using umbraco.DataLayer; using System.Collections.Generic; using umbraco.cms.businesslogic.web; @@ -13,17 +15,13 @@ namespace umbraco.cms.businesslogic.relation /// /// Summary description for RelationType. /// + [Obsolete("Use the IRelationService instead")] public class RelationType { #region Declarations - private int _id; - private bool _dual; - private string _name; - //private Guid _parentObjectType; - //private Guid _childObjectType; - private string _alias; - + internal IRelationType RelationTypeEntity; + #endregion private static ISqlHelper SqlHelper @@ -33,25 +31,18 @@ namespace umbraco.cms.businesslogic.relation #region Constructors - /// - /// Internal constructor to create a new relation type - /// - internal RelationType() { } + /// + /// Internal constructor to create a new relation type + /// + internal RelationType(IRelationType rt) + { + RelationTypeEntity = rt; + } public RelationType(int id) { - using (IRecordsReader dr = SqlHelper.ExecuteReader( - "SELECT id, [dual], name, alias FROM umbracoRelationType WHERE id = @id", SqlHelper.CreateParameter("@id", id))) - { - if (dr.Read()) - { - PopulateFromReader(dr); - } - else - { - throw new ArgumentException("Not RelationType found for id " + id.ToString()); - } - } + RelationTypeEntity = ApplicationContext.Current.Services.RelationService.GetRelationTypeById(id); + if (RelationTypeEntity == null) throw new NullReferenceException("No relation type found with id " + id); } #endregion @@ -60,61 +51,37 @@ namespace umbraco.cms.businesslogic.relation public int Id { - get { return _id; } + get { return RelationTypeEntity.Id; } } public string Name { - get { return _name; } - set - { - _name = value; - SqlHelper.ExecuteNonQuery( - "UPDATE umbracoRelationType SET name = @name WHERE id = " + this.Id.ToString(), SqlHelper.CreateParameter("@name", value)); - } + get { return RelationTypeEntity.Name; } + set { RelationTypeEntity.Name = value; } } public string Alias { - get { return _alias; } - set - { - _alias = value; - SqlHelper.ExecuteNonQuery( - "UPDATE umbracoRelationType SET alias = @alias WHERE id = " + this.Id.ToString(), SqlHelper.CreateParameter("@alias", value)); - } + get { return RelationTypeEntity.Alias; } + set { RelationTypeEntity.Alias = value; } } public bool Dual { - get { return _dual; } - set - { - _dual = value; - SqlHelper.ExecuteNonQuery( - "UPDATE umbracoRelationType SET [dual] = @dual WHERE id = " + this.Id.ToString(), SqlHelper.CreateParameter("@dual", value)); - } + get { return RelationTypeEntity.IsBidirectional; } + set { RelationTypeEntity.IsBidirectional = value; } } #endregion - private void PopulateFromReader(IRecordsReader dr) - { - this._id = dr.GetInt("id"); - this._dual = dr.GetBoolean("dual"); - //this._parentObjectType = dr.GetGuid("parentObjectType"); - //this._childObjectType = dr.GetGuid("childObjectType"); - this._name = dr.GetString("name"); - this._alias = dr.GetString("alias"); - } - #region Methods /// - /// Used to persist object changes to the database. In Version3.0 it's just a stub for future compatibility + /// Used to persist object changes to the databasey /// public virtual void Save() { + ApplicationContext.Current.Services.RelationService.Save(RelationTypeEntity); } /// @@ -123,45 +90,20 @@ namespace umbraco.cms.businesslogic.relation /// public static IEnumerable GetAll() { - var relationTypes = new List(); - - using (IRecordsReader dr = SqlHelper.ExecuteReader("SELECT id, [dual], name, alias FROM umbracoRelationType")) - { - while (dr.Read()) - { - var rt = new RelationType(); - rt.PopulateFromReader(dr); - relationTypes.Add(rt); - } - } - - return relationTypes; + return ApplicationContext.Current.Services.RelationService.GetAllRelationTypes() + .Select(x => new RelationType(x)); } public static RelationType GetById(int id) { - try - { - return new RelationType(id); - } - catch - { - return null; - } + var found = ApplicationContext.Current.Services.RelationService.GetRelationTypeById(id); + return found == null ? null : new RelationType(found); } public static RelationType GetByAlias(string Alias) { - try - { - return GetById(SqlHelper.ExecuteScalar( - "select id from umbracoRelationType where alias = @alias", - SqlHelper.CreateParameter("@alias", Alias))); - } - catch - { - return null; - } + var found = ApplicationContext.Current.Services.RelationService.GetRelationTypeByAlias(Alias); + return found == null ? null : new RelationType(found); } #endregion diff --git a/src/umbraco.cms/businesslogic/task/Task.cs b/src/umbraco.cms/businesslogic/task/Task.cs index b7cf1bfc8c..678cd60225 100644 --- a/src/umbraco.cms/businesslogic/task/Task.cs +++ b/src/umbraco.cms/businesslogic/task/Task.cs @@ -6,6 +6,7 @@ using System.Text; using System.Runtime.CompilerServices; using umbraco.BusinessLogic; +using Umbraco.Core; using umbraco.DataLayer; namespace umbraco.cms.businesslogic.task @@ -17,11 +18,13 @@ namespace umbraco.cms.businesslogic.task /// /// Tasks can in umbraco be used for setting up simple workflows, and contains basic controls structures to determine if the task is completed or not. /// + [Obsolete("Use Umbraco.Core.Service.ITaskService instead")] public class Task { + internal Umbraco.Core.Models.Task TaskEntity; + #region Properties - private int _id; /// /// Gets or sets the id. @@ -29,20 +32,18 @@ namespace umbraco.cms.businesslogic.task /// The id. public int Id { - get { return _id; } - set { _id = value; } + get { return TaskEntity.Id; } + set { TaskEntity.Id = value; } } - - private bool _closed; - + /// /// Gets or sets a value indicating whether this is closed. /// /// true if closed; otherwise, false. public bool Closed { - get { return _closed; } - set { _closed = value; } + get { return TaskEntity.Closed; } + set { TaskEntity.Closed = value; } } @@ -54,8 +55,12 @@ namespace umbraco.cms.businesslogic.task /// The node. public CMSNode Node { - get { return _node; } - set { _node = value; } + get { return _node ?? (_node = new CMSNode(TaskEntity.EntityId)); } + set + { + _node = value; + TaskEntity.EntityId = value.Id; + } } private TaskType _type; @@ -66,8 +71,15 @@ namespace umbraco.cms.businesslogic.task /// The type. public TaskType Type { - get { return _type; } - set { _type = value; } + get { return _type ?? (_type = new TaskType(TaskEntity.TaskType)); } + set + { + _type = value; + TaskEntity.TaskType = new Umbraco.Core.Models.TaskType(_type.Alias) + { + Id = _type.Id + }; + } } @@ -79,33 +91,32 @@ namespace umbraco.cms.businesslogic.task /// The parent user. public User ParentUser { - get { return _parentUser; } - set { _parentUser = value; } + get { return _parentUser ?? (_parentUser = new User(TaskEntity.OwnerUserId)); } + set + { + _parentUser = value; + TaskEntity.OwnerUserId = _parentUser.Id; + } } - - private string _comment; - + /// /// Gets or sets the comment. /// /// The comment. public string Comment { - get { return _comment; } - set { _comment = value; } + get { return TaskEntity.Comment; } + set { TaskEntity.Comment = value; } } - - private DateTime _date; - /// /// Gets or sets the date. /// /// The date. public DateTime Date { - get { return _date; } - set { _date = value; } + get { return TaskEntity.CreateDate; } + set { TaskEntity.CreateDate = value; } } private User _user; @@ -116,8 +127,12 @@ namespace umbraco.cms.businesslogic.task /// The user. public User User { - get { return _user; } - set { _user = value; } + get { return _user ?? (_user = new User(TaskEntity.AssigneeUserId)); } + set + { + _user = value; + TaskEntity.OwnerUserId = _user.Id; + } } /// @@ -140,26 +155,19 @@ namespace umbraco.cms.businesslogic.task { } + internal Task(Umbraco.Core.Models.Task task) + { + TaskEntity = task; + } + /// /// Initializes a new instance of the class. /// /// The task id. public Task(int TaskId) { - using (IRecordsReader dr = - SqlHelper.ExecuteReader( - "select id, taskTypeId, nodeId, parentUserId, userId, DateTime, comment, closed from cmsTask where id = @id", - SqlHelper.CreateParameter("@id", TaskId))) - { - if (dr.Read()) - { - PopulateTaskFromReader(dr); - } - else - { - throw new ArgumentException("Task with id: '" + TaskId + "' not found"); - } - } + TaskEntity = ApplicationContext.Current.Services.TaskService.GetTaskById(TaskId); + if (TaskEntity == null) throw new NullReferenceException("No task found with id " + TaskId); } #endregion @@ -172,63 +180,19 @@ namespace umbraco.cms.businesslogic.task /// public void Delete() { - SqlHelper.ExecuteNonQuery("DELETE FROM cmsTask WHERE id = @id", SqlHelper.CreateParameter("@id", this._id)); + ApplicationContext.Current.Services.TaskService.Delete(TaskEntity); } /// /// Saves this instance. /// - [MethodImpl(MethodImplOptions.Synchronized)] public void Save() { - //error checking - if (Node == null) throw new ArgumentNullException("Node"); - if (ParentUser == null) throw new ArgumentNullException("ParentUser"); - if (User == null) throw new ArgumentNullException("User"); - - if (Id == 0) - { - // The method is synchronized - SqlHelper.ExecuteNonQuery( - "insert into cmsTask (closed, taskTypeId, nodeId, parentUserId, userId, comment) values (@closed, @taskTypeId, @nodeId, @parentUserId, @userId, @comment)", - SqlHelper.CreateParameter("@closed", Closed), - SqlHelper.CreateParameter("@taskTypeId", Type.Id), - SqlHelper.CreateParameter("@nodeId", Node.Id), - SqlHelper.CreateParameter("@parentUserId", ParentUser.Id), - SqlHelper.CreateParameter("@userId", User.Id), - SqlHelper.CreateParameter("@comment", Comment)); - Id = SqlHelper.ExecuteScalar("SELECT MAX(id) FROM cmsTask"); - } - else - { - SqlHelper.ExecuteNonQuery( - "update cmsTask set closed = @closed, taskTypeId = @taskTypeId, nodeId = @nodeId, parentUserId = @parentUserId, userId = @userId, comment = @comment where id = @id", - SqlHelper.CreateParameter("@closed", Closed), - SqlHelper.CreateParameter("@taskTypeId", Type.Id), - SqlHelper.CreateParameter("@nodeId", Node.Id), - SqlHelper.CreateParameter("@parentUserId", ParentUser.Id), - SqlHelper.CreateParameter("@userId", User.Id), - SqlHelper.CreateParameter("@comment", Comment), - SqlHelper.CreateParameter("@id", Id)); - } + ApplicationContext.Current.Services.TaskService.Save(TaskEntity); } #endregion - #region Private methods - private void PopulateTaskFromReader(IRecordsReader dr) - { - _id = dr.GetInt("id"); - Type = new TaskType((int)dr.GetByte("taskTypeId")); - Node = new CMSNode(dr.GetInt("nodeId")); - ParentUser = User.GetUser(dr.GetInt("parentUserId")); - User = User.GetUser(dr.GetInt("userId")); - Date = dr.GetDateTime("DateTime"); - Comment = dr.GetString("comment"); - Closed = dr.GetBoolean("closed"); - } - #endregion - #region static methods /// @@ -238,19 +202,17 @@ namespace umbraco.cms.businesslogic.task /// public static Tasks GetTasksByType(int taskType) { - var sql = "select id, taskTypeId, nodeId, parentUserId, userId, DateTime, comment, closed from cmsTask where taskTypeId = @taskTypeId"; - Tasks tasks = new Tasks(); - using (IRecordsReader dr = SqlHelper.ExecuteReader(sql, SqlHelper.CreateParameter("@taskTypeId", taskType))) + var foundTaskType = ApplicationContext.Current.Services.TaskService.GetTaskTypeById(taskType); + if (foundTaskType == null) return null; + + var result = new Tasks(); + var tasks = ApplicationContext.Current.Services.TaskService.GetTasks(taskTypeAlias: foundTaskType.Alias); + foreach (var task in tasks) { - while (dr.Read()) - { - var t = new Task(); - t.PopulateTaskFromReader(dr); - tasks.Add(t); - } + result.Add(new Task(task)); } - return tasks; + return result; } /// @@ -260,19 +222,14 @@ namespace umbraco.cms.businesslogic.task /// public static Tasks GetTasks(int nodeId) { - var sql = "select id, taskTypeId, nodeId, parentUserId, userId, DateTime, comment, closed from cmsTask where nodeId = @nodeId"; - Tasks tasks = new Tasks(); - using (IRecordsReader dr = SqlHelper.ExecuteReader(sql, SqlHelper.CreateParameter("@nodeId", nodeId))) + var result = new Tasks(); + var tasks = ApplicationContext.Current.Services.TaskService.GetTasks(itemId:nodeId); + foreach (var task in tasks) { - while (dr.Read()) - { - var t = new Task(); - t.PopulateTaskFromReader(dr); - tasks.Add(t); - } + result.Add(new Task(task)); } - return tasks; + return result; } /// @@ -281,26 +238,16 @@ namespace umbraco.cms.businesslogic.task /// The User who have the tasks assigned /// If true both open and closed tasks will be returned /// A collections of tasks - public static Tasks GetTasks(User User, bool IncludeClosed) { - string sql = "select id, taskTypeId, nodeId, parentUserId, userId, DateTime, comment, closed from cmsTask where userId = @userId"; - if (!IncludeClosed) - sql += " and closed = 0"; - sql += " order by DateTime desc"; + public static Tasks GetTasks(User User, bool IncludeClosed) + { + var result = new Tasks(); + var tasks = ApplicationContext.Current.Services.TaskService.GetTasks(assignedUser:User.Id, includeClosed:IncludeClosed); + foreach (var task in tasks) + { + result.Add(new Task(task)); + } - Tasks tasks = new Tasks(); - using (IRecordsReader dr = SqlHelper.ExecuteReader( - sql, - SqlHelper.CreateParameter("@userId", User.Id))) - { - while (dr.Read()) - { - var t = new Task(); - t.PopulateTaskFromReader(dr); - tasks.Add(t); - } - } - - return tasks; + return result; } /// @@ -309,25 +256,15 @@ namespace umbraco.cms.businesslogic.task /// The User who have the tasks assigned /// If true both open and closed tasks will be returned /// A collections of tasks - public static Tasks GetOwnedTasks(User User, bool IncludeClosed) { - string sql = "select id, taskTypeId, nodeId, parentUserId, userId, DateTime, comment, closed from cmsTask where parentUserId = @userId"; - if (!IncludeClosed) - sql += " and closed = 0"; - sql += " order by DateTime desc"; - - Tasks tasks = new Tasks(); - using (IRecordsReader dr = SqlHelper.ExecuteReader( - sql, - SqlHelper.CreateParameter("@userId", User.Id))) { - while (dr.Read()) - { - var t = new Task(); - t.PopulateTaskFromReader(dr); - tasks.Add(t); - } + public static Tasks GetOwnedTasks(User User, bool IncludeClosed) + { + var result = new Tasks(); + var tasks = ApplicationContext.Current.Services.TaskService.GetTasks(ownerUser:User.Id, includeClosed: IncludeClosed); + foreach (var task in tasks) + { + result.Add(new Task(task)); } - - return tasks; + return result; } #endregion diff --git a/src/umbraco.cms/businesslogic/task/TaskType.cs b/src/umbraco.cms/businesslogic/task/TaskType.cs index 402c404968..ce21a2f85c 100644 --- a/src/umbraco.cms/businesslogic/task/TaskType.cs +++ b/src/umbraco.cms/businesslogic/task/TaskType.cs @@ -1,33 +1,34 @@ using System; using System.Collections.Generic; using System.Data; +using System.Linq; using System.Text; using System.Runtime.CompilerServices; using umbraco.BusinessLogic; +using Umbraco.Core; using umbraco.DataLayer; namespace umbraco.cms.businesslogic.task { + [Obsolete("Use Umbraco.Core.Service.ITaskService instead")] public class TaskType { - + internal Umbraco.Core.Models.TaskType TaskTypeEntity; #region Public Properties public int Id { - get { return _id; } - set { _id = value; } + get { return TaskTypeEntity.Id; } + set { TaskTypeEntity.Id = value; } } - private string _alias; - public string Alias { - get { return _alias; } - set { _alias = value; } + get { return TaskTypeEntity.Alias; } + set { TaskTypeEntity.Alias = value; } } /// @@ -38,11 +39,11 @@ namespace umbraco.cms.businesslogic.task get { //lazy load the tasks - if (m_Tasks == null) + if (_tasks == null) { - m_Tasks = Task.GetTasksByType(this.Id); + _tasks = Task.GetTasksByType(this.Id); } - return m_Tasks; + return _tasks; } } @@ -54,70 +55,40 @@ namespace umbraco.cms.businesslogic.task { get { return Application.SqlHelper; } } - private int _id; - private Tasks m_Tasks; + + private Tasks _tasks; #endregion #region Constructors + + internal TaskType(Umbraco.Core.Models.TaskType tt) + { + TaskTypeEntity = tt; + } + public TaskType() { } public TaskType(string TypeAlias) { - Id = SqlHelper.ExecuteScalar( - "select id from cmsTaskType where alias = @alias", - SqlHelper.CreateParameter("@alias", TypeAlias)); - setup(); + TaskTypeEntity = ApplicationContext.Current.Services.TaskService.GetTaskTypeByAlias(TypeAlias); + if (TaskTypeEntity == null) throw new NullReferenceException("No task type found by alias " + TypeAlias); } public TaskType(int TaskTypeId) { - Id = TaskTypeId; - setup(); + TaskTypeEntity = ApplicationContext.Current.Services.TaskService.GetTaskTypeById(TaskTypeId); + if (TaskTypeEntity == null) throw new NullReferenceException("No task type found by alias " + TaskTypeId); } - #endregion - - #region Private methods - private void setup() - { - using (IRecordsReader dr = - SqlHelper.ExecuteReader("select alias from cmsTaskType where id = @id", - SqlHelper.CreateParameter("@id", Id))) - { - if (dr.Read()) - { - _id = Id; - Alias = dr.GetString("alias"); - } - else - { - throw new ArgumentException("No Task type found for the id specified"); - } - } - } - #endregion + #endregion #region Public methods - [MethodImpl(MethodImplOptions.Synchronized)] public void Save() { - if (Id == 0) - { - // The method is synchronized - SqlHelper.ExecuteNonQuery("INSERT INTO cmsTaskType (alias) values (@alias)", - SqlHelper.CreateParameter("@alias", Alias)); - Id = SqlHelper.ExecuteScalar("SELECT MAX(id) FROM cmsTaskType"); - } - else - { - SqlHelper.ExecuteNonQuery( - "update cmsTaskType set alias = @alias where id = @id", - SqlHelper.CreateParameter("@alias", Alias), - SqlHelper.CreateParameter("@id", Id)); - } + ApplicationContext.Current.Services.TaskService.Save(TaskTypeEntity); } /// @@ -126,12 +97,7 @@ namespace umbraco.cms.businesslogic.task /// public void Delete() { - foreach (Task t in Tasks) - { - t.Delete(); - } - m_Tasks.Clear(); //remove the internal collection - SqlHelper.ExecuteNonQuery("DELETE FROM cmsTaskType WHERE id = @id", SqlHelper.CreateParameter("@id", this._id)); + ApplicationContext.Current.Services.TaskService.Delete(TaskTypeEntity); } #endregion @@ -143,16 +109,8 @@ namespace umbraco.cms.businesslogic.task /// public static IEnumerable GetAll() { - var sql = "SELECT id, alias FROM cmsTaskType"; - var types = new List(); - using (IRecordsReader dr = SqlHelper.ExecuteReader(sql)) - { - while (dr.Read()) - { - types.Add(new TaskType() { _alias = dr.GetString("alias"), _id = Convert.ToInt32(dr.Get("id")) }); - } - } - return types; + return ApplicationContext.Current.Services.TaskService.GetAllTaskTypes() + .Select(x => new TaskType(x)); } #endregion diff --git a/src/umbraco.cms/businesslogic/web/Document.cs b/src/umbraco.cms/businesslogic/web/Document.cs index 8083a4b288..abf5f9baa3 100644 --- a/src/umbraco.cms/businesslogic/web/Document.cs +++ b/src/umbraco.cms/businesslogic/web/Document.cs @@ -312,7 +312,6 @@ namespace umbraco.cms.businesslogic.web /// /// This method is thread safe /// - [MethodImpl(MethodImplOptions.Synchronized)] [Obsolete("Obsolete, Use Umbraco.Core.Services.ContentService.RePublishAll()", false)] public static void RePublishAll() { @@ -655,14 +654,12 @@ namespace umbraco.cms.businesslogic.web /// This method needs to be marked with [MethodImpl(MethodImplOptions.Synchronized)] /// because we execute multiple queries affecting the same data, if two thread are to do this at the same time for the same node we may have problems /// - [MethodImpl(MethodImplOptions.Synchronized)] [Obsolete("Obsolete, Use Umbraco.Core.Services.ContentService.Publish()", false)] public bool PublishWithResult(User u) { return PublishWithResult(u, true); } - [MethodImpl(MethodImplOptions.Synchronized)] [Obsolete("Obsolete, Use Umbraco.Core.Services.ContentService.Publish()", false)] internal bool PublishWithResult(User u, bool omitCacheRefresh) { diff --git a/src/umbraco.cms/businesslogic/web/Domain.cs b/src/umbraco.cms/businesslogic/web/Domain.cs index 8c3e630285..370d75b4db 100644 --- a/src/umbraco.cms/businesslogic/web/Domain.cs +++ b/src/umbraco.cms/businesslogic/web/Domain.cs @@ -2,17 +2,18 @@ using System; using System.Collections.Generic; using System.Data; using System.Linq; +using System.Runtime.InteropServices; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using umbraco.BusinessLogic; using umbraco.BusinessLogic.Actions; using umbraco.cms.businesslogic.cache; -using umbraco.cms.businesslogic.language; +using Umbraco.Core.Models; using umbraco.interfaces; using umbraco.DataLayer; using System.Runtime.CompilerServices; - +using Language = umbraco.cms.businesslogic.language.Language; namespace umbraco.cms.businesslogic.web @@ -20,96 +21,70 @@ namespace umbraco.cms.businesslogic.web /// /// Summary description for Domain. /// + [Obsolete("Use Umbraco.Core.Models.IDomain and Umbraco.Core.Services.IDomainService instead")] public class Domain { - private Language _language; - private string _name; - private int _root; - private int _id; - - private static ISqlHelper SqlHelper - { - get { return Application.SqlHelper; } - } - + public IDomain DomainEntity { get; set; } + /// /// Empty ctor used for unit tests to create a custom domain /// internal Domain() - { - + { } - public Domain(int Id) + internal Domain(IDomain domain) { - InitDomain(Id); + DomainEntity = domain; + } + + public Domain(int Id) + { + DomainEntity = ApplicationContext.Current.Services.DomainService.GetById(Id); + if (DomainEntity == null) + { + throw new Exception(string.Format("Domain name '{0}' does not exists", Id)); + } } public Domain(string DomainName) { - object result = SqlHelper.ExecuteScalar( - "select id from umbracoDomains where domainName = @DomainName", - SqlHelper.CreateParameter("@DomainName", DomainName)); - if (result == null || !(result is int)) - throw new Exception(string.Format("Domain name '{0}' does not exists", DomainName)); - InitDomain((int) result); - } - - private void InitDomain(int id) - { - using (IRecordsReader dr = SqlHelper.ExecuteReader( - "select domainDefaultLanguage, domainRootStructureID, domainName from umbracoDomains where id = @ID", - SqlHelper.CreateParameter("@ID", id))) + DomainEntity = ApplicationContext.Current.Services.DomainService.GetByName(DomainName); + if (DomainEntity == null) { - if (dr.Read()) - { - _id = id; - _language = new Language(dr.GetInt("domainDefaultLanguage")); - _name = dr.GetString("domainName"); - _root = dr.GetInt("domainRootStructureID"); - } + throw new Exception(string.Format("Domain name '{0}' does not exists", DomainName)); } } public string Name { - get { return _name; } - set - { - SqlHelper.ExecuteNonQuery("update umbracoDomains set domainName = @domainName where id = @id", - SqlHelper.CreateParameter("@domainName", value), - SqlHelper.CreateParameter("@id",_id)); - _name = value; - } + get { return DomainEntity.DomainName; } + set { DomainEntity.DomainName = value; } } public Language Language { - get { return _language; } - set - { - SqlHelper.ExecuteNonQuery("update umbracoDomains set domainDefaultLanguage = @language where id = @id", - SqlHelper.CreateParameter("@language", value.id), - SqlHelper.CreateParameter("@id", _id)); - _language = value; - } + get { return new Language(DomainEntity.Language); } + set { DomainEntity.Language = value.LanguageEntity; } } public int RootNodeId { - get { return _root; } + get { return DomainEntity.RootContent.Id; } set { - SqlHelper.ExecuteNonQuery(string.Format( - "update umbracoDomains set domainRootStructureID = '{0}' where id = {1}", - value, _id)); - _root = value; + var content = ApplicationContext.Current.Services.ContentService.GetById(value); + if (content == null) + { + throw new NullReferenceException("No content found with id " + value); + } + DomainEntity.RootContent = content; } } public int Id { - get { return _id; } + get { return DomainEntity.Id; } } public void Delete() @@ -117,9 +92,10 @@ namespace umbraco.cms.businesslogic.web var e = new DeleteEventArgs(); FireBeforeDelete(e); - if (!e.Cancel) + if (!e.Cancel) { - SqlHelper.ExecuteNonQuery(string.Format("delete from umbracoDomains where id = {0}", Id)); + ApplicationContext.Current.Services.DomainService.Delete(DomainEntity); + FireAfterDelete(e); } } @@ -129,8 +105,9 @@ namespace umbraco.cms.businesslogic.web FireBeforeSave(e); if (!e.Cancel) - { - //Add save method here at some point so this actually does something besides fire events... + { + ApplicationContext.Current.Services.DomainService.Save(DomainEntity); + FireAfterSave(e); } } @@ -145,80 +122,58 @@ namespace umbraco.cms.businesslogic.web public static IEnumerable GetDomains(bool includeWildcards) { - var domains = ApplicationContext.Current.ApplicationCache.GetCacheItem( - CacheKeys.DomainCacheKey, - TimeSpan.FromMinutes(30), - () => - { - var result = new List(); - using (var dr = SqlHelper.ExecuteReader("SELECT id, domainName FROM umbracoDomains ORDER BY id")) - { - while (dr.Read()) - { - var domainName = dr.GetString("domainName"); - var domainId = dr.GetInt("id"); - if (result.Find(d => d.Name == domainName) == null) - result.Add(new Domain(domainId)); - else - { - LogHelper.Warn(string.Format("Domain already exists in list ({0})", domainName)); - } - } - } - return result; - }); - - if (!includeWildcards) - domains = domains.Where(d => !d.IsWildcard).ToList(); - - return domains; + return ApplicationContext.Current.Services.DomainService.GetAll(includeWildcards) + .Select(x => new Domain(x)); } public static Domain GetDomain(string DomainName) { - return GetDomains().FirstOrDefault(d => d.Name.InvariantEquals(DomainName)); + var found = ApplicationContext.Current.Services.DomainService.GetByName(DomainName); + return found == null ? null : new Domain(found); } public static int GetRootFromDomain(string DomainName) { - Domain d = GetDomain(DomainName); - if (d == null) return -1; - return d._root; + var found = ApplicationContext.Current.Services.DomainService.GetByName(DomainName); + return found == null ? -1 : found.RootContent.Id; } public static Domain[] GetDomainsById(int nodeId) { - return GetDomains().Where(d => d._root == nodeId).ToArray(); + return ApplicationContext.Current.Services.DomainService.GetAssignedDomains(nodeId, true) + .Select(x => new Domain(x)) + .ToArray(); } public static Domain[] GetDomainsById(int nodeId, bool includeWildcards) { - return GetDomains(includeWildcards).Where(d => d._root == nodeId).ToArray(); + return ApplicationContext.Current.Services.DomainService.GetAssignedDomains(nodeId, includeWildcards) + .Select(x => new Domain(x)) + .ToArray(); } public static bool Exists(string DomainName) { - return GetDomain(DomainName) != null; + return ApplicationContext.Current.Services.DomainService.Exists(DomainName); } public static void MakeNew(string DomainName, int RootNodeId, int LanguageId) { - if (Exists(DomainName.ToLower())) - throw new Exception("Domain " + DomainName + " already exists!"); - - //need to check if the language exists first - if (Language.GetAllAsList().SingleOrDefault(x => x.id == LanguageId) == null) + var content = ApplicationContext.Current.Services.ContentService.GetById(RootNodeId); + if (content == null) throw new NullReferenceException("No content exists with id " + RootNodeId); + var lang = ApplicationContext.Current.Services.LocalizationService.GetLanguageById(LanguageId); + if (lang == null) throw new NullReferenceException("No language exists with id " + LanguageId); + + var domain = new UmbracoDomain(DomainName) { - throw new ArgumentException("No language exists for the LanguageId specified"); - } - - SqlHelper.ExecuteNonQuery("insert into umbracoDomains (domainDefaultLanguage, domainRootStructureID, domainName) values (@domainDefaultLanguage, @domainRootStructureID, @domainName)", - SqlHelper.CreateParameter("@domainDefaultLanguage", LanguageId), - SqlHelper.CreateParameter("@domainRootStructureID", RootNodeId), - SqlHelper.CreateParameter("@domainName", DomainName.ToLower())); + RootContent = content, + Language = lang + }; + ApplicationContext.Current.Services.DomainService.Save(domain); var e = new NewEventArgs(); - new Domain(DomainName).OnNew(e); + var legacyModel = new Domain(domain); + legacyModel.OnNew(e); } #endregion @@ -274,7 +229,7 @@ namespace umbraco.cms.businesslogic.web /// A value indicating whether the domain is a wildcard domain. public bool IsWildcard { - get { return string.IsNullOrWhiteSpace(Name) || Name.StartsWith("*"); } + get { return DomainEntity.IsWildcard; } } #endregion diff --git a/src/umbraco.cms/businesslogic/web/StyleSheet.cs b/src/umbraco.cms/businesslogic/web/StyleSheet.cs index 0edca155cb..5d4291bf3d 100644 --- a/src/umbraco.cms/businesslogic/web/StyleSheet.cs +++ b/src/umbraco.cms/businesslogic/web/StyleSheet.cs @@ -9,6 +9,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.IO; using umbraco.cms.businesslogic.cache; using Umbraco.Core.Models; +using Umbraco.Core.Services; using umbraco.DataLayer; using Umbraco.Core; using File = System.IO.File; @@ -21,7 +22,7 @@ namespace umbraco.cms.businesslogic.web [Obsolete("Use Umbraco.Core.Services.IFileService instead")] public class StyleSheet : CMSNode { - internal Stylesheet StylesheetItem; + internal Stylesheet StylesheetEntity; public static Guid ModuleObjectType = new Guid(Constants.ObjectTypes.Stylesheet); @@ -29,33 +30,33 @@ namespace umbraco.cms.businesslogic.web { get { - var path = StylesheetItem.Path; + var path = StylesheetEntity.Path; if (path.IsNullOrWhiteSpace()) return string.Empty; - return System.IO.Path.GetFileNameWithoutExtension(StylesheetItem.Path); + return System.IO.Path.GetFileNameWithoutExtension(StylesheetEntity.Path); } set { //setting the file name changing it's path - StylesheetItem.Path = StylesheetItem.Path.TrimEnd(StylesheetItem.Name) + value.EnsureEndsWith(".css"); + StylesheetEntity.Path = StylesheetEntity.Path.TrimEnd(StylesheetEntity.Name) + value.EnsureEndsWith(".css"); } } public string Content { - get { return StylesheetItem.Content; } - set { StylesheetItem.Content = value; } + get { return StylesheetEntity.Content; } + set { StylesheetEntity.Content = value; } } public StylesheetProperty[] Properties { - get { return StylesheetItem.Properties.Select(x => new StylesheetProperty(StylesheetItem, x)).ToArray(); } + get { return StylesheetEntity.Properties.Select(x => new StylesheetProperty(StylesheetEntity, x)).ToArray(); } } internal StyleSheet(Stylesheet stylesheet) : base(stylesheet) { if (stylesheet == null) throw new ArgumentNullException("stylesheet"); - StylesheetItem = stylesheet; + StylesheetEntity = stylesheet; } public StyleSheet(Guid id) @@ -100,8 +101,8 @@ namespace umbraco.cms.businesslogic.web /// The create date time. public override DateTime CreateDateTime { - get { return StylesheetItem.CreateDate; } - set { StylesheetItem.CreateDate = value; } + get { return StylesheetEntity.CreateDate; } + set { StylesheetEntity.CreateDate = value; } } /// @@ -122,7 +123,7 @@ namespace umbraco.cms.businesslogic.web FireBeforeSave(e); if (!e.Cancel) { - ApplicationContext.Current.Services.FileService.SaveStylesheet(StylesheetItem); + ApplicationContext.Current.Services.FileService.SaveStylesheet(StylesheetEntity); FireAfterSave(e); } @@ -192,7 +193,7 @@ namespace umbraco.cms.businesslogic.web if (!e.Cancel) { - ApplicationContext.Current.Services.FileService.DeleteStylesheet(StylesheetItem.Path); + ApplicationContext.Current.Services.FileService.DeleteStylesheet(StylesheetEntity.Path); FireAfterDelete(e); } @@ -201,31 +202,14 @@ namespace umbraco.cms.businesslogic.web public void saveCssToFile() { - ApplicationContext.Current.Services.FileService.SaveStylesheet(StylesheetItem); + ApplicationContext.Current.Services.FileService.SaveStylesheet(StylesheetEntity); } public XmlNode ToXml(XmlDocument xd) { - XmlNode doc = xd.CreateElement("Stylesheet"); - doc.AppendChild(xmlHelper.addTextNode(xd, "Name", this.Text)); - doc.AppendChild(xmlHelper.addTextNode(xd, "FileName", this.Filename)); - doc.AppendChild(xmlHelper.addCDataNode(xd, "Content", this.Content)); - - if (this.Properties.Length > 0) - { - XmlNode properties = xd.CreateElement("Properties"); - foreach (StylesheetProperty sp in this.Properties) - { - XmlElement prop = xd.CreateElement("Property"); - prop.AppendChild(xmlHelper.addTextNode(xd, "Name", sp.Text)); - prop.AppendChild(xmlHelper.addTextNode(xd, "Alias", sp.Alias)); - prop.AppendChild(xmlHelper.addTextNode(xd, "Value", sp.value)); - properties.AppendChild(prop); - } - doc.AppendChild(properties); - } - - return doc; + var serializer = new EntityXmlSerializer(); + var xml = serializer.Serialize(StylesheetEntity); + return xml.GetXmlNode(xd); } public static StyleSheet GetStyleSheet(int id, bool setupStyleProperties, bool loadContentFromFile) diff --git a/src/umbraco.cms/businesslogic/web/StylesheetProperty.cs b/src/umbraco.cms/businesslogic/web/StylesheetProperty.cs index e3d68ccc62..4d530bd9ed 100644 --- a/src/umbraco.cms/businesslogic/web/StylesheetProperty.cs +++ b/src/umbraco.cms/businesslogic/web/StylesheetProperty.cs @@ -88,10 +88,10 @@ namespace umbraco.cms.businesslogic.web { //we need to create it with a temp place holder! var prop = new Umbraco.Core.Models.StylesheetProperty(Text, "#" + Text.ToSafeAlias(), ""); - sheet.StylesheetItem.AddProperty(prop); - ApplicationContext.Current.Services.FileService.SaveStylesheet(sheet.StylesheetItem); + sheet.StylesheetEntity.AddProperty(prop); + ApplicationContext.Current.Services.FileService.SaveStylesheet(sheet.StylesheetEntity); - var ssp = new StylesheetProperty(sheet.StylesheetItem, prop); + var ssp = new StylesheetProperty(sheet.StylesheetEntity, prop); var e = new NewEventArgs(); ssp.OnNew(e); return ssp;