From 461e213a39f907dda30f5f1b8437178bc99ef55f Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 11 May 2009 02:59:26 +0000
Subject: Plumb the HG asset broker. More naming changes to clarify things.
Lots more config options.
---
.../Resources/CoreModulePlugin.addin.xml | 1 +
.../ServiceConnectors/Asset/HGAssetBroker.cs | 320 +++++++++++++++++++++
.../Asset/HGAssetServiceConnector.cs | 165 -----------
.../Asset/LocalAssetServiceConnector.cs | 4 +-
4 files changed, 323 insertions(+), 167 deletions(-)
create mode 100644 OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs
delete mode 100644 OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetServiceConnector.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index b3a9c98..43c5a58 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -15,6 +15,7 @@
+
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs
new file mode 100644
index 0000000..37589fa
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs
@@ -0,0 +1,320 @@
+/*
+ * 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 Nini.Config;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using OpenSim.Framework;
+using OpenSim.Servers.Base;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
+{
+ public class HGAssetBroker :
+ ISharedRegionModule, IAssetService
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ private IImprovedAssetCache m_Cache = null;
+ private IAssetService m_LocalService;
+ private IAssetService m_HGService;
+
+ private bool m_Enabled = false;
+
+ public string Name
+ {
+ get { return "HGAssetBroker"; }
+ }
+
+ public void Initialise(IConfigSource source)
+ {
+ IConfig moduleConfig = source.Configs["Modules"];
+ if (moduleConfig != null)
+ {
+ string name = moduleConfig.GetString("AssetServices", "");
+ if (name == Name)
+ {
+ IConfig assetConfig = source.Configs["AssetService"];
+ if (assetConfig == null)
+ {
+ m_log.Error("[ASSET CONNECTOR]: AssetService missing from OpanSim.ini");
+ return;
+ }
+
+ string localDll = assetConfig.GetString("LocalModule",
+ String.Empty);
+ string HGDll = assetConfig.GetString("HypergridModule",
+ String.Empty);
+
+ if (localDll == String.Empty)
+ {
+ m_log.Error("[ASSET CONNECTOR]: No LocalModule named in section AssetService");
+ return;
+ }
+
+ if (HGDll == String.Empty)
+ {
+ m_log.Error("[ASSET CONNECTOR]: No HypergridModule named in section AssetService");
+ return;
+ }
+
+ Object[] args = new Object[] { source };
+ m_LocalService =
+ ServerUtils.LoadPlugin(localDll,
+ args);
+
+ m_HGService =
+ ServerUtils.LoadPlugin(HGDll,
+ args);
+
+ if (m_LocalService == null)
+ {
+ m_log.Error("[ASSET CONNECTOR]: Can't load local asset service");
+ return;
+ }
+ if (m_HGService == null)
+ {
+ m_log.Error("[ASSET CONNECTOR]: Can't load hypergrid asset service");
+ return;
+ }
+
+ m_Enabled = true;
+ m_log.Info("[ASSET CONNECTOR]: HG asset broker enabled");
+ }
+ }
+ }
+
+ public void PostInitialise()
+ {
+ }
+
+ public void Close()
+ {
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ scene.RegisterModuleInterface(this);
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ if (m_Cache == null)
+ {
+ m_Cache = scene.RequestModuleInterface();
+
+ if (!(m_Cache is ISharedRegionModule))
+ m_Cache = null;
+ }
+
+ m_log.InfoFormat("[ASSET CONNECTOR]: Enabled hypergrid asset broker for region {0}", scene.RegionInfo.RegionName);
+
+ if (m_Cache != null)
+ {
+ m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
+ }
+ }
+
+ private bool IsHG(string id)
+ {
+ Uri assetUri;
+
+ if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) &&
+ assetUri.Scheme == Uri.UriSchemeHttp)
+ return true;
+
+ return false;
+ }
+
+ public AssetBase Get(string id)
+ {
+ AssetBase asset = null;
+
+ if (m_Cache != null)
+ {
+ m_Cache.Get(id);
+
+ if (asset != null)
+ return asset;
+ }
+
+ if (IsHG(id))
+ asset = m_HGService.Get(id);
+ else
+ asset = m_LocalService.Get(id);
+
+ if (asset != null)
+ {
+ if (m_Cache != null)
+ m_Cache.Cache(asset);
+ }
+
+ return asset;
+ }
+
+ public AssetMetadata GetMetadata(string id)
+ {
+ AssetBase asset = null;
+
+ if (m_Cache != null)
+ {
+ if (m_Cache != null)
+ m_Cache.Get(id);
+
+ if (asset != null)
+ return asset.Metadata;
+ }
+
+ AssetMetadata metadata;
+
+ if (IsHG(id))
+ metadata = m_HGService.GetMetadata(id);
+ else
+ metadata = m_LocalService.GetMetadata(id);
+
+ return metadata;
+ }
+
+ public byte[] GetData(string id)
+ {
+ AssetBase asset = null;
+
+ if (m_Cache != null)
+ {
+ if (m_Cache != null)
+ m_Cache.Get(id);
+
+ if (asset != null)
+ return asset.Data;
+ }
+
+ if (IsHG(id))
+ asset = m_HGService.Get(id);
+ else
+ asset = m_LocalService.Get(id);
+
+ if (asset != null)
+ {
+ if (m_Cache != null)
+ m_Cache.Cache(asset);
+ return asset.Data;
+ }
+
+ return null;
+ }
+
+ public bool Get(string id, Object sender, AssetRetrieved handler)
+ {
+ AssetBase asset = null;
+
+ if (m_Cache != null)
+ asset = m_Cache.Get(id);
+
+ if (asset != null)
+ {
+ handler(id, sender, asset);
+ return true;
+ }
+
+ if (IsHG(id))
+ {
+ return m_HGService.Get(id, sender, delegate (string assetID, Object s, AssetBase a)
+ {
+ if (a != null && m_Cache != null)
+ m_Cache.Cache(a);
+ handler(assetID, s, a);
+ });
+ }
+ else
+ {
+ return m_LocalService.Get(id, sender, delegate (string assetID, Object s, AssetBase a)
+ {
+ if (a != null && m_Cache != null)
+ m_Cache.Cache(a);
+ handler(assetID, s, a);
+ });
+ }
+ }
+
+ public string Store(AssetBase asset)
+ {
+ if (m_Cache != null)
+ m_Cache.Cache(asset);
+
+ if (IsHG(asset.ID))
+ return m_HGService.Store(asset);
+ else
+ return m_LocalService.Store(asset);
+ }
+
+ public bool UpdateContent(string id, byte[] data)
+ {
+ AssetBase asset = null;
+
+ if (m_Cache != null)
+ asset = m_Cache.Get(id);
+
+ if (asset != null)
+ {
+ asset.Data = data;
+ m_Cache.Cache(asset);
+ }
+
+ if (IsHG(id))
+ return m_HGService.UpdateContent(id, data);
+ else
+ return m_LocalService.UpdateContent(id, data);
+ }
+
+ public bool Delete(string id)
+ {
+ if (m_Cache != null)
+ m_Cache.Expire(id);
+
+ if (IsHG(id))
+ return m_HGService.Delete(id);
+ else
+ return m_LocalService.Delete(id);
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetServiceConnector.cs
deleted file mode 100644
index 58cc134..0000000
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetServiceConnector.cs
+++ /dev/null
@@ -1,165 +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 log4net;
-using Nini.Config;
-using System;
-using System.Collections.Generic;
-using System.Reflection;
-using OpenSim.Framework;
-using OpenSim.Servers.Base;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using OpenSim.Services.Interfaces;
-
-namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
-{
- public class HGAssetServicesConnector :
- ISharedRegionModule, IAssetService
- {
- private static readonly ILog m_log =
- LogManager.GetLogger(
- MethodBase.GetCurrentMethod().DeclaringType);
-
- private IImprovedAssetCache m_Cache = null;
-
- private bool m_Enabled = false;
-
- public string Name
- {
- get { return "HGAssetServicesConnector"; }
- }
-
- public void Initialise(IConfigSource source)
- {
- IConfig moduleConfig = source.Configs["Modules"];
- if (moduleConfig != null)
- {
- string name = moduleConfig.GetString("AssetServices", "");
- if (name == Name)
- {
- IConfig assetConfig = source.Configs["AssetService"];
- if (assetConfig == null)
- {
- m_log.Error("[ASSET CONNECTOR]: AssetService missing from OpanSim.ini");
- return;
- }
-
- m_Enabled = true;
- m_log.Info("[ASSET CONNECTOR]: HG asset connector enabled");
- }
- }
- }
-
- public void PostInitialise()
- {
- }
-
- public void Close()
- {
- }
-
- public void AddRegion(Scene scene)
- {
- if (!m_Enabled)
- return;
-
- scene.RegisterModuleInterface(this);
- }
-
- public void RemoveRegion(Scene scene)
- {
- }
-
- public void RegionLoaded(Scene scene)
- {
- if (!m_Enabled)
- return;
-
- if (m_Cache == null)
- {
- m_Cache = scene.RequestModuleInterface();
-
- if (!(m_Cache is ISharedRegionModule))
- m_Cache = null;
- }
-
- m_log.InfoFormat("[ASSET CONNECTOR]: Enabled local assets for region {0}", scene.RegionInfo.RegionName);
-
- if (m_Cache != null)
- {
- m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
- }
- }
-
- //
- // Note to Diva:
- //
- // This is not the broker!
- // This module is not supposed to route anything anywhere. This is where
- // the code to access remote assets (by URL) goes. It can be assumed
- // that the ID is a URL. The broker makes sure of that.
- //
- // This is a disposable comment :) Feel free to remove it
- //
-
- public AssetBase Get(string id)
- {
- return null;
- }
-
- public AssetMetadata GetMetadata(string id)
- {
- return null;
- }
-
- public byte[] GetData(string id)
- {
- return null;
- }
-
- public bool Get(string id, Object sender, AssetRetrieved handler)
- {
- return false;
- }
-
- public string Store(AssetBase asset)
- {
- return String.Empty;
- }
-
- public bool UpdateContent(string id, byte[] data)
- {
- return false;
- }
-
- public bool Delete(string id)
- {
- return false;
- }
- }
-}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs
index 6f0a7f8..1aaf552 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs
@@ -71,12 +71,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
return;
}
- string serviceDll = assetConfig.GetString("Module",
+ string serviceDll = assetConfig.GetString("LocalServiceModule",
String.Empty);
if (serviceDll == String.Empty)
{
- m_log.Error("[ASSET CONNECTOR]: No ServiceDll named in section AssetService");
+ m_log.Error("[ASSET CONNECTOR]: No LocalServiceModule named in section AssetService");
return;
}
--
cgit v1.1