From 524244d1ec118b76c66b579633c012c3befd7a2b Mon Sep 17 00:00:00 2001 From: "Matt@MBP13-PC" Date: Mon, 13 Aug 2012 13:26:06 -0100 Subject: [PATCH] Added FileSystemProviders config section Added FileSystemProviderManager class for fetching a file system provider by alias (this should probably be moved into the Umbraco context in 4.10) --- .../FileSystemProviderElement.cs | 42 +++++++++++++ .../FileSystemProviderElementCollection.cs | 30 +++++++++ .../FileSystemProvidersSection.cs | 19 ++++++ src/Umbraco.Core/IO/FileSystemProvider.cs | 12 ++++ .../IO/FileSystemProviderManager.cs | 61 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 6 ++ src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 4 ++ .../config/FileSystemProviders.Release.config | 11 ++++ .../config/FileSystemProviders.config | 11 ++++ src/Umbraco.Web.UI/web.Template.config | 3 + 10 files changed, 199 insertions(+) create mode 100644 src/Umbraco.Core/Configuration/FileSystemProviderElement.cs create mode 100644 src/Umbraco.Core/Configuration/FileSystemProviderElementCollection.cs create mode 100644 src/Umbraco.Core/Configuration/FileSystemProvidersSection.cs create mode 100644 src/Umbraco.Core/IO/FileSystemProvider.cs create mode 100644 src/Umbraco.Core/IO/FileSystemProviderManager.cs create mode 100644 src/Umbraco.Web.UI/config/FileSystemProviders.Release.config create mode 100644 src/Umbraco.Web.UI/config/FileSystemProviders.config diff --git a/src/Umbraco.Core/Configuration/FileSystemProviderElement.cs b/src/Umbraco.Core/Configuration/FileSystemProviderElement.cs new file mode 100644 index 0000000000..c0773e64e3 --- /dev/null +++ b/src/Umbraco.Core/Configuration/FileSystemProviderElement.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; + +namespace Umbraco.Core.Configuration +{ + public class FileSystemProviderElement : ConfigurationElement + { + private const string ALIAS_KEY = "alias"; + private const string TYPE_KEY = "type"; + private const string PARAMETERS_KEY = "Parameters"; + + [ConfigurationProperty(ALIAS_KEY, IsKey = true, IsRequired = true)] + public string Alias + { + get + { + return ((string)(base[ALIAS_KEY])); + } + } + + [ConfigurationProperty(TYPE_KEY, IsKey = false, IsRequired = true)] + public string Type + { + get + { + return ((string)(base[TYPE_KEY])); + } + } + + [ConfigurationProperty(PARAMETERS_KEY, IsDefaultCollection = true, IsRequired = false)] + public KeyValueConfigurationCollection Parameters + { + get + { + return ((KeyValueConfigurationCollection)(base[PARAMETERS_KEY])); + } + } + } +} diff --git a/src/Umbraco.Core/Configuration/FileSystemProviderElementCollection.cs b/src/Umbraco.Core/Configuration/FileSystemProviderElementCollection.cs new file mode 100644 index 0000000000..0604560939 --- /dev/null +++ b/src/Umbraco.Core/Configuration/FileSystemProviderElementCollection.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; + +namespace Umbraco.Core.Configuration +{ + [ConfigurationCollection(typeof(FileSystemProviderElement), AddItemName = "Provider")] + public class FileSystemProviderElementCollection : ConfigurationElementCollection + { + protected override ConfigurationElement CreateNewElement() + { + return new FileSystemProviderElement(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((FileSystemProviderElement)(element)).Alias; + } + + new public FileSystemProviderElement this[string key] + { + get + { + return (FileSystemProviderElement)BaseGet(key); + } + } + } +} diff --git a/src/Umbraco.Core/Configuration/FileSystemProvidersSection.cs b/src/Umbraco.Core/Configuration/FileSystemProvidersSection.cs new file mode 100644 index 0000000000..a893d541a6 --- /dev/null +++ b/src/Umbraco.Core/Configuration/FileSystemProvidersSection.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; + +namespace Umbraco.Core.Configuration +{ + public class FileSystemProvidersSection : ConfigurationSection + { + private const string PROVIDERS_KEY = "providers"; + + [ConfigurationProperty("", IsDefaultCollection = true, IsRequired = true)] + public FileSystemProviderElementCollection Providers + { + get { return ((FileSystemProviderElementCollection)(base[""])); } + } + } +} diff --git a/src/Umbraco.Core/IO/FileSystemProvider.cs b/src/Umbraco.Core/IO/FileSystemProvider.cs new file mode 100644 index 0000000000..31f767f28e --- /dev/null +++ b/src/Umbraco.Core/IO/FileSystemProvider.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Umbraco.Core.IO +{ + internal class FileSystemProvider + { + public const string Media = "media"; + } +} diff --git a/src/Umbraco.Core/IO/FileSystemProviderManager.cs b/src/Umbraco.Core/IO/FileSystemProviderManager.cs new file mode 100644 index 0000000000..da4a1e8dec --- /dev/null +++ b/src/Umbraco.Core/IO/FileSystemProviderManager.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using Umbraco.Core.Configuration; + +namespace Umbraco.Core.IO +{ + internal class FileSystemProviderManager + { + private readonly FileSystemProvidersSection _config; + + #region Singleton + + private static readonly FileSystemProviderManager Instance = new FileSystemProviderManager(); + + public static FileSystemProviderManager Current + { + get { return Instance; } + } + + #endregion + + #region Constructors + + public FileSystemProviderManager() + { + _config = (FileSystemProvidersSection)ConfigurationManager.GetSection("FileSystemProviders"); + } + + #endregion + + public IFileSystem GetFileSystemProvider(string alias) + { + var providerConfig = _config.Providers[alias]; + if(providerConfig == null) + throw new ArgumentException(string.Format("No provider found with the alias '{0}'", alias)); + + var providerType = Type.GetType(providerConfig.Type); + if(providerType == null) + throw new InvalidOperationException(string.Format("Could not find type '{0}'", providerConfig.Type)); + + if (providerType.IsAssignableFrom(typeof(IFileSystem))) + throw new InvalidOperationException(string.Format("The type '{0}' does not implement IFileSystem", providerConfig.Type)); + + var paramCount = providerConfig.Parameters != null ? providerConfig.Parameters.Count : 0; + var constructor = providerType.GetConstructors() + .SingleOrDefault(x => x.GetParameters().Count() == paramCount + && x.GetParameters().All(y => providerConfig.Parameters.AllKeys.Contains(y.Name))); + if(constructor == null) + throw new InvalidOperationException(string.Format("Could not find constructor for type '{0}' which accepts {1} parameters", providerConfig.Type, paramCount)); + + var parameters = new object[paramCount]; + for(var i = 0; i < paramCount; i++) + parameters[i] = providerConfig.Parameters[providerConfig.Parameters.AllKeys[i]].Value; + + return (IFileSystem) constructor.Invoke(parameters); + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index bae30785d7..8ae92f2038 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -32,6 +32,7 @@ + @@ -44,9 +45,14 @@ Properties\SolutionInfo.cs + + + + + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index f865dc322b..e1834295e3 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -264,6 +264,10 @@ ClientDependency.config + + + FileSystemProviders.config + xsltExtensions.config diff --git a/src/Umbraco.Web.UI/config/FileSystemProviders.Release.config b/src/Umbraco.Web.UI/config/FileSystemProviders.Release.config new file mode 100644 index 0000000000..cffbc4e802 --- /dev/null +++ b/src/Umbraco.Web.UI/config/FileSystemProviders.Release.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI/config/FileSystemProviders.config b/src/Umbraco.Web.UI/config/FileSystemProviders.config new file mode 100644 index 0000000000..cffbc4e802 --- /dev/null +++ b/src/Umbraco.Web.UI/config/FileSystemProviders.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config index 773c4e0f47..9ef5698791 100644 --- a/src/Umbraco.Web.UI/web.Template.config +++ b/src/Umbraco.Web.UI/web.Template.config @@ -11,6 +11,7 @@
+
@@ -19,11 +20,13 @@ + +