From d843b897b20601f0ba32a6f88da31cf5ea88c2ba Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Thu, 14 May 2009 06:18:18 +0000 Subject: Move the connector for the new asset server to a connectors project. Inherit the region module version from this. This enables inter-server connections to reuse connetor code from region modules. --- OpenSim/Framework/IImprovedAssetCache.cs | 39 ++++ .../Asset/RemoteAssetServiceConnector.cs | 193 +--------------- .../Framework/Interfaces/IImprovedAssetCache.cs | 39 ---- .../Connectors/Asset/AssetServiceConnector.cs | 252 +++++++++++++++++++++ prebuild.xml | 31 +++ 5 files changed, 331 insertions(+), 223 deletions(-) create mode 100644 OpenSim/Framework/IImprovedAssetCache.cs delete mode 100644 OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs create mode 100644 OpenSim/Servers/Connectors/Asset/AssetServiceConnector.cs diff --git a/OpenSim/Framework/IImprovedAssetCache.cs b/OpenSim/Framework/IImprovedAssetCache.cs new file mode 100644 index 0000000..e1e9b5f --- /dev/null +++ b/OpenSim/Framework/IImprovedAssetCache.cs @@ -0,0 +1,39 @@ +/* + * 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 OpenSim.Framework; + +namespace OpenSim.Framework +{ + public interface IImprovedAssetCache + { + void Cache(AssetBase asset); + AssetBase Get(string id); + void Expire(string id); + void Clear(); + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs index 4e8b5d6..ec982e5 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs @@ -28,35 +28,32 @@ using log4net; using System; using System.Collections.Generic; -using System.IO; using System.Reflection; using Nini.Config; using OpenSim.Framework; -using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Servers.Connectors; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; -using OpenSim.Framework.Communications; namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset { public class RemoteAssetServicesConnector : - ISharedRegionModule, IAssetService + AssetServicesConnector, ISharedRegionModule, IAssetService { private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); private bool m_Enabled = false; - private string m_ServerURI = String.Empty; - private IImprovedAssetCache m_Cache = null; + private IImprovedAssetCache m_Cache; public string Name { get { return "RemoteAssetServicesConnector"; } } - public void Initialise(IConfigSource source) + public override void Initialise(IConfigSource source) { IConfig moduleConfig = source.Configs["Modules"]; if (moduleConfig != null) @@ -71,16 +68,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset return; } - string serviceURI = assetConfig.GetString("AssetServerURI", - String.Empty); - - if (serviceURI == String.Empty) - { - m_log.Error("[ASSET CONNECTOR]: No Server URI named in section AssetService"); - return; - } m_Enabled = true; - m_ServerURI = serviceURI; + + base.Initialise(source); m_log.Info("[ASSET CONNECTOR]: Remote assets enabled"); } @@ -121,6 +111,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset // if (!(m_Cache is ISharedRegionModule)) m_Cache = null; + else + SetCache(m_Cache); + } m_log.InfoFormat("[ASSET CONNECTOR]: Enabled remote assets for region {0}", scene.RegionInfo.RegionName); @@ -130,173 +123,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName); } } - - public AssetBase Get(string id) - { - string uri = m_ServerURI + "/assets/" + id; - - AssetBase asset = null; - if (m_Cache != null) - asset = m_Cache.Get(id); - - if (asset == null) - { - asset = SynchronousRestObjectRequester. - MakeRequest("GET", uri, 0); - - if (m_Cache != null) - m_Cache.Cache(asset); - } - return asset; - } - - public AssetMetadata GetMetadata(string id) - { - if (m_Cache != null) - { - AssetBase fullAsset = m_Cache.Get(id); - - if (fullAsset != null) - return fullAsset.Metadata; - } - - string uri = m_ServerURI + "/assets/" + id + "/metadata"; - - AssetMetadata asset = SynchronousRestObjectRequester. - MakeRequest("GET", uri, 0); - return asset; - } - - public byte[] GetData(string id) - { - if (m_Cache != null) - { - AssetBase fullAsset = m_Cache.Get(id); - - if (fullAsset != null) - return fullAsset.Data; - } - - RestClient rc = new RestClient(m_ServerURI); - rc.AddResourcePath("assets"); - rc.AddResourcePath(id); - rc.AddResourcePath("data"); - - rc.RequestMethod = "GET"; - - Stream s = rc.Request(); - - if (s == null) - return null; - - if (s.Length > 0) - { - byte[] ret = new byte[s.Length]; - s.Read(ret, 0, (int)s.Length); - - return ret; - } - - return null; - } - - public bool Get(string id, Object sender, AssetRetrieved handler) - { - string uri = m_ServerURI + "/assets/" + id; - - AssetBase asset = null; - if (m_Cache != null) - asset = m_Cache.Get(id); - - if (asset == null) - { - AsynchronousRestObjectRequester. - MakeRequest("GET", uri, 0, - delegate(AssetBase a) - { - if (m_Cache != null) - m_Cache.Cache(a); - handler(id, sender, a); - }); - - } - else - { - handler(id, sender, asset); - } - - return true; - } - - public string Store(AssetBase asset) - { - if (asset.Temporary || asset.Local) - { - if (m_Cache != null) - m_Cache.Cache(asset); - - return asset.ID; - } - - string uri = m_ServerURI + "/assets/"; - - string newID = SynchronousRestObjectRequester. - MakeRequest("POST", uri, asset); - - if (newID != String.Empty) - { - asset.ID = newID; - - if (m_Cache != null) - m_Cache.Cache(asset); - } - return newID; - } - - public bool UpdateContent(string id, byte[] data) - { - AssetBase asset = null; - - if (m_Cache != null) - asset = m_Cache.Get(id); - - if (asset == null) - { - AssetMetadata metadata = GetMetadata(id); - if (metadata == null) - return false; - - asset = new AssetBase(); - asset.Metadata = metadata; - } - asset.Data = data; - - string uri = m_ServerURI + "/assets/" + id; - - if (SynchronousRestObjectRequester. - MakeRequest("POST", uri, asset)) - { - if (m_Cache != null) - m_Cache.Cache(asset); - - return true; - } - return false; - } - - public bool Delete(string id) - { - string uri = m_ServerURI + "/assets/" + id; - - if (SynchronousRestObjectRequester. - MakeRequest("DELETE", uri, 0)) - { - if (m_Cache != null) - m_Cache.Expire(id); - - return true; - } - return false; - } } } diff --git a/OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs b/OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs deleted file mode 100644 index b213284..0000000 --- a/OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs +++ /dev/null @@ -1,39 +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 OpenSim.Framework; - -namespace OpenSim.Region.Framework.Interfaces -{ - public interface IImprovedAssetCache - { - void Cache(AssetBase asset); - AssetBase Get(string id); - void Expire(string id); - void Clear(); - } -} diff --git a/OpenSim/Servers/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Servers/Connectors/Asset/AssetServiceConnector.cs new file mode 100644 index 0000000..efd5eea --- /dev/null +++ b/OpenSim/Servers/Connectors/Asset/AssetServiceConnector.cs @@ -0,0 +1,252 @@ +/* + * 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 log4net; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Services.Interfaces; + +namespace OpenSim.Servers.Connectors +{ + public class AssetServicesConnector : IAssetService + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private string m_ServerURI = String.Empty; + private IImprovedAssetCache m_Cache = null; + + public AssetServicesConnector() + { + } + + public AssetServicesConnector(IConfigSource source) + { + Initialise(source); + } + + public virtual void Initialise(IConfigSource source) + { + IConfig assetConfig = source.Configs["AssetService"]; + if (assetConfig == null) + { + m_log.Error("[ASSET CONNECTOR]: AssetService missing from OpanSim.ini"); + throw new Exception("Asset connector init error"); + } + + string serviceURI = assetConfig.GetString("AssetServerURI", + String.Empty); + + if (serviceURI == String.Empty) + { + m_log.Error("[ASSET CONNECTOR]: No Server URI named in section AssetService"); + throw new Exception("Asset connector init error"); + } + m_ServerURI = serviceURI; + } + + protected void SetCache(IImprovedAssetCache cache) + { + m_Cache = cache; + } + + public AssetBase Get(string id) + { + string uri = m_ServerURI + "/assets/" + id; + + AssetBase asset = null; + if (m_Cache != null) + asset = m_Cache.Get(id); + + if (asset == null) + { + asset = SynchronousRestObjectRequester. + MakeRequest("GET", uri, 0); + + if (m_Cache != null) + m_Cache.Cache(asset); + } + return asset; + } + + public AssetMetadata GetMetadata(string id) + { + if (m_Cache != null) + { + AssetBase fullAsset = m_Cache.Get(id); + + if (fullAsset != null) + return fullAsset.Metadata; + } + + string uri = m_ServerURI + "/assets/" + id + "/metadata"; + + AssetMetadata asset = SynchronousRestObjectRequester. + MakeRequest("GET", uri, 0); + return asset; + } + + public byte[] GetData(string id) + { + if (m_Cache != null) + { + AssetBase fullAsset = m_Cache.Get(id); + + if (fullAsset != null) + return fullAsset.Data; + } + + RestClient rc = new RestClient(m_ServerURI); + rc.AddResourcePath("assets"); + rc.AddResourcePath(id); + rc.AddResourcePath("data"); + + rc.RequestMethod = "GET"; + + Stream s = rc.Request(); + + if (s == null) + return null; + + if (s.Length > 0) + { + byte[] ret = new byte[s.Length]; + s.Read(ret, 0, (int)s.Length); + + return ret; + } + + return null; + } + + public bool Get(string id, Object sender, AssetRetrieved handler) + { + string uri = m_ServerURI + "/assets/" + id; + + AssetBase asset = null; + if (m_Cache != null) + asset = m_Cache.Get(id); + + if (asset == null) + { + AsynchronousRestObjectRequester. + MakeRequest("GET", uri, 0, + delegate(AssetBase a) + { + if (m_Cache != null) + m_Cache.Cache(a); + handler(id, sender, a); + }); + + } + else + { + handler(id, sender, asset); + } + + return true; + } + + public string Store(AssetBase asset) + { + if (asset.Temporary || asset.Local) + { + if (m_Cache != null) + m_Cache.Cache(asset); + + return asset.ID; + } + + string uri = m_ServerURI + "/assets/"; + + string newID = SynchronousRestObjectRequester. + MakeRequest("POST", uri, asset); + + if (newID != String.Empty) + { + asset.ID = newID; + + if (m_Cache != null) + m_Cache.Cache(asset); + } + return newID; + } + + public bool UpdateContent(string id, byte[] data) + { + AssetBase asset = null; + + if (m_Cache != null) + asset = m_Cache.Get(id); + + if (asset == null) + { + AssetMetadata metadata = GetMetadata(id); + if (metadata == null) + return false; + + asset = new AssetBase(); + asset.Metadata = metadata; + } + asset.Data = data; + + string uri = m_ServerURI + "/assets/" + id; + + if (SynchronousRestObjectRequester. + MakeRequest("POST", uri, asset)) + { + if (m_Cache != null) + m_Cache.Cache(asset); + + return true; + } + return false; + } + + public bool Delete(string id) + { + string uri = m_ServerURI + "/assets/" + id; + + if (SynchronousRestObjectRequester. + MakeRequest("DELETE", uri, 0)) + { + if (m_Cache != null) + m_Cache.Expire(id); + + return true; + } + return false; + } + } +} diff --git a/prebuild.xml b/prebuild.xml index 87e8643..c3f8458 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1352,6 +1352,36 @@ + + + + ../../../bin/ + + + + + ../../../bin/ + + + + ../../../bin/ + + + + + + + + + + + + + + + + + @@ -1439,6 +1469,7 @@ + -- cgit v1.1