From f55bba8019733f5de8e6e6453da6046cb49495fa Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sat, 23 Feb 2008 02:43:40 +0000 Subject: [PATCH] * Rex Merges, Grid/AssetServer --- OpenSim/Grid/AssetServer/Main.cs | 384 +++++++++--------- .../AssetServer/Properties/AssemblyInfo.cs | 126 +++--- OpenSim/Grid/AssetServer/RestService.cs | 287 +++++++------ 3 files changed, 413 insertions(+), 384 deletions(-) diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs index 922857f5ce..35e6495642 100644 --- a/OpenSim/Grid/AssetServer/Main.cs +++ b/OpenSim/Grid/AssetServer/Main.cs @@ -1,189 +1,195 @@ -/* -* 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.Reflection; -using libsecondlife; -using OpenSim.Framework; -using OpenSim.Framework.AssetLoader.Filesystem; -using OpenSim.Framework.Console; -using OpenSim.Framework.Servers; - -namespace OpenSim.Grid.AssetServer -{ - /// - /// An asset server - /// - public class OpenAsset_Main : conscmd_callback - { - public AssetConfig m_config; - - public static OpenAsset_Main assetserver; - - private LogBase m_console; - - // Temporarily hardcoded - should be a plugin - protected IAssetLoader assetLoader = new AssetLoaderFileSystem(); - - private IAssetProvider m_assetProvider; - - [STAThread] - public static void Main(string[] args) - { - Console.WriteLine("Starting...\n"); - - assetserver = new OpenAsset_Main(); - assetserver.Startup(); - - assetserver.Work(); - } - - private void Work() - { - m_console.Notice("Enter help for a list of commands"); - - while (true) - { - m_console.MainLogPrompt(); - } - } - - private OpenAsset_Main() - { - if (!Directory.Exists(Util.logDir())) - { - Directory.CreateDirectory(Util.logDir()); - } - m_console = - new LogBase((Path.Combine(Util.logDir(), "opengrid-AssetServer-console.log")), "OpenAsset", this, true); - MainLog.Instance = m_console; - } - - public void Startup() - { - m_config = new AssetConfig("ASSET SERVER", (Path.Combine(Util.configDir(), "AssetServer_Config.xml"))); - - m_console.Verbose("ASSET", "Setting up asset DB"); - setupDB(m_config); - - m_console.Verbose("ASSET", "Loading default asset set.."); - LoadDefaultAssets(); - - m_console.Verbose("ASSET", "Starting HTTP process"); - BaseHttpServer httpServer = new BaseHttpServer(m_config.HttpPort); - - httpServer.AddStreamHandler(new GetAssetStreamHandler(this, m_assetProvider)); - httpServer.AddStreamHandler(new PostAssetStreamHandler(this, m_assetProvider)); - - httpServer.Start(); - } - - public byte[] GetAssetData(LLUUID assetID, bool isTexture) - { - return null; - } - - public IAssetProvider LoadDatabasePlugin(string FileName) - { - MainLog.Instance.Verbose("ASSET SERVER", "LoadDatabasePlugin: Attempting to load " + FileName); - Assembly pluginAssembly = Assembly.LoadFrom(FileName); - IAssetProvider assetPlugin = null; - foreach (Type pluginType in pluginAssembly.GetTypes()) - { - if (!pluginType.IsAbstract) - { - Type typeInterface = pluginType.GetInterface("IAssetProvider", true); - - if (typeInterface != null) - { - IAssetProvider plug = - (IAssetProvider) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); - assetPlugin = plug; - assetPlugin.Initialise(); - - MainLog.Instance.Verbose("ASSET SERVER", "Added " + assetPlugin.Name + " " + assetPlugin.Version); - break; - } - - typeInterface = null; - } - } - - pluginAssembly = null; - return assetPlugin; - } - - public void setupDB(AssetConfig config) - { - try - { - m_assetProvider = LoadDatabasePlugin(config.DatabaseProvider); - if (m_assetProvider == null) - { - MainLog.Instance.Error("ASSET", "Failed to load a database plugin, server halting"); - Environment.Exit(-1); - } - } - catch (Exception e) - { - MainLog.Instance.Warn("ASSET", "setupDB() - Exception occured"); - MainLog.Instance.Warn("ASSET", e.ToString()); - } - } - - public void LoadDefaultAssets() - { - assetLoader.ForEachDefaultXmlAsset(StoreAsset); - } - - protected void StoreAsset(AssetBase asset) - { - m_assetProvider.CreateAsset(asset); - } - - public void RunCmd(string cmd, string[] cmdparams) - { - switch (cmd) - { - case "help": - m_console.Notice("shutdown - shutdown this asset server (USE CAUTION!)"); - break; - - case "shutdown": - m_console.Close(); - Environment.Exit(0); - break; - } - } - - public void Show(string ShowWhat) - { - } - } -} \ No newline at end of file +/* +* 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.Reflection; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.AssetLoader.Filesystem; +using OpenSim.Framework.Console; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Statistics; + +namespace OpenSim.Grid.AssetServer +{ + /// + /// An asset server + /// + public class OpenAsset_Main : BaseOpenSimServer, conscmd_callback + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + public AssetConfig m_config; + + public static OpenAsset_Main assetserver; + + // Temporarily hardcoded - should be a plugin + protected IAssetLoader assetLoader = new AssetLoaderFileSystem(); + + private IAssetProvider m_assetProvider; + + [STAThread] + public static void Main(string[] args) + { + log4net.Config.XmlConfigurator.Configure(); + + m_log.Info("Starting...\n"); + + assetserver = new OpenAsset_Main(); + assetserver.Startup(); + + assetserver.Work(); + } + + private void Work() + { + m_console.Notice("Enter help for a list of commands"); + + while (true) + { + m_console.Prompt(); + } + } + + private OpenAsset_Main() + { + m_console = new ConsoleBase("OpenAsset", this); + + MainConsole.Instance = m_console; + } + + public void Startup() + { + m_config = new AssetConfig("ASSET SERVER", (Path.Combine(Util.configDir(), "AssetServer_Config.xml"))); + + m_log.Info("[ASSET]: Setting up asset DB"); + setupDB(m_config); + + m_log.Info("[ASSET]: Loading default asset set.."); + LoadDefaultAssets(); + + m_log.Info("[ASSET]: Starting HTTP process"); + BaseHttpServer httpServer = new BaseHttpServer(m_config.HttpPort); + + StatsManager.StartCollectingAssetStats(); + + httpServer.AddStreamHandler(new GetAssetStreamHandler(this, m_assetProvider)); + httpServer.AddStreamHandler(new PostAssetStreamHandler(this, m_assetProvider)); + + httpServer.Start(); + } + + public byte[] GetAssetData(LLUUID assetID, bool isTexture) + { + return null; + } + + public IAssetProvider LoadDatabasePlugin(string FileName) + { + m_log.Info("[ASSET SERVER]: LoadDatabasePlugin: Attempting to load " + FileName); + Assembly pluginAssembly = Assembly.LoadFrom(FileName); + IAssetProvider assetPlugin = null; + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IAssetProvider", true); + + if (typeInterface != null) + { + IAssetProvider plug = + (IAssetProvider) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + assetPlugin = plug; + assetPlugin.Initialise(); + + m_log.Info("[ASSET SERVER]: Added " + assetPlugin.Name + " " + assetPlugin.Version); + break; + } + + typeInterface = null; + } + } + + pluginAssembly = null; + return assetPlugin; + } + + public void setupDB(AssetConfig config) + { + try + { + m_assetProvider = LoadDatabasePlugin(config.DatabaseProvider); + if (m_assetProvider == null) + { + m_log.Error("[ASSET]: Failed to load a database plugin, server halting"); + Environment.Exit(-1); + } + } + catch (Exception e) + { + m_log.Warn("[ASSET]: setupDB() - Exception occured"); + m_log.Warn("[ASSET]: " + e.ToString()); + } + } + + public void LoadDefaultAssets() + { + assetLoader.ForEachDefaultXmlAsset(StoreAsset); + } + + protected void StoreAsset(AssetBase asset) + { + m_assetProvider.CreateAsset(asset); + } + + public override void RunCmd(string cmd, string[] cmdparams) + { + base.RunCmd(cmd, cmdparams); + + switch (cmd) + { + case "help": + m_console.Notice( + @"shutdown - shutdown this asset server (USE CAUTION!) + stats - statistical information for this server"); + + break; + + case "stats": + m_console.Notice("STATS", Environment.NewLine + StatsManager.AssetStats.Report()); + break; + + case "shutdown": + m_console.Close(); + Environment.Exit(0); + break; + } + } + } +} diff --git a/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs b/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs index 453d238e18..da4b435057 100644 --- a/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs +++ b/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs @@ -1,63 +1,63 @@ -/* -* 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.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly : AssemblyTitle("OGS-AssetServer")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("")] -[assembly : AssemblyProduct("OGS-AssetServer")] -[assembly : AssemblyCopyright("Copyright © 2007")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly : ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly : Guid("b541b244-3d1d-4625-9003-bc2a3a6a39a4")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// - -[assembly : AssemblyVersion("1.0.0.0")] -[assembly : AssemblyFileVersion("1.0.0.0")] \ No newline at end of file +/* +* 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.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly : AssemblyTitle("OGS-AssetServer")] +[assembly : AssemblyDescription("")] +[assembly : AssemblyConfiguration("")] +[assembly : AssemblyCompany("")] +[assembly : AssemblyProduct("OGS-AssetServer")] +[assembly : AssemblyCopyright("Copyright © OpenSimulator.org Developers 2007-2008")] +[assembly : AssemblyTrademark("")] +[assembly : AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly : ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly : Guid("b541b244-3d1d-4625-9003-bc2a3a6a39a4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// + +[assembly : AssemblyVersion("1.0.0.0")] +[assembly : AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Grid/AssetServer/RestService.cs b/OpenSim/Grid/AssetServer/RestService.cs index 0ce4fd8003..7e6e84c19b 100644 --- a/OpenSim/Grid/AssetServer/RestService.cs +++ b/OpenSim/Grid/AssetServer/RestService.cs @@ -1,132 +1,155 @@ -/* -* 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.Text; -using System.Xml; -using System.Xml.Serialization; -using libsecondlife; -using OpenSim.Framework; -using OpenSim.Framework.Console; -using OpenSim.Framework.Servers; - -namespace OpenSim.Grid.AssetServer -{ - public class GetAssetStreamHandler : BaseStreamHandler - { - private OpenAsset_Main m_assetManager; - private IAssetProvider m_assetProvider; - - public override byte[] Handle(string path, Stream request) - { - MainLog.Instance.Verbose("REST", "In Handle"); - string param = GetParam(path); - byte[] result = new byte[] {}; - try - { - string[] p = param.Split(new char[] {'/', '?', '&'}, StringSplitOptions.RemoveEmptyEntries); - - if (p.Length > 0) - { - LLUUID assetID = LLUUID.Parse(p[0]); - - MainLog.Instance.Verbose("REST", "GET:/asset fetch param={0} UUID={1}", param, assetID); - AssetBase asset = m_assetProvider.FetchAsset(assetID); - if (asset != null) - { - MainLog.Instance.Verbose("REST", "GET:/asset found {0}, {1}", assetID, asset.Name); - - XmlSerializer xs = new XmlSerializer(typeof (AssetBase)); - MemoryStream ms = new MemoryStream(); - XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); - xw.Formatting = Formatting.Indented; - xs.Serialize(xw, asset); - xw.Flush(); - - ms.Seek(0, SeekOrigin.Begin); - StreamReader sr = new StreamReader(ms); - - result = ms.GetBuffer(); - MainLog.Instance.Verbose("REST", "Buffer: {0}", result); - Array.Resize(ref result, (int) ms.Length); - } - else - { - MainLog.Instance.Verbose("REST", "GET:/asset failed to find {0}", assetID); - } - } - } - catch (Exception e) - { - MainLog.Instance.Error(e.ToString()); - } - return result; - } - - public GetAssetStreamHandler(OpenAsset_Main assetManager, IAssetProvider assetProvider) - : base("GET", "/assets") - { - MainLog.Instance.Verbose("REST", "In Get Request"); - m_assetManager = assetManager; - m_assetProvider = assetProvider; - } - } - - public class PostAssetStreamHandler : BaseStreamHandler - { - private OpenAsset_Main m_assetManager; - private IAssetProvider m_assetProvider; - - public override byte[] Handle(string path, Stream request) - { - string param = GetParam(path); - - LLUUID assetId; - if (param.Length > 0) - LLUUID.TryParse(param, out assetId); - byte[] txBuffer = new byte[4096]; - - XmlSerializer xs = new XmlSerializer(typeof (AssetBase)); - AssetBase asset = (AssetBase) xs.Deserialize(request); - - MainLog.Instance.Verbose("REST", "StoreAndCommitAsset {0}", asset.FullID); - m_assetProvider.CreateAsset(asset); - m_assetProvider.CommitAssets(); - - return new byte[] {}; - } - - public PostAssetStreamHandler(OpenAsset_Main assetManager, IAssetProvider assetProvider) - : base("POST", "/assets") - { - m_assetManager = assetManager; - m_assetProvider = assetProvider; - } - } -} \ No newline at end of file +/* +* 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.Text; +using System.Xml; +using System.Xml.Serialization; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Statistics; + +namespace OpenSim.Grid.AssetServer +{ + public class GetAssetStreamHandler : BaseStreamHandler + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + private OpenAsset_Main m_assetManager; + private IAssetProvider m_assetProvider; + + /// + /// Constructor. + /// + /// + /// + public GetAssetStreamHandler(OpenAsset_Main assetManager, IAssetProvider assetProvider) + : base("GET", "/assets") + { + m_log.Info("[REST]: In Get Request"); + m_assetManager = assetManager; + m_assetProvider = assetProvider; + } + + public override byte[] Handle(string path, Stream request) + { + string param = GetParam(path); + byte[] result = new byte[] {}; + try + { + string[] p = param.Split(new char[] {'/', '?', '&'}, StringSplitOptions.RemoveEmptyEntries); + + if (p.Length > 0) + { + LLUUID assetID = null; + + if (!LLUUID.TryParse(p[0], out assetID)) + { + m_log.InfoFormat( + "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]); + return result; + } + + if (StatsManager.AssetStats != null) + StatsManager.AssetStats.AddRequest(); + + AssetBase asset = m_assetProvider.FetchAsset(assetID); + if (asset != null) + { + XmlSerializer xs = new XmlSerializer(typeof (AssetBase)); + MemoryStream ms = new MemoryStream(); + XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); + xw.Formatting = Formatting.Indented; + xs.Serialize(xw, asset); + xw.Flush(); + + ms.Seek(0, SeekOrigin.Begin); + //StreamReader sr = new StreamReader(ms); + + result = ms.GetBuffer(); + + m_log.InfoFormat( + "[REST]: GET:/asset found {0} with name {1}, size {2} bytes", + assetID, asset.Name, result.Length); + + Array.Resize(ref result, (int) ms.Length); + } + else + { + if (StatsManager.AssetStats != null) + StatsManager.AssetStats.AddNotFoundRequest(); + + m_log.InfoFormat("[REST]: GET:/asset failed to find {0}", assetID); + } + } + } + catch (Exception e) + { + m_log.Error(e.ToString()); + } + return result; + } + } + + public class PostAssetStreamHandler : BaseStreamHandler + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + private OpenAsset_Main m_assetManager; + private IAssetProvider m_assetProvider; + + public override byte[] Handle(string path, Stream request) + { + string param = GetParam(path); + + LLUUID assetId; + if (param.Length > 0) + LLUUID.TryParse(param, out assetId); + byte[] txBuffer = new byte[4096]; + + XmlSerializer xs = new XmlSerializer(typeof (AssetBase)); + AssetBase asset = (AssetBase) xs.Deserialize(request); + + m_log.InfoFormat("[REST]: StoreAndCommitAsset {0}", asset.FullID); + m_assetProvider.CreateAsset(asset); + m_assetProvider.CommitAssets(); + + return new byte[] {}; + } + + public PostAssetStreamHandler(OpenAsset_Main assetManager, IAssetProvider assetProvider) + : base("POST", "/assets") + { + m_assetManager = assetManager; + m_assetProvider = assetProvider; + } + } +}