From d8e1842d2507b2c18b21671ed01496b3a2c59e18 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 10 May 2009 12:27:05 +0000
Subject: Add some asset cache plumbing. Change the generic cache from UUID to
 string keys to allow caching the new crop of URI identified objects.

---
 OpenSim/Framework/Cache.cs                         | 46 +++++++++++-----------
 OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs | 32 +++++++++------
 .../CoreModules/Avatar/Friends/FriendsModule.cs    | 16 ++++----
 .../Asset/LocalAssetServiceConnector.cs            | 23 +++++++++++
 .../Asset/RemoteAssetServiceConnector.cs           | 19 +++++++++
 .../CoreModules/World/Land/LandManagementModule.cs |  4 +-
 OpenSim/Region/Framework/Interfaces/IAssetCache.cs | 33 ----------------
 .../Framework/Interfaces/IImprovedAssetCache.cs    | 39 ++++++++++++++++++
 OpenSim/Region/Framework/Scenes/Scene.cs           |  6 ++-
 9 files changed, 139 insertions(+), 79 deletions(-)
 delete mode 100644 OpenSim/Region/Framework/Interfaces/IAssetCache.cs
 create mode 100644 OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs

diff --git a/OpenSim/Framework/Cache.cs b/OpenSim/Framework/Cache.cs
index 3dab9b6..2d49146 100644
--- a/OpenSim/Framework/Cache.cs
+++ b/OpenSim/Framework/Cache.cs
@@ -33,8 +33,8 @@ namespace OpenSim.Framework
 {
     // The delegate we will use for performing fetch from backing store
     //
-    public delegate Object FetchDelegate(UUID index);
-    public delegate bool ExpireDelegate(UUID index);
+    public delegate Object FetchDelegate(string index);
+    public delegate bool ExpireDelegate(string index);
 
     // Strategy
     //
@@ -64,14 +64,14 @@ namespace OpenSim.Framework
     }
 
     // The base class of all cache objects. Implements comparison and sorting
