From 97ee9fed14e3b5d76805cd79d4378c0b71c0abd9 Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Wed, 25 Jul 2012 22:33:11 -0400 Subject: Switched to MEF as a means to locate plugins and resolvers --- MediaBrowser.Common/Kernel/BaseKernel.cs | 109 +++++++++++++++++++++++++------ 1 file changed, 90 insertions(+), 19 deletions(-) (limited to 'MediaBrowser.Common/Kernel/BaseKernel.cs') diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 47e5d2c94..0edfeab25 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -1,6 +1,11 @@ -using System.Configuration; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.ComponentModel.Composition.Hosting; +using System.Configuration; using System.IO; +using System.Linq; using System.Reflection; +using System.Threading.Tasks; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Json; using MediaBrowser.Common.Logging; @@ -12,8 +17,7 @@ namespace MediaBrowser.Common.Kernel /// /// Represents a shared base kernel for both the UI and server apps /// - public abstract class BaseKernel - where TConfigurationContorllerType : ConfigurationController, new() + public abstract class BaseKernel where TConfigurationType : BaseConfiguration, new() { /// @@ -21,19 +25,39 @@ namespace MediaBrowser.Common.Kernel /// public string ProgramDataPath { get; private set; } + protected string PluginsPath + { + get + { + return Path.Combine(ProgramDataPath, "plugins"); + } + } + + protected string ConfigurationPath + { + get + { + return Path.Combine(ProgramDataPath, "config.js"); + } + } + /// /// Gets the current configuration /// - public TConfigurationContorllerType ConfigurationController { get; private set; } + public TConfigurationType Configuration { get; private set; } + /// + /// Gets the list of currently loaded plugins + /// + [ImportMany(typeof(BasePlugin))] + public IEnumerable Plugins { get; private set; } + /// /// Both the UI and server will have a built-in HttpServer. /// People will inevitably want remote control apps so it's needed in the UI too. /// public HttpServer HttpServer { get; private set; } - public PluginController PluginController { get; private set; } - /// /// Gets the kernel context. The UI kernel will have to override this. /// @@ -43,9 +67,6 @@ namespace MediaBrowser.Common.Kernel { ProgramDataPath = GetProgramDataPath(); - PluginController = new PluginController() { PluginsPath = Path.Combine(ProgramDataPath, "Plugins") }; - ConfigurationController = new TConfigurationContorllerType() { Path = Path.Combine(ProgramDataPath, "config.js") }; - Logger.LoggerInstance = new FileLogger(Path.Combine(ProgramDataPath, "Logs")); } @@ -55,7 +76,51 @@ namespace MediaBrowser.Common.Kernel ReloadHttpServer(); - ReloadPlugins(); + ReloadComposableParts(); + } + + protected void ReloadComposableParts() + { + if (!Directory.Exists(PluginsPath)) + { + Directory.CreateDirectory(PluginsPath); + } + + var catalog = new AggregateCatalog(Directory.GetDirectories(PluginsPath, "*", SearchOption.TopDirectoryOnly).Select(f => new DirectoryCatalog(f))); + + //catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); + //catalog.Catalogs.Add(new AssemblyCatalog(GetType().Assembly)); + + new CompositionContainer(catalog).ComposeParts(this); + + OnComposablePartsLoaded(); + } + + protected virtual void OnComposablePartsLoaded() + { + StartPlugins(); + } + + private void StartPlugins() + { + Parallel.For(0, Plugins.Count(), i => + { + var plugin = Plugins.ElementAt(i); + + plugin.ReloadConfiguration(); + + if (plugin.Enabled) + { + if (KernelContext == KernelContext.Server) + { + plugin.InitInServer(); + } + else + { + plugin.InitInUI(); + } + } + }); } /// @@ -87,9 +152,21 @@ namespace MediaBrowser.Common.Kernel private void ReloadConfiguration() { // Deserialize config - ConfigurationController.Reload(); + if (!File.Exists(ConfigurationPath)) + { + Configuration = new TConfigurationType(); + } + else + { + Configuration = JsonSerializer.DeserializeFromFile(ConfigurationPath); + } - Logger.LoggerInstance.LogSeverity = ConfigurationController.Configuration.LogSeverity; + Logger.LoggerInstance.LogSeverity = Configuration.LogSeverity; + } + + public void SaveConfiguration() + { + JsonSerializer.SerializeToFile(Configuration, ConfigurationPath); } private void ReloadHttpServer() @@ -99,13 +176,7 @@ namespace MediaBrowser.Common.Kernel HttpServer.Dispose(); } - HttpServer = new HttpServer("http://+:" + ConfigurationController.Configuration.HttpServerPortNumber + "/mediabrowser/"); - } - - protected virtual void ReloadPlugins() - { - // Find plugins - PluginController.Init(KernelContext); + HttpServer = new HttpServer("http://+:" + Configuration.HttpServerPortNumber + "/mediabrowser/"); } private static TConfigurationType GetConfiguration(string directory) -- cgit v1.2.3