Work in progress on SECS stuff. Have been holding it off until after 0.6 release. Still messy as hell and doesn't really work yet. Will undergo dramatic changes. AND MOST IMPORTANTLY: Will be conformed to work in coop with todays DNE and XEngine, hopefully one day providing a common interface for all components.

This commit is contained in:
Tedd Hansen
2008-11-08 17:35:48 +00:00
parent cf0a14bec9
commit 9511a8c763
53 changed files with 2997 additions and 573 deletions

View File

@@ -1,101 +0,0 @@
/*
* 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 System.Text;
using log4net;
using OpenSim.ApplicationPlugins.ScriptEngine.Components;
namespace OpenSim.ApplicationPlugins.ScriptEngine
{
/// <summary>
/// Used to load ScriptEngine component .dll's
/// </summary>
internal class ComponentLoader
{
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//private ScriptEnginePlugin scriptEnginePlugin;
public ComponentLoader(ScriptEnginePlugin sep)
{
//scriptEnginePlugin = sep;
}
/// <summary>
/// Load components from directory
/// </summary>
/// <param name="directory"></param>
public void Load(string directory)
{
// 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, "*.dll"))
{
//m_log.DebugFormat("[ScriptEngine]: Loading: [{0}].", file);
Assembly componentAssembly = Assembly.LoadFrom(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)))
{
// We have found an type which is derived from ProdiverBase, add it to provider list
m_log.InfoFormat("[ScriptEngine]: Adding component: {0}", componentType.Name);
lock (ComponentRegistry.providers)
{
ComponentRegistry.providers.Add(componentType.Name, componentType);
}
}
if (componentType.IsSubclassOf(typeof(RegionScriptEngineBase)))
{
// We have found an type which is derived from RegionScriptEngineBase, add it to engine list
m_log.InfoFormat("[ScriptEngine]: Adding script engine: {0}", componentType.Name);
lock (ComponentRegistry.scriptEngines)
{
ComponentRegistry.scriptEngines.Add(componentType.Name, componentType);
}
}
}
}
}
catch
(ReflectionTypeLoadException)
{
m_log.InfoFormat("[ScriptEngine]: Could not load types for [{0}].", componentAssembly.FullName);
}
} //if
} //foreach
}
}
}

View File

@@ -1,68 +0,0 @@
/*
* 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.Text;
using OpenSim.ApplicationPlugins.ScriptEngine;
using OpenSim.ApplicationPlugins.ScriptEngine.Components;
namespace OpenSim.ApplicationPlugins.ScriptEngine
{
/// <summary>
/// Component providers
/// This is where any component (any part) of the Script Engine Component System (SECS) registers.
/// Nothing is instanciated at this point. The modules just need to register here to be available for any script engine.
/// </summary>
public static class ComponentRegistry
{
// Component providers are registered here wit a name (string)
// When a script engine is created the components are instanciated
public static Dictionary<string, Type> providers = new Dictionary<string, Type>();
public static Dictionary<string, Type> scriptEngines = new Dictionary<string, Type>();
///// <summary>
///// Returns a list of ProviderBase objects which has been instanciated by their name
///// </summary>
///// <param name="Providers">List of Script Engine Components</param>
///// <returns></returns>
//public static List<ComponentBase> GetComponents(string[] Providers)
//{
// List<ComponentBase> pbl = new List<ComponentBase>();
// if (Providers != null)
// {
// foreach (string p in Providers)
// {
// if (providers.ContainsKey(p))
// pbl.Add(Activator.CreateInstance(providers[p]) as ComponentBase);
// }
// }
// return pbl;
//}
}
}

View File

@@ -1,45 +0,0 @@
/*
* 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.Text;
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
{
public abstract class CommandBase: ComponentBase
{
//public override iProviderBase CreateInstance()
//{
// throw new NotImplementedException();
//}
//public override void Start()
//{
// throw new NotImplementedException();
//}
}
}

View File

@@ -1,45 +0,0 @@
/*
* 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.Text;
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
{
public abstract class CompilerBase: ComponentBase
{
//public override iProviderBase CreateInstance()
//{
// throw new NotImplementedException();
//}
//public override void Start()
//{
// throw new NotImplementedException();
//}
}
}

View File

@@ -1,53 +0,0 @@
/*
* 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.Text;
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
{
/// <summary>
/// Generic baseclass for component providers
/// </summary>
public abstract class ComponentBase //: iProviderBase
{
//public abstract iProviderBase CreateInstance();
public abstract void Start();
public abstract void Close();
public RegionScriptEngineBase scriptEngine;
public void Initialize(RegionScriptEngineBase ScriptEngine)
{
scriptEngine = ScriptEngine;
}
static ComponentBase()
{
// We got loaded -- should we register now?
//OpenSim.ApplicationPlugins.ScriptEngine.ComponentProviders.providers.Add(GetType());
}
}
}

View File

@@ -1,45 +0,0 @@
/*
* 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.Text;
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
{
public abstract class EventBase : ComponentBase
{
//public override iProviderBase CreateInstance()
//{
// throw new NotImplementedException();
//}
//public override void Start()
//{
// throw new NotImplementedException();
//}
}
}

View File

@@ -1,45 +0,0 @@
/*
* 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.Text;
namespace OpenSim.ApplicationPlugins.ScriptEngine.Components
{
public abstract class SchedulerBase: ComponentBase
{
//public override iProviderBase CreateInstance()
//{
// throw new NotImplementedException();
//}
//public override void Start()
//{
// throw new NotImplementedException();
//}
}
}

View File

@@ -26,45 +26,51 @@
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using log4net;
using Nini.Config;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes;
using OpenSim.ScriptEngine.Shared;
namespace OpenSim.ApplicationPlugins.ScriptEngine
{
public class RegionScriptEnginePlugin : IRegionModule
public class RegionEngineLoader : IRegionModule
{
// This is a region module.
// This means: Every time a new region is created, a new instance of this module is also created.
// This module is responsible for starting the script engine for this region.
public string Name { get { return "SECS.DotNetEngine.Scheduler.RegionLoader"; } }
public bool IsSharedModule { get { return true; } }
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private string tempScriptEngineName = "DotNetEngine";
public RegionScriptEngineBase scriptEngine;
public IScriptEngine scriptEngine;
public IConfigSource ConfigSource;
public IConfig ScriptConfigSource;
public void Initialise(Scene scene, IConfigSource source)
{
return;
// New region is being created
// Create a new script engine
// try
// {
// lock (ComponentRegistry.scriptEngines)
// {
// scriptEngine =
// Activator.CreateInstance(ComponentRegistry.scriptEngines[tempScriptEngineName]) as
// RegionScriptEngineBase;
// }
// scriptEngine.Initialize(scene, source);
// }
// catch (Exception ex)
// {
// scriptEngine.m_log.Error("[ScriptEngine]: Unable to load engine \"" + tempScriptEngineName + "\": " + ex.ToString());
// }
// Make sure we have config
if (ConfigSource.Configs["SECS"] == null)
ConfigSource.AddConfig("SECS");
ScriptConfigSource = ConfigSource.Configs["SECS"];
// Is SECS enabled?
if (ScriptConfigSource.GetBoolean("Enabled", false))
{
LoadEngine();
if (scriptEngine != null)
scriptEngine.Initialise(scene, source);
}
}
public void PostInitialise()
{
// Nothing
if (scriptEngine != null)
scriptEngine.PostInitialise();
}
public void Close()
@@ -76,18 +82,34 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine
}
catch (Exception ex)
{
scriptEngine.m_log.Error("[ScriptEngine]: Unable to close engine \"" + tempScriptEngineName + "\": " + ex.ToString());
m_log.ErrorFormat("[{0}] Unable to close engine \"{1}\": {2}", Name, tempScriptEngineName, ex.ToString());
}
}
public string Name
private void LoadEngine()
{
get { return "ScriptEngine Region Loader"; }
m_log.DebugFormat("[{0}] Loading region script engine engine \"{1}\".", Name, tempScriptEngineName);
try
{
lock (ScriptEnginePlugin.scriptEngines)
{
if (!ScriptEnginePlugin.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
IScriptEngine;
}
}
}
catch (Exception ex)
{
m_log.ErrorFormat("[{0}] Internal error loading region script engine \"{1}\": {2}", Name, tempScriptEngineName, ex.ToString());
}
}
public bool IsSharedModule
{
get { return true; }
}
}
}

View File

@@ -1,182 +0,0 @@
/*
* 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.Reflection;
using System.Text;
using log4net;
using Nini.Config;
using OpenSim.ApplicationPlugins.ScriptEngine.Components;
using OpenSim.Region.Environment.Scenes;
namespace OpenSim.ApplicationPlugins.ScriptEngine
{
public abstract class RegionScriptEngineBase
{
/// <summary>
/// Called on region initialize
/// </summary>
public abstract void Initialize();
public abstract string Name { get; }
/// <summary>
/// Called before components receive Close()
/// </summary>
public abstract void PreClose();
// Hold list of all the different components we have working for us
public List<ComponentBase> Components = new List<ComponentBase>();
public Scene m_Scene;
public IConfigSource m_ConfigSource;
public readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public void Initialize(Scene scene, IConfigSource source)
{
// Region started
m_Scene = scene;
m_ConfigSource = source;
Initialize();
}
/// <summary>
/// Creates instances of script engine components inside "components" List
/// </summary>
/// <param name="ComponentList">Array of comonent names to initialize</param>
public void InitializeComponents(string[] ComponentList)
{
// Take list of providers to initialize and make instances of them
foreach (string c in ComponentList)
{
m_log.Info("[" + Name + "]: Loading: " + c);
lock (Components)
{
lock (ComponentRegistry.providers)
{
try
{
if (ComponentRegistry.providers.ContainsKey(c))
Components.Add(Activator.CreateInstance(ComponentRegistry.providers[c]) as ComponentBase);
else
m_log.Error("[" + Name + "]: Component \"" + c + "\" not found, can not load");
}
catch (Exception ex)
{
m_log.Error("[" + Name + "]: Exception loading \"" + c + "\": " + ex.ToString());
}
}
}
}
// Run Initialize on all our providers, hand over a reference of ourself.
foreach (ComponentBase p in Components.ToArray())
{
try
{
p.Initialize(this);
}
catch (Exception ex)
{
lock (Components)
{
m_log.Error("[" + Name + "]: Error initializing \"" + p.GetType().FullName + "\": " +
ex.ToString());
if (Components.Contains(p))
Components.Remove(p);
}
}
}
// All modules has been initialized, call Start() on them.
foreach (ComponentBase p in Components.ToArray())
{
try
{
p.Start();
}
catch (Exception ex)
{
lock (Components)
{
m_log.Error("[" + Name + "]: Error starting \"" + p.GetType().FullName + "\": " + ex.ToString());
if (Components.Contains(p))
Components.Remove(p);
}
}
}
}
#region Functions to return lists based on type
// Predicate for searching List for a certain type
private static bool FindType<T>(ComponentBase pb)
{
if (pb.GetType() is T)
return true;
return false;
}
public List<ComponentBase> GetCommandComponentList()
{
return Components.FindAll(FindType<CommandBase>);
}
public List<ComponentBase> GetCompilerComponentList()
{
return Components.FindAll(FindType<CompilerBase>);
}
public List<ComponentBase> GetEventComponentList()
{
return Components.FindAll(FindType<EventBase>);
}
public List<ComponentBase> GetScheduleComponentList()
{
return Components.FindAll(FindType<SchedulerBase>);
}
#endregion
public void Close()
{
// We need to shut down
// First call abstracted PreClose()
PreClose();
// Then Call Close() on all components
foreach (ComponentBase p in Components.ToArray())
{
try
{
p.Close();
}
catch (Exception)
{
// TODO: Print error to console
}
}
}
}
}

View File

@@ -1,12 +0,0 @@
<Addin id="ScriptEngine" version="0.1">
<Runtime>
<Import assembly="OpenSim.ApplicationPlugins.ScriptEngine.dll" />
</Runtime>
<Dependencies>
<Addin id="OpenSim" version="0.5" />
<Addin id="RegionProxy" version="0.1" />
</Dependencies>
<Extension path="/OpenSim/Startup">
<Plugin id="ScriptEngine" type="OpenSim.ApplicationPlugins.ScriptEngine.ScriptEnginePlugin" />
</Extension>
</Addin>

View File

@@ -0,0 +1,11 @@
<Addin id="OpenSim.ApplicationPlugins.ScriptEngine" version="0.1">
<Runtime>
<Import assembly="OpenSim.ApplicationPlugins.ScriptEngine.dll" />
</Runtime>
<Dependencies>
<Addin id="OpenSim" version="0.5" />
</Dependencies>
<Extension path = "/OpenSim/Startup">
<Plugin id="ScriptEnginePlugin" type="OpenSim.ApplicationPlugins.ScriptEngine.ScriptEnginePlugin" />
</Extension>
</Addin>

View File

@@ -26,29 +26,143 @@
*/
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
{
/// <summary>
/// Loads all Script Engine Components
/// </summary>
public class ScriptEnginePlugin : IApplicationPlugin
{
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
internal OpenSimBase m_OpenSim;
private ComponentLoader pluginLoader;
// Component providers are registered here wit a name (string)
// When a script engine is created the components are instanciated
public static Dictionary<string, Type> providers = new Dictionary<string, Type>();
public static Dictionary<string, Type> scriptEngines = new Dictionary<string, Type>();
public ScriptEnginePlugin()
{
// Application startup
#if DEBUG
m_log.InfoFormat("[{0}] ##################################", Name);
m_log.InfoFormat("[{0}] # Script Engine Component System #", Name);
m_log.InfoFormat("[{0}] ##################################", Name);
#else
m_log.InfoFormat("[{0}] Script Engine Component System", Name);
#endif
// Load all modules from current directory
// We only want files named OpenSim.ScriptEngine.*.dll
Load(".", "OpenSim.ScriptEngine.*.dll");
}
public void Initialise(OpenSimBase openSim)
{
// Our objective: Load component .dll's
m_OpenSim = openSim;
pluginLoader = new ComponentLoader(this);
m_log.Info("[" + Name + "]: Script Engine Component System");
m_log.Info("[" + Name + "]: Loading Script Engine Components");
pluginLoader.Load("ScriptEngines");
//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
/// <summary>
/// Load components from directory
/// </summary>
/// <param name="directory"></param>
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
/// <summary>
/// Returns the plugin version
@@ -65,16 +179,13 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine
/// <returns>Plugin name, eg MySQL User Provider</returns>
public string Name
{
get { return "ScriptEngine"; }
get { return "SECS"; }
}
/// <summary>
/// Default-initialises the plugin
/// </summary>
public void Initialise()
{
//throw new NotImplementedException();
}
public void Initialise() { }
///<summary>
///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
@@ -85,5 +196,6 @@ namespace OpenSim.ApplicationPlugins.ScriptEngine
//throw new NotImplementedException();
}
#endregion
}
}