diff --git a/src/Umbraco.Core/Configuration/InfrastructureSettings/Infrastructure.cs b/src/Umbraco.Core/Configuration/InfrastructureSettings/Infrastructure.cs new file mode 100644 index 0000000000..8a8f4454bc --- /dev/null +++ b/src/Umbraco.Core/Configuration/InfrastructureSettings/Infrastructure.cs @@ -0,0 +1,190 @@ +using System.Configuration; + +namespace Umbraco.Core.Configuration.InfrastructureSettings +{ + public class Infrastructure : ConfigurationSection + { + private const string InfrastructureSectionName = "umbraco/infrastructure"; + + public static Infrastructure Instance + { + get { return (Infrastructure) ConfigurationManager.GetSection(InfrastructureSectionName); } + } + + #region RepositoriesSection Property + + internal const string RepositoriesPropertyName = "repositories"; + + [ConfigurationProperty(RepositoriesPropertyName, IsRequired = true, IsKey = false, IsDefaultCollection = false)] + public Repositories Repositories + { + get { return ((Repositories)base[RepositoriesPropertyName]); } + set { base[RepositoriesPropertyName] = value; } + } + + #endregion + + #region PublishingStrategy Property + + internal const string PublishingStrategyPropertyName = "publishingStrategy"; + + [ConfigurationProperty(PublishingStrategyPropertyName, IsRequired = true, IsKey = false, IsDefaultCollection = false)] + public PublishingProvider PublishingStrategy + { + get { return ((PublishingProvider)base[PublishingStrategyPropertyName]); } + set { base[PublishingStrategyPropertyName] = value; } + } + + #endregion + } + + public class Repositories : ConfigurationElement + { + [ConfigurationProperty("", IsDefaultCollection = true, IsRequired = true)] + public RepositoryElementCollection Repository + { + get { return ((RepositoryElementCollection)(base[""])); } + } + } + + [ConfigurationCollection(typeof(Repository), CollectionType = ConfigurationElementCollectionType.BasicMapAlternate, AddItemName = RepositoryPropertyName)] + public class RepositoryElementCollection : ConfigurationElementCollection + { + internal const string RepositoryPropertyName = "repository"; + + public override ConfigurationElementCollectionType CollectionType + { + get + { + return ConfigurationElementCollectionType.BasicMapAlternate; + } + } + + protected override string ElementName + { + get + { + return RepositoryPropertyName; + } + } + + protected override bool IsElementName(string elementName) + { + return elementName == RepositoryPropertyName; + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((Repository)element).InterfaceShortTypeName; + } + + protected override ConfigurationElement CreateNewElement() + { + return new Repository(); + } + + #region Indexer + + public Repository this[int index] + { + get { return (Repository)base.BaseGet(index); } + } + + public Repository this[string interfaceShortTypeName] + { + get { return (Repository)base.BaseGet(interfaceShortTypeName); } + } + + #endregion + + #region Add + + public void Add(Repository repository) + { + BaseAdd(repository); + } + + #endregion + + #region Remove + + public void Remove(Repository repository) + { + BaseRemove(repository); + } + + #endregion + + #region GetItem + + public Repository GetItemAt(int index) + { + return (Repository)BaseGet(index); + } + + public Repository GetItemByKey(string interfaceShortTypeName) + { + return (Repository)BaseGet(interfaceShortTypeName); + } + + #endregion + + public bool ContainsKey(string interfaceShortName) + { + bool result = false; + object[] keys = this.BaseGetAllKeys(); + foreach (object key in keys) + { + if ((string)key == interfaceShortName) + { + result = true; + break; + + } + } + return result; + } + } + + public class Repository : ConfigurationElement + { + internal const string InterfaceShortTypeNamePropertyName = "interfaceShortTypeName"; + + [ConfigurationPropertyAttribute(InterfaceShortTypeNamePropertyName, IsRequired = true, IsKey = true, IsDefaultCollection = false)] + public string InterfaceShortTypeName + { + get { return (string) base[InterfaceShortTypeNamePropertyName]; } + set { base[InterfaceShortTypeNamePropertyName] = value; } + } + + internal const string RepositoryFullTypeNamePropertyName = "repositoryFullTypeName"; + + [ConfigurationPropertyAttribute(RepositoryFullTypeNamePropertyName, IsRequired = true, IsKey = false, IsDefaultCollection = false)] + public string RepositoryFullTypeName + { + get { return (string)base[RepositoryFullTypeNamePropertyName]; } + set { base[RepositoryFullTypeNamePropertyName] = value; } + } + + internal const string CacheProviderFullTypeNamePropertyName = "cacheProviderFullTypeName"; + + [ConfigurationPropertyAttribute(CacheProviderFullTypeNamePropertyName, IsRequired = true, IsKey = false, IsDefaultCollection = false)] + public string CacheProviderFullTypeName + { + get { return (string)base[CacheProviderFullTypeNamePropertyName]; } + set { base[CacheProviderFullTypeNamePropertyName] = value; } + } + } + + public class PublishingProvider : ConfigurationElement + { + internal const string TypePropertyName = "type"; + + [ConfigurationPropertyAttribute(TypePropertyName, IsRequired = true, IsKey = false, IsDefaultCollection = false)] + public string Type + { + get { return (string)base[TypePropertyName]; } + set { base[TypePropertyName] = value; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Repositories/RepositoryConfigurationSection.cs b/src/Umbraco.Core/Configuration/Repositories/RepositoryConfigurationSection.cs deleted file mode 100644 index 1902e87ae7..0000000000 --- a/src/Umbraco.Core/Configuration/Repositories/RepositoryConfigurationSection.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using System.Configuration; - -namespace Umbraco.Core.Configuration.Repositories -{ - internal class RepositoryConfigurationSection : ConfigurationSection - { - [ConfigurationProperty("repositories", IsDefaultCollection = false)] - [ConfigurationCollection(typeof(RepositoryCollection), - AddItemName = "add", - ClearItemsName = "clear", - RemoveItemName = "remove")] - public RepositoryCollection Repositories - { - get - { - return (RepositoryCollection)base["repositories"]; - } - } - } - - internal class RepositoryCollection : ConfigurationElementCollection - { - public RepositoryCollection() - { - Console.WriteLine("RepositoryCollection Constructor"); - } - - public RepositoryElement this[int index] - { - get { return (RepositoryElement)BaseGet(index); } - set - { - if (BaseGet(index) != null) - { - BaseRemoveAt(index); - } - BaseAdd(index, value); - } - } - - public void Add(RepositoryElement repositoryElement) - { - BaseAdd(repositoryElement); - } - - public void Clear() - { - BaseClear(); - } - - protected override ConfigurationElement CreateNewElement() - { - return new RepositoryElement(); - } - - protected override object GetElementKey(ConfigurationElement element) - { - return ((RepositoryElement)element).Name; - } - - public void Remove(RepositoryElement repositoryElement) - { - BaseRemove(repositoryElement.Name); - } - - public void RemoveAt(int index) - { - BaseRemoveAt(index); - } - - public void Remove(string name) - { - BaseRemove(name); - } - } - - internal class RepositoryElement : ConfigurationElement - { - private const string NameKey = "name"; - private const string ModelTypeKey = "modelType"; - private const string RepositoryTypeKey = "repositoryType"; - - public RepositoryElement() { } - - public RepositoryElement(string name, string modelType, string repositoryType) - { - Name = name; - ModelType = modelType; - RepositoryType = repositoryType; - } - - [ConfigurationProperty(NameKey, IsRequired = true, IsKey = true)] - public string Name - { - get { return (string)this[NameKey]; } - - set { this[NameKey] = value; } - } - - [ConfigurationProperty(ModelTypeKey, IsRequired = true, IsKey = false)] - public string ModelType - { - get { return (string)this[ModelTypeKey]; } - - set { this[ModelTypeKey] = value; } - } - - [ConfigurationProperty(RepositoryTypeKey, IsRequired = true, IsKey = false)] - public string RepositoryType - { - get { return (string)this[RepositoryTypeKey]; } - - set { this[RepositoryTypeKey] = value; } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingCollection.cs b/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingCollection.cs deleted file mode 100644 index e612444fa1..0000000000 --- a/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingCollection.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Configuration; - -namespace Umbraco.Core.Configuration.Repositories -{ - internal sealed class RepositoryMappingCollection : ConfigurationElementCollection - { - protected override ConfigurationElement CreateNewElement() - { - return new RepositoryMappingElement(); - } - - protected override object GetElementKey(ConfigurationElement element) - { - return ((RepositoryMappingElement)element).InterfaceShortTypeName; - } - - public override ConfigurationElementCollectionType CollectionType - { - get { return ConfigurationElementCollectionType.BasicMap; } - } - - protected override string ElementName - { - get { return RepositoryMappingConstants.ConfigurationElementName; } - } - - public RepositoryMappingElement this[int index] - { - get { return (RepositoryMappingElement)this.BaseGet(index); } - set - { - if (this.BaseGet(index) != null) - { - this.BaseRemoveAt(index); - } - this.BaseAdd(index, value); - } - } - - public new RepositoryMappingElement this[string interfaceShortTypeName] - { - get { return (RepositoryMappingElement)this.BaseGet(interfaceShortTypeName); } - } - - public bool ContainsKey(string keyName) - { - bool result = false; - object[] keys = this.BaseGetAllKeys(); - foreach (object key in keys) - { - if ((string)key == keyName) - { - result = true; - break; - - } - } - return result; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingConstants.cs b/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingConstants.cs deleted file mode 100644 index f9b602e1f3..0000000000 --- a/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingConstants.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Umbraco.Core.Configuration.Repositories -{ - internal static class RepositoryMappingConstants - { - internal const string CacheProviderFullTypeNameAttributeName = "cacheProviderFullTypeName"; - internal const string ConfigurationPropertyName = "repositoryMappings"; - internal const string ConfigurationElementName = "repositoryMapping"; - internal const string InterfaceShortTypeNameAttributeName = "interfaceShortTypeName"; - internal const string RepositoryFullTypeNameAttributeName = "repositoryFullTypeName"; - internal const string RepositoryMappingsConfigurationSectionName = "repositoryMappingsConfiguration"; - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingElement.cs b/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingElement.cs deleted file mode 100644 index c126ec501e..0000000000 --- a/src/Umbraco.Core/Configuration/Repositories/RepositoryMappingElement.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Configuration; - -namespace Umbraco.Core.Configuration.Repositories -{ - internal sealed class RepositoryMappingElement : ConfigurationElement - { - [ConfigurationProperty(RepositoryMappingConstants.InterfaceShortTypeNameAttributeName, - IsKey = true, IsRequired = true)] - public string InterfaceShortTypeName - { - get - { - return (string)this[RepositoryMappingConstants.InterfaceShortTypeNameAttributeName]; - } - set - { - this[RepositoryMappingConstants.InterfaceShortTypeNameAttributeName] = value; - } - } - - [ConfigurationProperty(RepositoryMappingConstants.RepositoryFullTypeNameAttributeName, - IsRequired = true)] - public string RepositoryFullTypeName - { - get - { - return (string)this[RepositoryMappingConstants.RepositoryFullTypeNameAttributeName]; - } - set - { - this[RepositoryMappingConstants.RepositoryFullTypeNameAttributeName] = value; - } - } - - [ConfigurationProperty(RepositoryMappingConstants.CacheProviderFullTypeNameAttributeName, - IsRequired = true)] - public string CacheProviderFullTypeName - { - get - { - return (string)this[RepositoryMappingConstants.CacheProviderFullTypeNameAttributeName]; - } - set - { - this[RepositoryMappingConstants.CacheProviderFullTypeNameAttributeName] = value; - } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Repositories/RepositorySettings.cs b/src/Umbraco.Core/Configuration/Repositories/RepositorySettings.cs deleted file mode 100644 index 5f97d993b6..0000000000 --- a/src/Umbraco.Core/Configuration/Repositories/RepositorySettings.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Configuration; - -namespace Umbraco.Core.Configuration.Repositories -{ - internal class RepositorySettings : ConfigurationSection - { - [ConfigurationProperty(RepositoryMappingConstants.ConfigurationPropertyName, - IsDefaultCollection = true)] - public RepositoryMappingCollection RepositoryMappings - { - get { return (RepositoryMappingCollection)base[RepositoryMappingConstants.ConfigurationPropertyName]; } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Css/LineReader.cs b/src/Umbraco.Core/Models/Css/LineReader.cs index af2fa2dab0..eef5f7ba62 100644 --- a/src/Umbraco.Core/Models/Css/LineReader.cs +++ b/src/Umbraco.Core/Models/Css/LineReader.cs @@ -45,14 +45,15 @@ namespace Umbraco.Core.Models.Css if (this.source == null) { - if (System.IO.File.Exists(filePath)) + this.source = filePath;//Changed to direct content string instead of file. + /*if (System.IO.File.Exists(filePath)) { this.source = System.IO.File.ReadAllText(filePath); } else { throw new FileError("File not found", filePath, 0, 0); - } + }*/ } } diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs index 8b46a1ec14..34f844a5b3 100644 --- a/src/Umbraco.Core/Models/File.cs +++ b/src/Umbraco.Core/Models/File.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Runtime.Serialization; +using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models { @@ -9,11 +10,8 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public abstract class File : IFile + public abstract class File : Entity, IFile { - private string _name; - private string _alias; - protected File(string path) { Path = path; @@ -27,13 +25,8 @@ namespace Umbraco.Core.Models { get { - if (!string.IsNullOrEmpty(_name)) - return _name; - - _name = new FileInfo(Path).Name; - return _name; + return new FileInfo(Path).Name; } - set { _name = value; } } /// @@ -44,16 +37,11 @@ namespace Umbraco.Core.Models { get { - if (!string.IsNullOrEmpty(_alias)) - return _alias; - var fileInfo = new FileInfo(Path); var name = fileInfo.Name; - int lastIndexOf = name.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase) + 1; - _alias = name.Substring(0, lastIndexOf); - return _alias; + int lastIndexOf = name.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase); + return name.Substring(0, lastIndexOf); } - set { _alias = value; } } /// diff --git a/src/Umbraco.Core/Models/IFile.cs b/src/Umbraco.Core/Models/IFile.cs index 25a51069f1..25415328e8 100644 --- a/src/Umbraco.Core/Models/IFile.cs +++ b/src/Umbraco.Core/Models/IFile.cs @@ -9,14 +9,14 @@ namespace Umbraco.Core.Models public interface IFile : IValueObject { /// - /// Gets or sets the Name of the File including extension + /// Gets the Name of the File including extension /// - string Name { get; set; } + string Name { get; } /// - /// Gets or sets the Alias of the File, which is the name without the extension + /// Gets the Alias of the File, which is the name without the extension /// - string Alias { get; set; } + string Alias { get; } /// /// Gets or sets the Path to the File from the root of the site diff --git a/src/Umbraco.Core/Models/Stylesheet.cs b/src/Umbraco.Core/Models/Stylesheet.cs index f8d82e6ae7..3652f01a1f 100644 --- a/src/Umbraco.Core/Models/Stylesheet.cs +++ b/src/Umbraco.Core/Models/Stylesheet.cs @@ -29,18 +29,19 @@ namespace Umbraco.Core.Models get { var properties = new List(); - var parser = new CssParser(Path);//TODO change CssParser so we can use Content instead of Path + var parser = new CssParser(Content); //TODO Need to explorer how the Stylesheet should be iterated to generate a list of css properties - foreach (CssAtRule statement in parser.StyleSheet.Statements) + foreach (CssAtRule statement in parser.StyleSheet.Statements.Where(s => s is CssAtRule)) { properties.Add(new StylesheetProperty(statement.Value, "")); } - foreach (CssRuleSet statement in parser.StyleSheet.Statements) + foreach (CssRuleSet statement in parser.StyleSheet.Statements.Where(s => s is CssRuleSet)) { var selector = statement.Selectors.First(); - properties.Add(new StylesheetProperty(selector.Value, "")); + var declaration = statement.Declarations.FirstOrDefault(); + properties.Add(new StylesheetProperty(selector.Value, declaration.ToString())); } return properties; diff --git a/src/Umbraco.Core/Models/Task.cs b/src/Umbraco.Core/Models/Task.cs new file mode 100644 index 0000000000..88a86dcb44 --- /dev/null +++ b/src/Umbraco.Core/Models/Task.cs @@ -0,0 +1,118 @@ +using System; +using System.Reflection; +using System.Runtime.Serialization; +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models +{ + /// + /// Represents a Task + /// + [Serializable] + [DataContract(IsReference = true)] + public class Task : Entity, IAggregateRoot + { + private bool _closed; + private TaskType _taskType; + private int _entityId; + private int _ownerUserId; + private int _assigneeUserId; + private string _comment; + + public Task(TaskType taskType) + { + _taskType = taskType; + } + + private static readonly PropertyInfo ClosedSelector = ExpressionHelper.GetPropertyInfo(x => x.Closed); + private static readonly PropertyInfo TaskTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.TaskType); + private static readonly PropertyInfo EntityIdSelector = ExpressionHelper.GetPropertyInfo(x => x.EntityId); + private static readonly PropertyInfo OwnerUserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.OwnerUserId); + private static readonly PropertyInfo AssigneeUserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.AssigneeUserId); + private static readonly PropertyInfo CommentSelector = ExpressionHelper.GetPropertyInfo(x => x.Comment); + + /// + /// Gets or sets a boolean indicating whether the task is closed + /// + [DataMember] + public bool Closed + { + get { return _closed; } + set + { + _closed = value; + OnPropertyChanged(ClosedSelector); + } + } + + /// + /// Gets or sets the TaskType of the Task + /// + [DataMember] + public TaskType TaskType + { + get { return _taskType; } + set + { + _taskType = value; + OnPropertyChanged(TaskTypeSelector); + } + } + + /// + /// Gets or sets the Id of the entity, which this task is associated to + /// + [DataMember] + public int EntityId + { + get { return _entityId; } + set + { + _entityId = value; + OnPropertyChanged(EntityIdSelector); + } + } + + /// + /// Gets or sets the Id of the user, who owns this task + /// + [DataMember] + public int OwnerUserId + { + get { return _ownerUserId; } + set + { + _ownerUserId = value; + OnPropertyChanged(OwnerUserIdSelector); + } + } + + /// + /// Gets or sets the Id of the user, who is assigned to this task + /// + [DataMember] + public int AssigneeUserId + { + get { return _assigneeUserId; } + set + { + _assigneeUserId = value; + OnPropertyChanged(AssigneeUserIdSelector); + } + } + + /// + /// Gets or sets the Comment for the Task + /// + [DataMember] + public string Comment + { + get { return _comment; } + set + { + _comment = value; + OnPropertyChanged(CommentSelector); + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/TaskType.cs b/src/Umbraco.Core/Models/TaskType.cs new file mode 100644 index 0000000000..4789683292 --- /dev/null +++ b/src/Umbraco.Core/Models/TaskType.cs @@ -0,0 +1,38 @@ +using System; +using System.Reflection; +using System.Runtime.Serialization; +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models +{ + /// + /// Represents a Task Type + /// + [Serializable] + [DataContract(IsReference = true)] + public class TaskType : Entity, IAggregateRoot + { + private string _alias; + + public TaskType(string @alias) + { + _alias = alias; + } + + private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + + /// + /// Gets or sets the Alias of the TaskType + /// + [DataMember] + public string Alias + { + get { return _alias; } + set + { + _alias = value; + OnPropertyChanged(AliasSelector); + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index 9fad384494..68e53a3244 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -19,6 +19,18 @@ namespace Umbraco.Core.Models base.Path = path; } + /// + /// Returns the that corresponds to the template file + /// + /// + public RenderingEngine GetTypeOfRenderingEngine() + { + if(Path.EndsWith("cshtml") || Path.EndsWith("vbhtml")) + return RenderingEngine.Mvc; + + return RenderingEngine.WebForms; + } + /// /// Boolean indicating whether the file could be validated /// diff --git a/src/Umbraco.Core/Persistence/Caching/InMemoryCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/InMemoryCacheProvider.cs index b474ebf62c..799c35f2c2 100644 --- a/src/Umbraco.Core/Persistence/Caching/InMemoryCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/InMemoryCacheProvider.cs @@ -2,7 +2,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Threading; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Persistence.Caching diff --git a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs index 21762f4cd4..d738cc73a9 100644 --- a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs @@ -2,7 +2,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Runtime.Caching; -using System.Threading; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Persistence.Caching diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs index 51add6ed09..d5fcaa095c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs @@ -19,7 +19,8 @@ namespace Umbraco.Core.Persistence.Repositories { } - public ContentTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public ContentTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) + : base(work, cache) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs index 2785285d81..baafb40e71 100644 --- a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs @@ -20,7 +20,8 @@ namespace Umbraco.Core.Persistence.Repositories { } - public DataTypeDefinitionRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public DataTypeDefinitionRepository(IUnitOfWork work, IRepositoryCacheProvider cache) + : base(work, cache) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs index 59f80d6cda..12216857cb 100644 --- a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs @@ -16,7 +16,8 @@ namespace Umbraco.Core.Persistence.Repositories { } - public LanguageRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public LanguageRepository(IUnitOfWork work, IRepositoryCacheProvider cache) + : base(work, cache) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs index 85e630f348..54be2f4b64 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs @@ -24,7 +24,8 @@ namespace Umbraco.Core.Persistence.Repositories EnsureDependencies(); } - public MacroRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public MacroRepository(IUnitOfWork work, IRepositoryCacheProvider cache) + : base(work, cache) { EnsureDependencies(); } diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs index 72dc6b2b8c..123b9b6fd1 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs @@ -19,7 +19,8 @@ namespace Umbraco.Core.Persistence.Repositories { } - public MediaTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public MediaTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) + : base(work, cache) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs index ed258bfd2d..1ba68236be 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs @@ -19,7 +19,8 @@ namespace Umbraco.Core.Persistence.Repositories { } - public RelationTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public RelationTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) + : base(work, cache) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs index aa8639b074..f4c9a7d9f3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using Umbraco.Core.IO; @@ -34,8 +35,17 @@ namespace Umbraco.Core.Persistence.Repositories var content = Encoding.UTF8.GetString(bytes); var path = FileSystem.GetRelativePath(id); + var created = FileSystem.GetCreated(path).UtcDateTime; + var updated = FileSystem.GetLastModified(path).UtcDateTime; + var name = new FileInfo(path).Name; - var script = new Script(path) {Content = content}; + var script = new Script(path) + { + Content = content, + Key = name.EncodeAsGuid(), + CreateDate = created, + UpdateDate = updated + }; return script; } diff --git a/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs index 63100770f2..5aa5184702 100644 --- a/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using Umbraco.Core.IO; @@ -34,8 +35,17 @@ namespace Umbraco.Core.Persistence.Repositories var content = Encoding.UTF8.GetString(bytes); var path = FileSystem.GetRelativePath(id); + var created = FileSystem.GetCreated(path).UtcDateTime; + var updated = FileSystem.GetLastModified(path).UtcDateTime; + var name = new FileInfo(path).Name; - var stylesheet = new Stylesheet(path) { Content = content }; + var stylesheet = new Stylesheet(path) + { + Content = content, + Key = name.EncodeAsGuid(), + CreateDate = created, + UpdateDate = updated + }; return stylesheet; } diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 9cbbd89756..54b92fb611 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -70,6 +70,9 @@ namespace Umbraco.Core.Persistence.Repositories string content = string.Empty; string path = string.Empty; + DateTime created = new DateTime(); + DateTime updated = new DateTime(); + string name = string.Empty; if(FileSystem.FileExists(id)) { @@ -80,6 +83,9 @@ namespace Umbraco.Core.Persistence.Repositories content = Encoding.UTF8.GetString(bytes); path = FileSystem.GetRelativePath(id); + created = FileSystem.GetCreated(path).UtcDateTime; + updated = FileSystem.GetLastModified(path).UtcDateTime; + name = new FileInfo(path).Name; } else { @@ -90,9 +96,18 @@ namespace Umbraco.Core.Persistence.Repositories content = Encoding.UTF8.GetString(bytes); path = _viewsFileSystem.GetRelativePath(id); + created = FileSystem.GetCreated(path).UtcDateTime; + updated = FileSystem.GetLastModified(path).UtcDateTime; + name = new FileInfo(path).Name; } - var template = new Template(path) { Content = content }; + var template = new Template(path) + { + Content = content, + Key = name.EncodeAsGuid(), + CreateDate = created, + UpdateDate = updated + }; return template; } diff --git a/src/Umbraco.Core/Persistence/RepositoryResolver.cs b/src/Umbraco.Core/Persistence/RepositoryResolver.cs index d2b21f8ab6..0d8f569ae3 100644 --- a/src/Umbraco.Core/Persistence/RepositoryResolver.cs +++ b/src/Umbraco.Core/Persistence/RepositoryResolver.cs @@ -3,7 +3,9 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Configuration; using System.Linq; -using Umbraco.Core.Configuration.Repositories; +using System.Reflection; +using Umbraco.Core.Configuration.InfrastructureSettings; +using Umbraco.Core.Persistence.Caching; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -41,25 +43,23 @@ namespace Umbraco.Core.Persistence } return repository; } - - var settings = - (RepositorySettings) - ConfigurationManager.GetSection(RepositoryMappingConstants.RepositoryMappingsConfigurationSectionName); + + var settings = Infrastructure.Instance.Repositories; Type repositoryType = null; //Check if a valid interfaceShortName was passed in - if (settings.RepositoryMappings.ContainsKey(interfaceShortName)) + if (settings.Repository.ContainsKey(interfaceShortName)) { - repositoryType = Type.GetType(settings.RepositoryMappings[interfaceShortName].RepositoryFullTypeName); + repositoryType = Type.GetType(settings.Repository[interfaceShortName].RepositoryFullTypeName); } else { - foreach (RepositoryMappingElement element in settings.RepositoryMappings) + foreach (Repository element in settings.Repository) { if (element.InterfaceShortTypeName.Contains(entityTypeName)) { - repositoryType = Type.GetType(settings.RepositoryMappings[element.InterfaceShortTypeName].RepositoryFullTypeName); + repositoryType = Type.GetType(settings.Repository[element.InterfaceShortTypeName].RepositoryFullTypeName); break; } } @@ -73,7 +73,7 @@ namespace Umbraco.Core.Persistence } //Resolve the repository with its constructor dependencies - repository = Resolve(repositoryType, unitOfWork) as TRepository; + repository = Resolve(repositoryType, unitOfWork, interfaceShortName) as TRepository; //Add the new repository instance to the cache Repositories.AddOrUpdate(interfaceShortName, repository, (x, y) => repository); @@ -82,16 +82,17 @@ namespace Umbraco.Core.Persistence } //Recursive create and dependency check - private static object Resolve(Type repositoryType, IUnitOfWork unitOfWork) + private static object Resolve(Type repositoryType, IUnitOfWork unitOfWork, string interfaceShortName) { - var constructor = repositoryType.GetConstructors().SingleOrDefault(); + var constructors = repositoryType.GetConstructors(); + var constructor = constructors.LastOrDefault(); if (constructor == null) { throw new Exception(string.Format("No public constructor was found on {0}", repositoryType.FullName)); } var constructorArgs = new List(); - var settings = (RepositorySettings)ConfigurationManager.GetSection(RepositoryMappingConstants.RepositoryMappingsConfigurationSectionName); + var settings = Infrastructure.Instance.Repositories; var parameters = constructor.GetParameters(); foreach (var parameter in parameters) @@ -105,13 +106,26 @@ namespace Umbraco.Core.Persistence var repo = Repositories[parameter.ParameterType.Name]; constructorArgs.Add(repo); } + else if(parameter.ParameterType.Name.Equals(typeof(IRepositoryCacheProvider).Name)) + { + //Get the Type of the cache provider and activate the singleton instance + var cacheType = Type.GetType(settings.Repository[interfaceShortName].CacheProviderFullTypeName); + if (cacheType == null) + throw new Exception(string.Format("Unable to get the type of cache provider '{0}' from configuration while creating an instance of {1}", + settings.Repository[parameter.ParameterType.Name]. + CacheProviderFullTypeName, + parameter.ParameterType.Name)); + + var cacheProvider = cacheType.InvokeMember("Current", BindingFlags.GetProperty, null, cacheType, new object[0]); + constructorArgs.Add(cacheProvider); + } else { - if (settings.RepositoryMappings.ContainsKey(parameter.ParameterType.Name)) + if (settings.Repository.ContainsKey(parameter.ParameterType.Name)) { //Get the Type of the repository and resolve the object - var repoType = Type.GetType(settings.RepositoryMappings[parameter.ParameterType.Name].RepositoryFullTypeName); - var repo = Resolve(repoType, unitOfWork); + var repoType = Type.GetType(settings.Repository[parameter.ParameterType.Name].RepositoryFullTypeName); + var repo = Resolve(repoType, unitOfWork, parameter.ParameterType.Name); // Add the new repository instance to the cache Repositories.AddOrUpdate(parameter.ParameterType.Name, repo, (x, y) => repo); @@ -121,11 +135,17 @@ namespace Umbraco.Core.Persistence } else { - throw new Exception("Cannot create the Repository. There was one or more invalid repositoryMapping configuration settings."); + throw new Exception("Cannot create the Repository. There was one or more invalid repository configuration settings."); } } } + if (parameters.Count() != constructorArgs.Count) + throw new Exception( + string.Format( + "The amount of expected parameters is different from the amount of constructed parameters, which is confusing! Repository of type '{0}' could not be created.", + repositoryType.FullName)); + var repositoryObj = Activator.CreateInstance(repositoryType, constructorArgs.ToArray()); return repositoryObj; } @@ -135,16 +155,14 @@ namespace Umbraco.Core.Persistence /// internal static void RegisterRepositories() { - var settings = - (RepositorySettings) - ConfigurationManager.GetSection(RepositoryMappingConstants.RepositoryMappingsConfigurationSectionName); + var settings = Infrastructure.Instance.Repositories; - foreach (RepositoryMappingElement element in settings.RepositoryMappings) + foreach (Repository element in settings.Repository) { if (Repositories.ContainsKey(element.InterfaceShortTypeName)) continue; - var repositoryType = Type.GetType(settings.RepositoryMappings[element.InterfaceShortTypeName].RepositoryFullTypeName); - var repository = Resolve(repositoryType, null); + var repositoryType = Type.GetType(settings.Repository[element.InterfaceShortTypeName].RepositoryFullTypeName); + var repository = Resolve(repositoryType, null, element.InterfaceShortTypeName); //Add the new repository instance to the cache Repositories.AddOrUpdate(element.InterfaceShortTypeName, repository, (x, y) => repository); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index f1b0a6fe0f..098013e774 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -64,11 +64,7 @@ - - - - - + @@ -101,6 +97,8 @@ + + diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config index 5231460cde..b9a1f1b86c 100644 --- a/src/Umbraco.Tests/App.config +++ b/src/Umbraco.Tests/App.config @@ -2,6 +2,9 @@
+ +
+ @@ -11,17 +14,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + - - - + diff --git a/src/Umbraco.Tests/Configurations/FileSystemProviderTests.cs b/src/Umbraco.Tests/Configurations/FileSystemProviderTests.cs new file mode 100644 index 0000000000..e0bf108e6f --- /dev/null +++ b/src/Umbraco.Tests/Configurations/FileSystemProviderTests.cs @@ -0,0 +1,21 @@ +using System.Configuration; +using System.Linq; +using NUnit.Framework; +using Umbraco.Core.Configuration; + +namespace Umbraco.Tests.Configurations +{ + [TestFixture] + public class FileSystemProviderTests + { + [Test] + public void Can_Get_Media_Provider() + { + var config = (FileSystemProvidersSection)ConfigurationManager.GetSection("FileSystemProviders"); + var providerConfig = config.Providers["media"]; + + Assert.That(providerConfig, Is.Not.Null); + Assert.That(providerConfig.Parameters.AllKeys.Any(), Is.True); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Configurations/RepositorySettingsTests.cs b/src/Umbraco.Tests/Configurations/RepositorySettingsTests.cs new file mode 100644 index 0000000000..c25bd853b5 --- /dev/null +++ b/src/Umbraco.Tests/Configurations/RepositorySettingsTests.cs @@ -0,0 +1,32 @@ +using System.Configuration; +using NUnit.Framework; +using Umbraco.Core.Configuration.InfrastructureSettings; + +namespace Umbraco.Tests.Configurations +{ + [TestFixture] + public class RepositorySettingsTests + { + [Test] + public void Can_Get_Repository_From_Config() + { + Infrastructure infrastructure = Infrastructure.Instance; + Repositories repositories = infrastructure.Repositories; + Repository repository = repositories.Repository["IContentRepository"]; + + Assert.That(repository, Is.Not.Null); + Assert.AreEqual(repository.InterfaceShortTypeName, "IContentRepository"); + Assert.AreEqual(repository.RepositoryFullTypeName, "Umbraco.Core.Persistence.Repositories.ContentRepository, Umbraco.Core"); + Assert.AreEqual(repository.CacheProviderFullTypeName, "Umbraco.Core.Persistence.Caching.RuntimeCacheProvider, Umbraco.Core"); + } + + [Test] + public void Can_Get_PublishingStrategy_From_Config() + { + Infrastructure infrastructure = Infrastructure.Instance; + PublishingProvider strategy = infrastructure.PublishingStrategy; + + Assert.That(strategy.Type, Is.EqualTo("Umbraco.Web.Publishing.PublishingStrategy, Umbraco.Web")); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Models/StylesheetTests.cs b/src/Umbraco.Tests/Models/StylesheetTests.cs new file mode 100644 index 0000000000..7f048f4539 --- /dev/null +++ b/src/Umbraco.Tests/Models/StylesheetTests.cs @@ -0,0 +1,36 @@ +using System.Linq; +using NUnit.Framework; +using Umbraco.Core.Models; + +namespace Umbraco.Tests.Models +{ + [TestFixture] + public class StylesheetTests + { + [Test] + public void Can_Create_Stylesheet() + { + // Arrange + var stylesheet = new Stylesheet("/css/styles.css"); + stylesheet.Content = @"body { color:#000; } .bold {font-weight:bold;}"; + + Assert.That(stylesheet.Name, Is.EqualTo("styles.css")); + Assert.That(stylesheet.Alias, Is.EqualTo("styles")); + } + + [Test] + public void Can_Get_Properties_From_Css() + { + // Arrange + var stylesheet = new Stylesheet("/css/styles.css"); + stylesheet.Content = @"body { color:#000; } .bold {font-weight:bold;}"; + + // Act + var properties = stylesheet.Properties; + + Assert.That(properties, Is.Not.Null); + Assert.That(properties.Any(), Is.True); + Assert.That(properties.Count(), Is.EqualTo(2)); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs new file mode 100644 index 0000000000..88d3ac3d8b --- /dev/null +++ b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs @@ -0,0 +1,194 @@ +using NUnit.Framework; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Tests.Persistence +{ + [TestFixture] + public class RepositoryResolverTests + { + [Test] + public void Can_Resolve_All_Repositories() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + RepositoryResolver.RegisterRepositories(); + + // Assert + Assert.That(RepositoryResolver.RegisteredRepositories(), Is.EqualTo(13)); + } + + [Test] + public void Can_Resolve_ContentRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_ContentTypeRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_MediaRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_MediaTypeRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_DataTypeDefinitionRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_DictionaryRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_LanguageRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_MacroRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_RelationRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_RelationTypeRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_ScriptRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_StylesheetRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_TemplateRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index c74168e018..e9db4767eb 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -56,13 +56,17 @@ + + + +