diff --git a/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs b/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs index 5d4f75240..68d94b3ed 100644 --- a/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs +++ b/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs @@ -103,6 +103,16 @@ public PluginBlacklistCollection PluginBlacklist } } + [ConfigurationProperty("pluginDirectories", IsRequired = false)] + public PluginDirectoryCollection PluginDirectories + { + set { this["pluginDirectories"] = value; } + get + { + return this["pluginDirectories"] as PluginDirectoryCollection; + } + } + [ConfigurationProperty("urlBlacklist", IsRequired = false)] public UrlBlacklistCollection UrlBlackList { diff --git a/source/Glimpse.Core/Configuration/PluginDirectory.cs b/source/Glimpse.Core/Configuration/PluginDirectory.cs new file mode 100644 index 000000000..de43c0c59 --- /dev/null +++ b/source/Glimpse.Core/Configuration/PluginDirectory.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; + +namespace Glimpse.Core.Configuration +{ + /// + /// Directory containing plugins + /// + public class PluginDirectory : ConfigurationElement + { + [ConfigurationProperty("directory")] + public string Directory + { + get + { + return this["directory"].ToString(); + } + set { this["directory"] = value; } + } + + public override string ToString() + { + return Directory; + } + } +} diff --git a/source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs b/source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs new file mode 100644 index 000000000..ac5778e2b --- /dev/null +++ b/source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; + +namespace Glimpse.Core.Configuration +{ + public class PluginDirectoryCollection : ConfigurationElementCollection + { + public PluginDirectoryCollection() + { + BaseAdd(new PluginDirectory { Directory = "bin" }); + } + + public PluginDirectory this[int index] + { + get { return BaseGet(index) as PluginDirectory; } + set + { + if (BaseGet(index) != null) + { + BaseRemoveAt(index); + } + BaseAdd(index, value); + } + } + + public void Add(PluginDirectory address) + { + BaseAdd(address); + } + + public void Clear() + { + BaseClear(); + } + + protected override ConfigurationElement CreateNewElement() + { + return new PluginDirectory(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return element; + } + + public IEnumerable DirectoryNames + { + get + { + foreach (PluginDirectory directory in this) + { + yield return directory.ToString(); + } + } + } + } +} diff --git a/source/Glimpse.Core/Glimpse.Core.csproj b/source/Glimpse.Core/Glimpse.Core.csproj index 0b76f3cbc..4ee38d886 100644 --- a/source/Glimpse.Core/Glimpse.Core.csproj +++ b/source/Glimpse.Core/Glimpse.Core.csproj @@ -78,6 +78,8 @@ + + diff --git a/source/Glimpse.Core/Module.cs b/source/Glimpse.Core/Module.cs index 689c001b5..d75349d93 100644 --- a/source/Glimpse.Core/Module.cs +++ b/source/Glimpse.Core/Module.cs @@ -330,7 +330,7 @@ private void ComposePlugins() { var batch = new CompositionBatch(); - var directoryCatalog = new BlacklistedSafeDirectoryCatalog("bin", Configuration.PluginBlacklist.TypeNames()); + var directoryCatalog = new BlacklistedSafeDirectoryCatalog(Configuration.PluginDirectories.DirectoryNames, Configuration.PluginBlacklist.TypeNames()); var container = new CompositionContainer(directoryCatalog); container.ComposeParts(this, RequestValidator); diff --git a/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs b/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs index 70ab8b42b..ff8871182 100644 --- a/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs +++ b/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs @@ -14,34 +14,37 @@ internal class BlacklistedSafeDirectoryCatalog : ComposablePartCatalog public IList Exceptions { get; private set; } private IEnumerable TypesBlacklist { get; set; } - public BlacklistedSafeDirectoryCatalog(string path, IEnumerable typesBlacklist) + public BlacklistedSafeDirectoryCatalog(IEnumerable paths, IEnumerable typesBlacklist) { Exceptions = new List(); TypesBlacklist = typesBlacklist; - var files = Directory.EnumerateFiles(GetFullPath(path), "*.dll", SearchOption.AllDirectories); - AggregateCatalog = new AggregateCatalog(); - foreach (var file in files) + foreach (var path in paths) { - try - { - var assemblyCatalog = new AssemblyCatalog(file); + var files = Directory.EnumerateFiles(GetFullPath(path), "*.dll", SearchOption.AllDirectories); - if (assemblyCatalog.Parts.ToList().Count > 0) - AggregateCatalog.Catalogs.Add(assemblyCatalog); - } - catch (ReflectionTypeLoadException ex) + foreach (var file in files) { - foreach (var exception in ex.LoaderExceptions) + try { - Exceptions.Add(exception); + var assemblyCatalog = new AssemblyCatalog(file); + + if (assemblyCatalog.Parts.ToList().Count > 0) + AggregateCatalog.Catalogs.Add(assemblyCatalog); + } + catch (ReflectionTypeLoadException ex) + { + foreach (var exception in ex.LoaderExceptions) + { + Exceptions.Add(exception); + } + } + catch (Exception ex) + { + Exceptions.Add(ex); } - } - catch (Exception ex) - { - Exceptions.Add(ex); } } }