diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/ComponentFactory.cs b/OpenSim/ApplicationPlugins/ScriptEngine/ComponentFactory.cs new file mode 100644 index 0000000000..48cd1f9966 --- /dev/null +++ b/OpenSim/ApplicationPlugins/ScriptEngine/ComponentFactory.cs @@ -0,0 +1,144 @@ +/* + * 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.Collections.Generic; +using System.IO; +using System.Reflection; +using log4net; +using OpenSim.ScriptEngine.Shared; + +namespace OpenSim.ApplicationPlugins.ScriptEngine +{ + public static class ComponentFactory + { + // Component providers are registered here wit a name (string) + // When a script engine is created the components are instanciated + public static Dictionary providers = new Dictionary(); + public static Dictionary scriptEngines = new Dictionary(); + + internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly static string nameIScriptEngineComponent = typeof(IScriptEngineComponent).Name; // keep interface name in managed code + private readonly static string nameIScriptEngine = typeof(IScriptEngine).Name; // keep interface name in managed code + + public static string Name + { + get { return "SECS.ComponentFactory"; } + } + + /// + /// Load components from directory + /// + /// + internal static void Load(string directory, string filter) + { + // We may want to change how this functions as currently it required unique class names for each component + + foreach (string file in Directory.GetFiles(directory, filter)) + { + //m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file); + Assembly componentAssembly = null; + try + { + componentAssembly = Assembly.LoadFrom(file); + } + catch (Exception e) + { + m_log.ErrorFormat("[{0}] Error loading: \"{1}\".", Name, file); + } + if (componentAssembly != null) + { + try + { + // Go through all types in the assembly + foreach (Type componentType in componentAssembly.GetTypes()) + { + if (componentType.IsPublic + && !componentType.IsAbstract) + { + //if (componentType.IsSubclassOf(typeof(ComponentBase))) + if (componentType.GetInterface(nameIScriptEngineComponent) != null) + { + // We have found an type which is derived from ProdiverBase, add it to provider list + m_log.InfoFormat("[{0}] Adding component: {1}", Name, componentType.Name); + lock (providers) + { + providers.Add(componentType.Name, componentType); + } + } + //if (componentType.IsSubclassOf(typeof(ScriptEngineBase))) + if (componentType.GetInterface(nameIScriptEngine) != null) + { + // We have found an type which is derived from RegionScriptEngineBase, add it to engine list + m_log.InfoFormat("[{0}] Adding script engine: {1}", Name, componentType.Name); + lock (scriptEngines) + { + scriptEngines.Add(componentType.Name, componentType); + } + } + } + } + } + catch + (ReflectionTypeLoadException re) + { + m_log.ErrorFormat("[{0}] Could not load component \"{1}\": {2}", Name, componentAssembly.FullName, re.ToString()); + int c = 0; + foreach (Exception e in re.LoaderExceptions) + { + c++; + m_log.ErrorFormat("[{0}] LoaderException {1}: {2}", Name, c, e.ToString()); + } + } + } //if + } //foreach + } + + public static IScriptEngineComponent GetComponentInstance(string name, params Object[] args) + { + lock (providers) + { + if (!providers.ContainsKey(name)) + throw new Exception("ScriptEngine requested component named \"" + name + + "\" that does not exist."); + return Activator.CreateInstance(providers[name], args) as IScriptEngineComponent; + } + } + + private readonly static string nameIScriptEngineRegionComponent = typeof(IScriptEngineRegionComponent).Name; // keep interface name in managed code + public static IScriptEngineComponent GetComponentInstance(RegionInfoStructure info, string name, params Object[] args) + { + IScriptEngineComponent c = GetComponentInstance(name, args); + + // If module is IScriptEngineRegionComponent then it will have one instance per region and we will initialize it + if (c.GetType().GetInterface(nameIScriptEngineRegionComponent) != null) + ((IScriptEngineRegionComponent)c).Initialize(info); + + return c; + } + + } +} diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/RegionEngineLoader.cs b/OpenSim/ApplicationPlugins/ScriptEngine/RegionEngineLoader.cs index 1023238a52..998f017b7d 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/RegionEngineLoader.cs +++ b/OpenSim/ApplicationPlugins/ScriptEngine/RegionEngineLoader.cs @@ -97,16 +97,16 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine m_log.DebugFormat("[{0}] Loading region script engine engine \"{1}\".", Name, tempScriptEngineName); try { - lock (ScriptEnginePlugin.scriptEngines) + lock (ComponentFactory.scriptEngines) { - if (!ScriptEnginePlugin.scriptEngines.ContainsKey(tempScriptEngineName)) + if (!ComponentFactory.scriptEngines.ContainsKey(tempScriptEngineName)) { m_log.ErrorFormat("[{0}] Unable to load region script engine: Script engine \"{1}\" does not exist.", Name, tempScriptEngineName); } else { scriptEngine = - Activator.CreateInstance(ScriptEnginePlugin.scriptEngines[tempScriptEngineName]) as + Activator.CreateInstance(ComponentFactory.scriptEngines[tempScriptEngineName]) as IScriptEngine; } } diff --git a/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs b/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs index f81b848e35..ae4e2f9030 100644 --- a/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs +++ b/OpenSim/ApplicationPlugins/ScriptEngine/ScriptEnginePlugin.cs @@ -26,11 +26,7 @@ */ using System; using System.Collections.Generic; -using System.IO; using System.Reflection; -using System.Text; -using System.Threading; -using OpenSim.ScriptEngine.Shared; using log4net; namespace OpenSim.ApplicationPlugins.ScriptEngine @@ -43,10 +39,6 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); internal OpenSimBase m_OpenSim; - // Component providers are registered here wit a name (string) - // When a script engine is created the components are instanciated - public static Dictionary providers = new Dictionary(); - public static Dictionary scriptEngines = new Dictionary(); public ScriptEnginePlugin() @@ -62,7 +54,7 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine // Load all modules from current directory // We only want files named OpenSim.ScriptEngine.*.dll - Load(".", "OpenSim.ScriptEngine.*.dll"); + ComponentFactory.Load(".", "OpenSim.ScriptEngine.*.dll"); } public void Initialise(OpenSimBase openSim) @@ -73,95 +65,6 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine //m_OpenSim.Shutdown(); } - private readonly static string nameIScriptEngineComponent = typeof(IScriptEngineComponent).Name; // keep interface name in managed code - private readonly static string nameIScriptEngine = typeof(IScriptEngine).Name; // keep interface name in managed code - /// - /// Load components from directory - /// - /// - public void Load(string directory, string filter) - { - // We may want to change how this functions as currently it required unique class names for each component - - foreach (string file in Directory.GetFiles(directory, filter)) - { - //m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file); - Assembly componentAssembly = null; - try - { - componentAssembly = Assembly.LoadFrom(file); - } catch (Exception e) - { - m_log.ErrorFormat("[{0}] Error loading: \"{1}\".", Name, file); - } - if (componentAssembly != null) - { - try - { - // Go through all types in the assembly - foreach (Type componentType in componentAssembly.GetTypes()) - { - if (componentType.IsPublic - && !componentType.IsAbstract) - { - //if (componentType.IsSubclassOf(typeof(ComponentBase))) - if (componentType.GetInterface(nameIScriptEngineComponent) != null) - { - // We have found an type which is derived from ProdiverBase, add it to provider list - m_log.InfoFormat("[{0}] Adding component: {1}", Name, componentType.Name); - lock (providers) - { - providers.Add(componentType.Name, componentType); - } - } - //if (componentType.IsSubclassOf(typeof(ScriptEngineBase))) - if (componentType.GetInterface(nameIScriptEngine) != null) - { - // We have found an type which is derived from RegionScriptEngineBase, add it to engine list - m_log.InfoFormat("[{0}] Adding script engine: {1}", Name, componentType.Name); - lock (scriptEngines) - { - scriptEngines.Add(componentType.Name, componentType); - } - } - } - } - } - catch - (ReflectionTypeLoadException re) - { - m_log.ErrorFormat("[{0}] Could not load component \"{1}\": {2}", Name, componentAssembly.FullName, re.ToString()); - int c = 0; - foreach (Exception e in re.LoaderExceptions) - { - c++; - m_log.ErrorFormat("[{0}] LoaderException {1}: {2}", Name, c, e.ToString()); - } - } - } //if - } //foreach - } - - public static IScriptEngineComponent GetComponentInstance(string name, params Object[] args) - { - if (!providers.ContainsKey(name)) - throw new Exception("ScriptEngine requested component named \"" + name + - "\" that does not exist."); - - return Activator.CreateInstance(providers[name], args) as IScriptEngineComponent; - } - - private readonly static string nameIScriptEngineRegionComponent = typeof(IScriptEngineRegionComponent).Name; // keep interface name in managed code - public static IScriptEngineComponent GetComponentInstance(RegionInfoStructure info, string name, params Object[] args) - { - IScriptEngineComponent c = GetComponentInstance(name, args); - - // If module is IScriptEngineRegionComponent then it will have one instance per region and we will initialize it - if (c.GetType().GetInterface(nameIScriptEngineRegionComponent) != null) - ((IScriptEngineRegionComponent)c).Initialize(info); - - return c; - } #region IApplicationPlugin stuff /// diff --git a/OpenSim/ScriptEngine/Engines/DotNetEngine/DotNetEngine.cs b/OpenSim/ScriptEngine/Engines/DotNetEngine/DotNetEngine.cs index 0f9b964698..3666ca4d82 100644 --- a/OpenSim/ScriptEngine/Engines/DotNetEngine/DotNetEngine.cs +++ b/OpenSim/ScriptEngine/Engines/DotNetEngine/DotNetEngine.cs @@ -38,7 +38,7 @@ using OpenSim.Region.Environment.Scenes; using OpenSim.ScriptEngine.Components.DotNetEngine.Events; using OpenSim.ScriptEngine.Components.DotNetEngine.Scheduler; using OpenSim.ScriptEngine.Shared; -using ComponentProviders = OpenSim.ApplicationPlugins.ScriptEngine; +using ComponentFactory = OpenSim.ApplicationPlugins.ScriptEngine.ComponentFactory; namespace OpenSim.ScriptEngine.Engines.DotNetEngine { @@ -128,12 +128,12 @@ namespace OpenSim.ScriptEngine.Engines.DotNetEngine cname = "ScriptManager"; m_log.DebugFormat("[{0}] Executor: {1}", Name, cname); RegionInfo.Executors.Add(cname, - ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as IScriptExecutor); + ComponentFactory.GetComponentInstance(RegionInfo, cname) as IScriptExecutor); cname = "ScriptLoader"; m_log.DebugFormat("[{0}] ScriptLoader: {1}", Name, cname); RegionInfo.ScriptLoader = - ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as IScriptExecutor as ScriptLoader; + ComponentFactory.GetComponentInstance(RegionInfo, cname) as IScriptExecutor as ScriptLoader; // CommandProviders foreach (string cn in commandNames) @@ -141,7 +141,7 @@ namespace OpenSim.ScriptEngine.Engines.DotNetEngine cname = cn; m_log.DebugFormat("[{0}] CommandProvider: {1}", Name, cname); RegionInfo.CommandProviders.Add(cname, - ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as + ComponentFactory.GetComponentInstance(RegionInfo, cname) as IScriptCommandProvider); } @@ -151,7 +151,7 @@ namespace OpenSim.ScriptEngine.Engines.DotNetEngine cname = cn; m_log.DebugFormat("[{0}] Compiler: {1}", Name, cname); RegionInfo.Compilers.Add(cname, - ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as + ComponentFactory.GetComponentInstance(RegionInfo, cname) as IScriptCompiler); } @@ -161,14 +161,14 @@ namespace OpenSim.ScriptEngine.Engines.DotNetEngine cname = cn; m_log.DebugFormat("[{0}] Scheduler: {1}", Name, cname); RegionInfo.Schedulers.Add(cname, - ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as + ComponentFactory.GetComponentInstance(RegionInfo, cname) as IScriptScheduler); } // Event provider cname = "LSLEventProvider"; m_log.DebugFormat("[{0}] EventProvider: {1}", Name, cname); - IScriptEventProvider sep = ScriptEnginePlugin.GetComponentInstance(RegionInfo, cname) as IScriptEventProvider; + IScriptEventProvider sep = ComponentFactory.GetComponentInstance(RegionInfo, cname) as IScriptEventProvider; RegionInfo.EventProviders.Add(cname, sep); m_LSLEventProvider = sep as LSLEventProvider;