From ca8d1d57e1bbf49cb52abe81b3a7246dacbe9b03 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Fri, 27 Jun 2008 02:15:57 +0000 Subject: Mantis#1591. Thank you graciously, Sempuki for a patch that: Currently module loading is done ad-hoc. I propose creating a simple loader class that leverages Mono.Addins (and perhaps the new .NET addins when they become available in mono). Attached is a basic patch for review that compiles into HEAD, but doesn't yet replace any existing ad-hoc loaders. --- OpenSim/Framework/IAssetProvider.cs | 2 +- OpenSim/Framework/IPlugin.cs | 18 +++- OpenSim/Framework/PluginLoader.cs | 115 +++++++++++++++++++++++++ OpenSim/Framework/Servers/OSHttpRequestPump.cs | 2 +- 4 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 OpenSim/Framework/PluginLoader.cs (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/IAssetProvider.cs b/OpenSim/Framework/IAssetProvider.cs index 5c02ff1..dcb79ea 100644 --- a/OpenSim/Framework/IAssetProvider.cs +++ b/OpenSim/Framework/IAssetProvider.cs @@ -38,4 +38,4 @@ namespace OpenSim.Framework void CommitAssets(); // force a sync to the database void Initialise(string connect); } -} \ No newline at end of file +} diff --git a/OpenSim/Framework/IPlugin.cs b/OpenSim/Framework/IPlugin.cs index 8a0b2b1..342918c 100644 --- a/OpenSim/Framework/IPlugin.cs +++ b/OpenSim/Framework/IPlugin.cs @@ -25,12 +25,24 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; + namespace OpenSim.Framework { /// + /// Exception thrown if Initialise has been called, but failed. + /// + public class PluginNotInitialisedException : Exception + { + public PluginNotInitialisedException () : base() {} + public PluginNotInitialisedException (string msg) : base(msg) {} + public PluginNotInitialisedException (string msg, Exception e) : base(msg, e) {} + } + + /// /// This interface, describes a generic plugin /// - public interface IPlugin + public interface IPlugin : System.IDisposable { /// /// Returns the plugin version @@ -45,8 +57,8 @@ namespace OpenSim.Framework string Name { get; } /// - /// Initialises the plugin (artificial constructor) + /// Default-initialises the plugin /// void Initialise(); } -} \ No newline at end of file +} diff --git a/OpenSim/Framework/PluginLoader.cs b/OpenSim/Framework/PluginLoader.cs new file mode 100644 index 0000000..26df3d1 --- /dev/null +++ b/OpenSim/Framework/PluginLoader.cs @@ -0,0 +1,115 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.IO; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Mono.Addins; + +namespace OpenSim.Framework +{ + public class PluginLoader : IDisposable where T : IPlugin + { + private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private List loaded = new List(); + + public PluginLoader (string dir) + { + AddPluginDir (dir); + } + + public void AddPluginDir (string dir) + { + suppress_console_output_ (true); + AddinManager.Initialize (dir); + suppress_console_output_ (false); + } + + public delegate void Initialiser (IPlugin p); + private void default_initialiser_ (IPlugin p) { p.Initialise(); } + + public void Load (string extpoint) + { + Load (extpoint, default_initialiser_); + } + + public void Load (string extpoint, Initialiser initialize) + { + AddinManager.Registry.Update (null); + + ExtensionNodeList ns = AddinManager.GetExtensionNodes(extpoint); + foreach (TypeExtensionNode n in ns) + { + T p = (T) n.CreateInstance(); + initialize (p); + Plugins.Add (p); + + log.Info("[PLUGINS]: Loading plugin " + n.Path + "/" + p.Name); + } + } + + public List Plugins + { + get { return loaded; } + } + + public void Dispose () + { + foreach (T p in Plugins) + p.Dispose (); + } + + public void ClearCache() + { + // The Mono addin manager (in Mono.Addins.dll version 0.2.0.0) occasionally seems to corrupt its addin cache + // Hence, as a temporary solution we'll remove it before each startup + if (Directory.Exists("addin-db-000")) + Directory.Delete("addin-db-000", true); + + if (Directory.Exists("addin-db-001")) + Directory.Delete("addin-db-001", true); + } + + private static TextWriter prev_console_; + public void suppress_console_output_ (bool save) + { + if (save) + { + prev_console_ = System.Console.Out; + System.Console.SetOut(new StreamWriter(Stream.Null)); + } + else + { + if (prev_console_ != null) + System.Console.SetOut(prev_console_); + } + } + + } +} diff --git a/OpenSim/Framework/Servers/OSHttpRequestPump.cs b/OpenSim/Framework/Servers/OSHttpRequestPump.cs index 06e41e4..6214ab0 100644 --- a/OpenSim/Framework/Servers/OSHttpRequestPump.cs +++ b/OpenSim/Framework/Servers/OSHttpRequestPump.cs @@ -58,4 +58,4 @@ namespace OpenSim.Framework.Servers return pumps; } } -} \ No newline at end of file +} -- cgit v1.1