diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index f5e68244ff..15621726d4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -41,7 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class HGInventoryBroker : ISharedRegionModule, IInventoryService + public class HGInventoryBroker : InventoryCache, ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger( @@ -122,6 +122,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory m_LocalGridInventoryURI = inventoryConfig.GetString("InventoryServerURI", string.Empty); + Init(source); + m_Enabled = true; m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); } @@ -136,7 +138,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } - public void AddRegion(Scene scene) + public override void AddRegion(Scene scene) { if (!m_Enabled) return; @@ -154,10 +156,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } scene.RegisterModuleInterface(this); + base.AddRegion(scene); } - public void RemoveRegion(Scene scene) + public override void RemoveRegion(Scene scene) { + base.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -165,7 +169,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory if (!m_Enabled) return; - m_log.InfoFormat("[INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName); + m_log.InfoFormat("[HG INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName); } @@ -201,19 +205,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } } - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) - { - if (IsLocalGridUser(userID)) - return m_GridService.GetFolderForType(userID, type); - else - { - UUID sessionID = GetSessionID(userID); - string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); - // !!!!!! - return null; - //return m_HGService.GetFolderForType(uri, sessionID, type); - } - } + // Inherited. See base + //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + //{ + // if (IsLocalGridUser(userID)) + // return m_GridService.GetFolderForType(userID, type); + // else + // { + // UUID sessionID = GetSessionID(userID); + // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); + // // !!!!!! + // return null; + // //return m_HGService.GetFolderForType(uri, sessionID, type); + // } + //} public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { @@ -227,6 +232,45 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } } + public override Dictionary GetSystemFolders(UUID userID) + { + if (IsLocalGridUser(userID)) + return GetSystemFoldersLocal(userID); + else + { + UUID sessionID = GetSessionID(userID); + string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); + return m_HGService.GetSystemFolders(uri, sessionID); + } + } + + private Dictionary GetSystemFoldersLocal(UUID userID) + { + InventoryFolderBase root = m_GridService.GetRootFolder(userID); + if (root != null) + { + InventoryCollection content = m_GridService.GetFolderContent(userID, root.ID); + if (content != null) + { + Dictionary folders = new Dictionary(); + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count); + foreach (InventoryFolderBase folder in content.Folders) + { + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type); + if (folder.Type != (short)AssetType.Folder) + folders[(AssetType)folder.Type] = folder; + } + return folders; + } + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID); + + } + + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID); + + return new Dictionary(); + } + public List GetFolderItems(UUID userID, UUID folderID) { return new List(); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs new file mode 100644 index 0000000000..57c2091b7c --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +using OpenSim.Framework; +using OpenSim.Framework.Client; +using OpenSim.Region.Framework.Scenes; + +using OpenMetaverse; +using Nini.Config; +using log4net; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory +{ + public abstract class InventoryCache + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + protected List m_Scenes; + + // The cache proper + protected Dictionary> m_InventoryCache; + + protected virtual void Init(IConfigSource source) + { + m_Scenes = new List(); + m_InventoryCache = new Dictionary>(); + } + + public virtual void AddRegion(Scene scene) + { + m_Scenes.Add(scene); + scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; + scene.EventManager.OnClientClosed += OnClientClosed; + } + + public virtual void RemoveRegion(Scene scene) + { + if ((m_Scenes != null) && m_Scenes.Contains(scene)) + { + m_Scenes.Remove(scene); + } + } + + void OnMakeRootAgent(ScenePresence presence) + { + // Get system folders + + // First check if they're here already + lock (m_InventoryCache) + { + if (m_InventoryCache.ContainsKey(presence.UUID)) + { + m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, system folders for {0} {1} already in cache", presence.Firstname, presence.Lastname); + return; + } + } + + // If not, go get them and place them in the cache + Dictionary folders = GetSystemFolders(presence.UUID); + m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, fetched system folders for {0} {1}: count {2}", + presence.Firstname, presence.Lastname, folders.Count); + if (folders.Count > 0) + lock (m_InventoryCache) + m_InventoryCache.Add(presence.UUID, folders); + } + + void OnClientClosed(UUID clientID, Scene scene) + { + ScenePresence sp = null; + foreach (Scene s in m_Scenes) + { + s.TryGetAvatar(clientID, out sp); + if (sp != null) + { + m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed, but user {0} still in sim. Keeping system folders in cache", clientID); + return; + } + } + + m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed, user {0} out of sim. Dropping system folders", clientID); + // Drop system folders + lock (m_InventoryCache) + if (m_InventoryCache.ContainsKey(clientID)) + m_InventoryCache.Remove(clientID); + + } + + public abstract Dictionary GetSystemFolders(UUID userID); + + public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + { + Dictionary folders = null; + lock (m_InventoryCache) + { + m_InventoryCache.TryGetValue(userID, out folders); + } + if ((folders != null) && folders.ContainsKey(type)) + { + return folders[type]; + } + + return null; + } + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index bab0044d6d..5c52897fbe 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -41,7 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class LocalInventoryServicesConnector : ISharedRegionModule, IInventoryService + public class LocalInventoryServicesConnector : InventoryCache, ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger( @@ -108,6 +108,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory // m_InventoryService.AddPlugin(new OspInventoryWrapperPlugin(plugin, this)); //} + Init(source); + m_Enabled = true; m_log.Info("[INVENTORY CONNECTOR]: Local inventory connector enabled"); } @@ -122,7 +124,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } - public void AddRegion(Scene scene) + public override void AddRegion(Scene scene) { if (!m_Enabled) return; @@ -139,10 +141,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory // "[INVENTORY CONNECTOR]: Registering IInventoryService to scene {0}", scene.RegionInfo.RegionName); scene.RegisterModuleInterface(this); + base.AddRegion(scene); } - public void RemoveRegion(Scene scene) + public override void RemoveRegion(Scene scene) { + base.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -176,9 +180,30 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory m_InventoryService.GetUserInventory(userID, callback); } - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + // Inherited. See base + //public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + //{ + // return m_InventoryService.GetFolderForType(userID, type); + //} + + public override Dictionary GetSystemFolders(UUID userID) { - return m_InventoryService.GetFolderForType(userID, type); + InventoryFolderBase root = GetRootFolder(userID); + if (root != null) + { + InventoryCollection content = GetFolderContent(userID, root.ID); + if (content != null) + { + Dictionary folders = new Dictionary(); + foreach (InventoryFolderBase folder in content.Folders) + { + if (folder.Type != (short)AssetType.Folder) + folders[(AssetType)folder.Type] = folder; + } + return folders; + } + } + return new Dictionary(); } public InventoryCollection GetFolderContent(UUID userID, UUID folderID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 2064558eb4..dceda3821b 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -40,7 +40,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class RemoteInventoryServicesConnector : ISharedRegionModule, IInventoryService + public class RemoteInventoryServicesConnector : InventoryCache, ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -69,9 +69,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory Init(source); } - private void Init(IConfigSource source) + protected override void Init(IConfigSource source) { m_RemoteConnector = new InventoryServicesConnector(source); + base.Init(source); } @@ -101,7 +102,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } - public void AddRegion(Scene scene) + public override void AddRegion(Scene scene) { if (!m_Enabled) return; @@ -116,10 +117,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } scene.RegisterModuleInterface(this); + base.AddRegion(scene); } - public void RemoveRegion(Scene scene) + public override void RemoveRegion(Scene scene) { + base.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -168,23 +171,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + // inherited. See base class + // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + + public override Dictionary GetSystemFolders(UUID userID) { - //UUID sessionID = GetSessionID(userID); - //List sysFolders; - //try - //{ - // sysFolders = m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID); - //} - //catch (Exception e) - //{ - // m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderForType operation failed, {0} {1}", - // e.Source, e.Message); - //} - - // PLACEHOLDER UNTIL CACHE IS DONE - return null; - + UUID sessionID = GetSessionID(userID); + return m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID); } public InventoryCollection GetFolderContent(UUID userID, UUID folderID) diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs index b1688713e0..f6d1500eca 100644 --- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs @@ -126,7 +126,7 @@ namespace OpenSim.Services.Connectors.Inventory /// /// /// - public List GetSystemFolders(string id, UUID sessionID) + public Dictionary GetSystemFolders(string id, UUID sessionID) { m_log.Debug("[HGInventory]: GetSystemFolders " + id); string url = string.Empty; @@ -138,7 +138,7 @@ namespace OpenSim.Services.Connectors.Inventory return connector.GetSystemFolders(userID, sessionID); } - return new List(); + return new Dictionary(); } /// diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs index 98fd6808d3..973cb0a7ed 100644 --- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs +++ b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs @@ -57,7 +57,7 @@ namespace OpenSim.Services.Connectors /// /// /// - List GetSystemFolders(string userID, UUID session_id); + Dictionary GetSystemFolders(string userID, UUID session_id); /// /// Gets everything (folders and items) inside a folder diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index 1a6826e131..3b1583170c 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -161,11 +161,11 @@ namespace OpenSim.Services.Connectors /// /// /// - public List GetSystemFolders(string userID, UUID sessionID) + public Dictionary GetSystemFolders(string userID, UUID sessionID) { try { - return SynchronousRestSessionObjectPoster>.BeginPostObject( + return SynchronousRestSessionObjectPoster>.BeginPostObject( "GET", m_ServerURI + "/SystemFolders/", userID, sessionID.ToString(), userID.ToString()); } catch (Exception e) @@ -174,7 +174,7 @@ namespace OpenSim.Services.Connectors e.Source, e.Message); } - return new List(); + return new Dictionary(); } /// diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index dd435c9f7c..fc54c125c6 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -273,6 +273,26 @@ namespace OpenSim.Services.InventoryService return root; } + public Dictionary GetSystemFolders(UUID userID) + { + InventoryFolderBase root = GetRootFolder(userID); + if (root != null) + { + InventoryCollection content = GetFolderContent(userID, root.ID); + if (content != null) + { + Dictionary folders = new Dictionary(); + foreach (InventoryFolderBase folder in content.Folders) + { + if (folder.Type != (short)AssetType.Folder) + folders[(AssetType)folder.Type] = folder; + } + return folders; + } + } + return new Dictionary(); + } + public List GetActiveGestures(UUID userId) { List activeGestures = new List();