From 10875427058e68784ca6f5538a00a0cafd46a72b Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Sat, 3 May 2008 18:57:02 +0000 Subject: * Refactor: Move bulk of CreateFolder from UserProfileCacheService into CachedUserInfo * Remove unused/superseded methods from GridInventoryService --- .../Communications/Cache/CachedUserInfo.cs | 100 ++++++++++++++++++++- .../Cache/UserProfileCacheService.cs | 76 ++-------------- .../Communications/InventoryServiceBase.cs | 12 ++- .../Grid/InventoryServer/GridInventoryService.cs | 66 ++------------ .../Region/Environment/Scenes/Scene.Inventory.cs | 1 + 5 files changed, 124 insertions(+), 131 deletions(-) diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index 86c24bc..f55b492 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -28,11 +28,16 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; + using libsecondlife; using log4net; namespace OpenSim.Framework.Communications.Cache { + internal delegate void CreateInventoryFolderDelegate( + string folderName, LLUUID folderID, ushort folderType, LLUUID parentID); + /// /// Stores user profile and inventory data received from backend services for a particular user. /// @@ -297,6 +302,99 @@ namespace OpenSim.Framework.Communications.Cache } } } + + /// + /// Create a folder in this agent's inventory + /// + /// + /// + public bool CreateFolder(string folderName, LLUUID folderID, ushort folderType, LLUUID parentID) + { +// m_log.DebugFormat( +// "[AGENT INVENTORY]: Creating inventory folder {0} {1} for {2} {3}", folderID, folderName, remoteClient.Name, remoteClient.AgentId); + + if (HasInventory) + { + if (RootFolder.ID == parentID) + { + InventoryFolderImpl createdFolder = RootFolder.CreateNewSubFolder(folderID, folderName, folderType); + + if (createdFolder != null) + { + InventoryFolderBase createdBaseFolder = new InventoryFolderBase(); + createdBaseFolder.Owner = createdFolder.Owner; + createdBaseFolder.ID = createdFolder.ID; + createdBaseFolder.Name = createdFolder.Name; + createdBaseFolder.ParentID = createdFolder.ParentID; + createdBaseFolder.Type = createdFolder.Type; + createdBaseFolder.Version = createdFolder.Version; + + m_commsManager.InventoryService.AddFolder(createdBaseFolder); + + return true; + } + else + { + m_log.WarnFormat( + "[INVENTORY CACHE]: Tried to create folder {0} {1} but the folder already exists", + folderName, folderID); + + return false; + } + } + else + { + InventoryFolderImpl folder = RootFolder.GetDescendentFolder(parentID); + + if (folder != null) + { + InventoryFolderImpl createdFolder = folder.CreateNewSubFolder(folderID, folderName, folderType); + + if (createdFolder != null) + { + InventoryFolderBase createdBaseFolder = new InventoryFolderBase(); + createdBaseFolder.Owner = createdFolder.Owner; + createdBaseFolder.ID = createdFolder.ID; + createdBaseFolder.Name = createdFolder.Name; + createdBaseFolder.ParentID = createdFolder.ParentID; + createdBaseFolder.Type = createdFolder.Type; + createdBaseFolder.Version = createdFolder.Version; + + m_commsManager.InventoryService.AddFolder(createdBaseFolder); + + return true; + } + else + { + m_log.WarnFormat( + "[INVENTORY CACHE]: Tried to create folder {0} {1} but the folder already exists", + folderName, folderID); + + return false; + } + } + else + { + m_log.WarnFormat( + "[INVENTORY CACHE]: Could not find parent folder with id {0} in order to create folder {1} {2}", + parentID, folderName, folderID); + + return false; + } + } + } + else + { + AddRequest( + new InventoryRequest( + Delegate.CreateDelegate(typeof(CreateInventoryFolderDelegate), this, "CreateFolder"), + new object[] { folderName, folderID, folderType, parentID })); + + return true; + } + + return false; + } /// /// Add an item to the user's inventory @@ -360,7 +458,7 @@ namespace OpenSim.Framework.Communications.Cache /// /// Generic inventory request /// - public class InventoryRequest : IInventoryRequest + class InventoryRequest : IInventoryRequest { private Delegate m_delegat; private Object[] m_args; diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index befb6c7..f1929c8 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs @@ -34,8 +34,6 @@ using log4net; namespace OpenSim.Framework.Communications.Cache { - internal delegate void CreateInventoryFolderDelegate( - IClientAPI remoteClient, LLUUID folderID, ushort folderType, string folderName, LLUUID parentID); internal delegate void MoveInventoryFolderDelegate(IClientAPI remoteClient, LLUUID folderID, LLUUID parentID); internal delegate void PurgeInventoryDescendentsDelegate(IClientAPI remoteClient, LLUUID folderID); internal delegate void UpdateInventoryFolderDelegate( @@ -157,80 +155,16 @@ namespace OpenSim.Framework.Communications.Cache /// public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, string folderName, LLUUID parentID) - { -// m_log.DebugFormat( -// "[AGENT INVENTORY]: Creating inventory folder {0} {1} for {2} {3}", folderID, folderName, remoteClient.Name, remoteClient.AgentId); - + { CachedUserInfo userProfile; if (m_userProfiles.TryGetValue(remoteClient.AgentId, out userProfile)) { - if (userProfile.HasInventory) + if (!userProfile.CreateFolder(folderName, folderID, folderType, parentID)) { - if (userProfile.RootFolder.ID == parentID) - { - InventoryFolderImpl createdFolder = - userProfile.RootFolder.CreateNewSubFolder(folderID, folderName, folderType); - - if (createdFolder != null) - { - InventoryFolderBase createdBaseFolder = new InventoryFolderBase(); - createdBaseFolder.Owner = createdFolder.Owner; - createdBaseFolder.ID = createdFolder.ID; - createdBaseFolder.Name = createdFolder.Name; - createdBaseFolder.ParentID = createdFolder.ParentID; - createdBaseFolder.Type = createdFolder.Type; - createdBaseFolder.Version = createdFolder.Version; - - m_commsManager.InventoryService.AddFolder(createdBaseFolder); - } - else - { - m_log.WarnFormat( - "[INVENTORY CACHE]: Tried to create folder {0} {1} for user {2} {3} but the folder already exists", - folderName, folderID, remoteClient.Name, remoteClient.AgentId); - } - } - else - { - InventoryFolderImpl folder = userProfile.RootFolder.GetDescendentFolder(parentID); - if (folder != null) - { - InventoryFolderImpl createdFolder = folder.CreateNewSubFolder(folderID, folderName, folderType); - - if (createdFolder != null) - { - InventoryFolderBase createdBaseFolder = new InventoryFolderBase(); - createdBaseFolder.Owner = createdFolder.Owner; - createdBaseFolder.ID = createdFolder.ID; - createdBaseFolder.Name = createdFolder.Name; - createdBaseFolder.ParentID = createdFolder.ParentID; - createdBaseFolder.Type = createdFolder.Type; - createdBaseFolder.Version = createdFolder.Version; - - m_commsManager.InventoryService.AddFolder(createdBaseFolder); - } - else - { - m_log.WarnFormat( - "[INVENTORY CACHE]: Tried to create folder {0} {1} for user {2} {3} but the folder already exists", - folderName, folderID, remoteClient.Name, remoteClient.AgentId); - } - } - else - { - m_log.WarnFormat( - "[INVENTORY CACHE]: Could not find parent folder with id {0} in order to create folder {1} {2} for user {3} {4}", - parentID, folderName, folderID, remoteClient.Name, remoteClient.AgentId); - } - } - } - else - { - userProfile.AddRequest( - new InventoryRequest( - Delegate.CreateDelegate(typeof(CreateInventoryFolderDelegate), this, "HandleCreateInventoryFolder"), - new object[] { remoteClient, folderID, folderType, folderName, parentID })); + m_log.WarnFormat( + "[AGENT INVENTORY]: Failed to create folder for user {0} {1}", + remoteClient.Name, remoteClient.AgentId); } } } diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Framework/Communications/InventoryServiceBase.cs index 1601963..e81d8c4 100644 --- a/OpenSim/Framework/Communications/InventoryServiceBase.cs +++ b/OpenSim/Framework/Communications/InventoryServiceBase.cs @@ -28,11 +28,16 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; + using libsecondlife; using log4net; namespace OpenSim.Framework.Communications { + /// + /// Abstract base class used by local and grid implementations of an inventory service. + /// public abstract class InventoryServiceBase : IInventoryServices { private static readonly ILog m_log @@ -178,10 +183,11 @@ namespace OpenSim.Framework.Communications #endregion + // See IInventoryServices public bool AddFolder(InventoryFolderBase folder) { m_log.DebugFormat( - "[AGENT INVENTORY]: Adding folder {0} {1} to folder {2}", folder.Name, folder.ID, folder.ParentID); + "[AGENT INVENTORY]: Adding folder {0} {1} to folder {2}", folder.Name, folder.ID, folder.ParentID); foreach (KeyValuePair plugin in m_plugins) { @@ -192,6 +198,7 @@ namespace OpenSim.Framework.Communications return true; } + // See IInventoryServices public bool MoveFolder(InventoryFolderBase folder) { m_log.DebugFormat( @@ -206,6 +213,7 @@ namespace OpenSim.Framework.Communications return true; } + // See IInventoryServices public bool AddItem(InventoryItemBase item) { m_log.DebugFormat( @@ -220,6 +228,7 @@ namespace OpenSim.Framework.Communications return true; } + // See IInventoryServices public bool UpdateItem(InventoryItemBase item) { m_log.InfoFormat( @@ -234,6 +243,7 @@ namespace OpenSim.Framework.Communications return true; } + // See IInventoryServices public bool DeleteItem(InventoryItemBase item) { m_log.InfoFormat( diff --git a/OpenSim/Grid/InventoryServer/GridInventoryService.cs b/OpenSim/Grid/InventoryServer/GridInventoryService.cs index d9510e9..f0eef31 100644 --- a/OpenSim/Grid/InventoryServer/GridInventoryService.cs +++ b/OpenSim/Grid/InventoryServer/GridInventoryService.cs @@ -28,8 +28,11 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; + using libsecondlife; using log4net; + using OpenSim.Framework; using OpenSim.Framework.Communications; @@ -48,71 +51,18 @@ namespace OpenSim.Grid.InventoryServer } /// - /// Get a user's inventory. - /// - /// - /// - /// - /// true if the inventory was retrieved, false otherwise - private bool GetUsersInventory(LLUUID userID, out List folderList, - out List itemsList) - { - List allFolders = GetInventorySkeleton(userID); - List allItems = new List(); - - foreach (InventoryFolderBase folder in allFolders) - { - List items = RequestFolderItems(folder.ID); - if (items != null) - { - allItems.InsertRange(0, items); - } - } - - folderList = allFolders; - itemsList = allItems; - if (folderList != null) - { - return true; - } - else - { - return false; - } - } - - private List GetAllFolders(LLUUID folder) - { - List allFolders = new List(); - List folders = RequestSubFolders(folder); - if (folders != null) - { - allFolders.InsertRange(0, folders); - foreach (InventoryFolderBase subfolder in folders) - { - List subFolders = GetAllFolders(subfolder.ID); - if (subFolders != null) - { - allFolders.InsertRange(0, subFolders); - } - } - } - return allFolders; - } - - /// /// Return a user's entire inventory /// /// /// The user's inventory. If an inventory cannot be found then an empty collection is returned. public InventoryCollection GetUserInventory(Guid rawUserID) - { - // uncomment me to simulate an overloaded inventory server - //Thread.Sleep(20000); - + { LLUUID userID = new LLUUID(rawUserID); - m_log.InfoFormat("[GRID AGENT INVENTORY]: Processing request for inventory of {0}", userID); + m_log.InfoFormat("[GRID AGENT INVENTORY]: Processing request for inventory of {0}", userID); + + // uncomment me to simulate an overloaded inventory server + //Thread.Sleep(20000); InventoryCollection invCollection = new InventoryCollection(); diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 59c45fa..0715b64 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -645,6 +645,7 @@ namespace OpenSim.Region.Environment.Scenes { CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); + if (userInfo == null) { m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString()); -- cgit v1.1