From eeb1908bcee483458f6701b30b839a758565a3c6 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 24 Apr 2009 19:10:13 +0000 Subject: * Refactor: break out loading of archive paths into inventory into a separate method --- .../Archiver/InventoryArchiveReadRequest.cs | 249 ++++++++++++--------- 1 file changed, 139 insertions(+), 110 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index 69a4bd7..2ecb7d4 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -144,116 +144,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver } else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH)) { - string fsPath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length); - - // Remove the file portion if we aren't already dealing with a directory path - if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) - fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1); - - string originalFsPath = fsPath; - - m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath); - - InventoryFolderImpl foundFolder = null; - - // XXX: Nasty way of dealing with a path that has no directory component - if (fsPath.Length > 0) - { - while (null == foundFolder && fsPath.Length > 0) - { - if (foldersCreated.ContainsKey(fsPath)) - { - m_log.DebugFormat("[INVENTORY ARCHIVER]: Found previously created fs path {0}", fsPath); - foundFolder = foldersCreated[fsPath]; - } - else - { - // Don't include the last slash - int penultimateSlashIndex = fsPath.LastIndexOf("/", fsPath.Length - 2); - - if (penultimateSlashIndex >= 0) - { - fsPath = fsPath.Remove(penultimateSlashIndex + 1); - } - else - { - m_log.DebugFormat( - "[INVENTORY ARCHIVER]: Found no previously created fs path for {0}", - originalFsPath); - fsPath = string.Empty; - foundFolder = rootDestinationFolder; - } - } - } - } - else - { - foundFolder = rootDestinationFolder; - } - - string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length); - string[] rawDirsToCreate - = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - int i = 0; - - while (i < rawDirsToCreate.Length) - { - m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]); - - int identicalNameIdentifierIndex - = rawDirsToCreate[i].LastIndexOf( - ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); - string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); - - UUID newFolderId = UUID.Random(); - m_userInfo.CreateFolder( - folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); - foundFolder = foundFolder.GetChildFolder(newFolderId); - - // Record that we have now created this folder - fsPath += rawDirsToCreate[i] + "/"; - m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath); - foldersCreated[fsPath] = foundFolder; - - if (0 == i) - nodesLoaded.Add(foundFolder); - - i++; - } - - /* - string[] rawFolders = filePath.Split(new char[] { '/' }); - - // Find the folders that do exist along the path given - int i = 0; - bool noFolder = false; - InventoryFolderImpl foundFolder = rootDestinationFolder; - while (!noFolder && i < rawFolders.Length) - { - InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]); - if (null != folder) - { - m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name); - foundFolder = folder; - i++; - } - else - { - noFolder = true; - } - } - - // Create any folders that did not previously exist - while (i < rawFolders.Length) - { - m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]); - - UUID newFolderId = UUID.Random(); - m_userInfo.CreateFolder( - rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID); - foundFolder = foundFolder.GetChildFolder(newFolderId); - } - */ + InventoryFolderImpl foundFolder + = ReplicateArchivePathToUserInventory( + filePath, TarArchiveReader.TarEntryType.TYPE_DIRECTORY == entryType, + rootDestinationFolder, foldersCreated, nodesLoaded); if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) { @@ -286,6 +180,141 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return nodesLoaded; } + + /// + /// Replicate the inventory paths in the archive to the user's inventory as necessary. + /// + /// + /// Is the path we're dealing with a directory? + /// The root folder for the inventory load + /// + /// The folders created so far. This method will add more folders if necessary + /// + /// + /// Track the inventory nodes created. This is distinct from the folders created since for a particular folder + /// chain, only the root node needs to be recorded + /// + /// The last user inventory folder created or found for the archive path + public InventoryFolderImpl ReplicateArchivePathToUserInventory( + string fsPath, + bool isDir, + InventoryFolderImpl rootDestinationFolder, + Dictionary foldersCreated, + List nodesLoaded) + { + fsPath = fsPath.Substring(ArchiveConstants.INVENTORY_PATH.Length); + + // Remove the file portion if we aren't already dealing with a directory path + if (!isDir) + fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1); + + string originalFsPath = fsPath; + + m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath); + + InventoryFolderImpl foundFolder = null; + + // XXX: Nasty way of dealing with a path that has no directory component + if (fsPath.Length > 0) + { + while (null == foundFolder && fsPath.Length > 0) + { + if (foldersCreated.ContainsKey(fsPath)) + { + m_log.DebugFormat("[INVENTORY ARCHIVER]: Found previously created fs path {0}", fsPath); + foundFolder = foldersCreated[fsPath]; + } + else + { + // Don't include the last slash + int penultimateSlashIndex = fsPath.LastIndexOf("/", fsPath.Length - 2); + + if (penultimateSlashIndex >= 0) + { + fsPath = fsPath.Remove(penultimateSlashIndex + 1); + } + else + { + m_log.DebugFormat( + "[INVENTORY ARCHIVER]: Found no previously created fs path for {0}", + originalFsPath); + fsPath = string.Empty; + foundFolder = rootDestinationFolder; + } + } + } + } + else + { + foundFolder = rootDestinationFolder; + } + + string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length); + string[] rawDirsToCreate + = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); + int i = 0; + + while (i < rawDirsToCreate.Length) + { + m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]); + + int identicalNameIdentifierIndex + = rawDirsToCreate[i].LastIndexOf( + ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); + string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); + + UUID newFolderId = UUID.Random(); + m_userInfo.CreateFolder( + folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); + foundFolder = foundFolder.GetChildFolder(newFolderId); + + // Record that we have now created this folder + fsPath += rawDirsToCreate[i] + "/"; + m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath); + foldersCreated[fsPath] = foundFolder; + + if (0 == i) + nodesLoaded.Add(foundFolder); + + i++; + } + + return foundFolder; + + /* + string[] rawFolders = filePath.Split(new char[] { '/' }); + + // Find the folders that do exist along the path given + int i = 0; + bool noFolder = false; + InventoryFolderImpl foundFolder = rootDestinationFolder; + while (!noFolder && i < rawFolders.Length) + { + InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]); + if (null != folder) + { + m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name); + foundFolder = folder; + i++; + } + else + { + noFolder = true; + } + } + + // Create any folders that did not previously exist + while (i < rawFolders.Length) + { + m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]); + + UUID newFolderId = UUID.Random(); + m_userInfo.CreateFolder( + rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID); + foundFolder = foundFolder.GetChildFolder(newFolderId); + } + */ + } /// /// Load an asset -- cgit v1.1