-    // by the UUID member.
+    // by the string member.
     //
     // This is not abstract because we need to instantiate it briefly as a
     // method parameter
     //
     public class CacheItemBase : IEquatable<CacheItemBase>, IComparable<CacheItemBase>
     {
-        public UUID uuid;
+        public string uuid;
         public DateTime entered;
         public DateTime lastUsed;
         public DateTime expires = new DateTime(0);
@@ -86,14 +86,14 @@ namespace OpenSim.Framework
         {
         }
 
-        public CacheItemBase(UUID index)
+        public CacheItemBase(string index)
         {
             uuid = index;
             entered = DateTime.Now;
             lastUsed = entered;
         }
 
-        public CacheItemBase(UUID index, DateTime ttl)
+        public CacheItemBase(string index, DateTime ttl)
         {
             uuid = index;
             entered = DateTime.Now;
@@ -123,23 +123,23 @@ namespace OpenSim.Framework
     {
         private Object m_Data;
 
-        public MemoryCacheItem(UUID index) :
+        public MemoryCacheItem(string index) :
             base(index)
         {
         }
 
-        public MemoryCacheItem(UUID index, DateTime ttl) :
+        public MemoryCacheItem(string index, DateTime ttl) :
             base(index, ttl)
         {
         }
 
-        public MemoryCacheItem(UUID index, Object data) :
+        public MemoryCacheItem(string index, Object data) :
             base(index)
         {
             Store(data);
         }
 
-        public MemoryCacheItem(UUID index, DateTime ttl, Object data) :
+        public MemoryCacheItem(string index, DateTime ttl, Object data) :
             base(index, ttl)
         {
             Store(data);
@@ -160,23 +160,23 @@ namespace OpenSim.Framework
     //
     public class FileCacheItem : CacheItemBase
     {
-        public FileCacheItem(UUID index) :
+        public FileCacheItem(string index) :
             base(index)
         {
         }
 
-        public FileCacheItem(UUID index, DateTime ttl) :
+        public FileCacheItem(string index, DateTime ttl) :
             base(index, ttl)
         {
         }
 
-        public FileCacheItem(UUID index, Object data) :
+        public FileCacheItem(string index, Object data) :
             base(index)
         {
             Store(data);
         }
 
-        public FileCacheItem(UUID index, DateTime ttl, Object data) :
+        public FileCacheItem(string index, DateTime ttl, Object data) :
             base(index, ttl)
         {
             Store(data);
@@ -200,8 +200,8 @@ namespace OpenSim.Framework
     public class Cache
     {
         private List<CacheItemBase> m_Index = new List<CacheItemBase>();
-        private Dictionary<UUID, CacheItemBase> m_Lookup =
-            new Dictionary<UUID, CacheItemBase>();
+        private Dictionary<string, CacheItemBase> m_Lookup =
+            new Dictionary<string, CacheItemBase>();
 
         private CacheStrategy m_Strategy;
         private CacheMedium m_Medium;
@@ -312,7 +312,7 @@ namespace OpenSim.Framework
 
         // Get an item from cache. Return the raw item, not it's data
         //
-        protected virtual CacheItemBase GetItem(UUID index)
+        protected virtual CacheItemBase GetItem(string index)
         {
             CacheItemBase item = null;
 
@@ -339,7 +339,7 @@ namespace OpenSim.Framework
         // Get an item from cache. Do not try to fetch from source if not
         // present. Just return null
         //
-        public virtual Object Get(UUID index)
+        public virtual Object Get(string index)
         {
             CacheItemBase item = GetItem(index);
 
@@ -352,7 +352,7 @@ namespace OpenSim.Framework
         // Fetch an object from backing store if not cached, serve from
         // cache if it is.
         //
-        public virtual Object Get(UUID index, FetchDelegate fetch)
+        public virtual Object Get(string index, FetchDelegate fetch)
         {
             Object item = Get(index);
             if (item != null)
@@ -393,7 +393,7 @@ namespace OpenSim.Framework
             return item.Retrieve();
         }
 
-        public virtual void Store(UUID index, Object data)
+        public virtual void Store(string index, Object data)
         {
             Type container;
 
@@ -411,12 +411,12 @@ namespace OpenSim.Framework
             Store(index, data, container);
         }
 
-        public virtual void Store(UUID index, Object data, Type container)
+        public virtual void Store(string index, Object data, Type container)
         {
             Store(index, data, container, new Object[] { index });
         }
 
-        public virtual void Store(UUID index, Object data, Type container,
+        public virtual void Store(string index, Object data, Type container,
                 Object[] parameters)
         {
             Expire(false);
@@ -520,7 +520,7 @@ namespace OpenSim.Framework
             }
         }
 
-        public void Invalidate(UUID uuid)
+        public void Invalidate(string uuid)
         {
             if (!m_Lookup.ContainsKey(uuid))
                 return;
diff --git a/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs b/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs
index 957b04f..c4cc007 100644
--- a/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs
@@ -45,8 +45,6 @@ namespace OpenSim.Region.CoreModules.Asset
                 MethodBase.GetCurrentMethod().DeclaringType);
 
         private bool m_Enabled = false;
-        private Dictionary<Scene, IAssetService> m_AssetService =
-                new Dictionary<Scene, IAssetService>();
 
         public string Name
         {
@@ -85,10 +83,6 @@ namespace OpenSim.Region.CoreModules.Asset
 
         public void AddRegion(Scene scene)
         {
-            if (!m_Enabled)
-                return;
-
-            scene.RegisterModuleInterface<IImprovedAssetCache>(this);
         }
 
         public void RemoveRegion(Scene scene)
@@ -97,15 +91,27 @@ namespace OpenSim.Region.CoreModules.Asset
 
         public void RegionLoaded(Scene scene)
         {
-            if (!m_Enabled)
-                return;
+        }
+
+        ////////////////////////////////////////////////////////////
+        // IImprovedAssetCache
+        //
+
+        public void Cache(AssetBase asset)
+        {
+        }
+
+        public AssetBase Get(string id)
+        {
+            return null;
+        }
 
-            m_AssetService[scene] =
-                    scene.RequestModuleInterface<IAssetService>();
+        public void Expire(string id)
+        {
+        }
 
-            if (m_AssetService[scene] != null)
-                m_log.InfoFormat("[ASSET CACHE]: Enabled for region {0}",
-                        scene.RegionInfo.RegionName);
+        public void Clear()
+        {
         }
     }
 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index 246cf55..e46545c 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -624,8 +624,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
             // a new friend was added in the initiator's and friend's data, so the cache entries are wrong now.
             lock (m_friendLists)
             {
-                m_friendLists.Invalidate(fromAgentID);
-                m_friendLists.Invalidate(toAgentID);
+                m_friendLists.Invalidate(fromAgentID.ToString());
+                m_friendLists.Invalidate(toAgentID.ToString());
             }
 
             // now send presence update and add a calling card for the new friend
@@ -664,8 +664,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
             // The cache entries aren't valid anymore either, as we just added a friend to both sides.
             lock (m_friendLists)
             {
-                m_friendLists.Invalidate(agentID);
-                m_friendLists.Invalidate(friendID);
+                m_friendLists.Invalidate(agentID.ToString());
+                m_friendLists.Invalidate(friendID.ToString());
             }
 
             // if it's a local friend, we don't have to do the lookup
@@ -782,8 +782,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
             // clean up cache: FriendList is wrong now...
             lock (m_friendLists)
             {
-                m_friendLists.Invalidate(agentID);
-                m_friendLists.Invalidate(exfriendID);
+                m_friendLists.Invalidate(agentID.ToString());
+                m_friendLists.Invalidate(exfriendID.ToString());
             }
         }
 
@@ -1070,7 +1070,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
             List<FriendListItem> fl;
             lock (m_friendLists)
             {
-                fl = (List<FriendListItem>)m_friendLists.Get(agent.ControllingClient.AgentId,
+                fl = (List<FriendListItem>)m_friendLists.Get(agent.ControllingClient.AgentId.ToString(),
                                                              m_initialScene.GetFriendList);
             }
 
@@ -1083,7 +1083,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
             List<FriendListItem> fl;
             lock (m_friendLists)
             {
-                fl = (List<FriendListItem>)m_friendLists.Get(remoteClient.AgentId,
+                fl = (List<FriendListItem>)m_friendLists.Get(remoteClient.AgentId.ToString(),
                                                              m_initialScene.GetFriendList);
             }
 
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs
index 24ac8be..0a0f634 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/LocalAssetServiceConnector.cs
@@ -28,6 +28,7 @@
 using log4net;
 using Nini.Config;
 using System;
+using System.Collections.Generic;
 using System.Reflection;
 using OpenSim.Servers.Base;
 using OpenSim.Region.Framework.Interfaces;
@@ -42,6 +43,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
                 LogManager.GetLogger(
                 MethodBase.GetCurrentMethod().DeclaringType);
 
+        private Dictionary<Scene, IImprovedAssetCache> m_AssetCache =
+                new Dictionary<Scene, IImprovedAssetCache>();
+
         private IAssetService m_AssetService;
 
         private bool m_Enabled = false;
@@ -109,10 +113,29 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
 
         public void RemoveRegion(Scene scene)
         {
+            if (!m_Enabled)
+                return;
+
+            m_AssetCache.Remove(scene);
         }
 
         public void RegionLoaded(Scene scene)
         {
+            if (!m_Enabled)
+                return;
+
+            m_AssetCache[scene] =
+                    scene.RequestModuleInterface<IImprovedAssetCache>();
+
+            m_log.InfoFormat("[ASSET CONNECTOR]: Enabled local assets for region {0}", scene.RegionInfo.RegionName);
+
+            m_AssetCache[scene] =
+                    scene.RequestModuleInterface<IImprovedAssetCache>();
+            
+            if (m_AssetCache[scene] != null)
+            {
+                m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
+            }
         }
     }
 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs
index 2cc2962..835678d 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/RemoteAssetServiceConnector.cs
@@ -27,6 +27,7 @@
 
 using log4net;
 using System;
+using System.Collections.Generic;
 using System.IO;
 using System.Reflection;
 using Nini.Config;
@@ -48,6 +49,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
 
         private bool m_Enabled = false;
         private string m_ServerURI = String.Empty;
+        private Dictionary<Scene, IImprovedAssetCache> m_AssetCache =
+                new Dictionary<Scene, IImprovedAssetCache>();
 
         public string Name
         {
@@ -103,10 +106,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
 
         public void RemoveRegion(Scene scene)
         {
+            if (!m_Enabled)
+                return;
+
+            m_AssetCache.Remove(scene);
         }
 
         public void RegionLoaded(Scene scene)
         {
+            if (!m_Enabled)
+                return;
+
+            m_AssetCache[scene] =
+                    scene.RequestModuleInterface<IImprovedAssetCache>();
+
+            m_log.InfoFormat("[ASSET CONNECTOR]: Enabled remote assets for region {0}", scene.RegionInfo.RegionName);
+
+            if (m_AssetCache[scene] != null)
+            {
+                m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
+            }
         }
 
         public AssetBase Get(string id)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index ce54261..1dc33e1 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -1302,7 +1302,9 @@ namespace OpenSim.Region.CoreModules.World.Land
             if (parcelID == UUID.Zero)
                 return;
 
-            ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID, delegate(UUID parcel) {
+            ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), delegate(string id) {
+                UUID parcel = UUID.Zero;
+                UUID.TryParse(id, out parcel);
                 // assume we've got the parcelID we just computed in RemoteParcelRequest
                 ExtendedLandData extLandData = new ExtendedLandData();
                 Util.ParseFakeParcelID(parcel, out extLandData.regionHandle, out extLandData.x, out extLandData.y);
diff --git a/OpenSim/Region/Framework/Interfaces/IAssetCache.cs b/OpenSim/Region/Framework/Interfaces/IAssetCache.cs
deleted file mode 100644
index bd43ce5..0000000
--- a/OpenSim/Region/Framework/Interfaces/IAssetCache.cs
+++ /dev/null
@@ -1,33 +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.
- */
-
-namespace OpenSim.Region.Framework.Interfaces
-{
-    public interface IImprovedAssetCache
-    {
-    }
-}
diff --git a/OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs b/OpenSim/Region/Framework/Interfaces/IImprovedAssetCache.cs
new file mode 100644
index 0000000..b213284
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/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.Region.Framework.Interfaces
+{
+    public interface IImprovedAssetCache
+    {
+        void Cache(AssetBase asset);
+        AssetBase Get(string id);
+        void Expire(string id);
+        void Clear();
+    }
+}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index d1260d4..7cb66a0 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2825,8 +2825,12 @@ namespace OpenSim.Region.Framework.Scenes
             objectCapacity = objects;
         }
         
-        public List<FriendListItem> GetFriendList(UUID avatarID)
+        public List<FriendListItem> GetFriendList(string id)
         {
+            UUID avatarID;
+            if (!UUID.TryParse(id, out avatarID))
+                return new List<FriendListItem>();
+
             return CommsManager.GetUserFriendList(avatarID);
         }
 
-- 
cgit v1.1