From cf2405385db8df3595055a80df129c5148e7e458 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 22 Oct 2011 02:16:46 +0100 Subject: [PATCH] Get UUIDGatherer to scan notecards in the graph for asset uuids. This is to support npc baked texture saving in oars and iars. May address http://opensimulator.org/mantis/view.php?id=5743 --- OpenSim/Framework/Tests/UtilTest.cs | 4 +- OpenSim/Framework/Util.cs | 7 ++-- .../Scenes/Tests/UuidGathererTests.cs | 26 +++++++++++++ .../Region/Framework/Scenes/UuidGatherer.cs | 38 +++++++++++-------- OpenSim/Tests/Common/Helpers/AssetHelpers.cs | 17 +++++++-- 5 files changed, 68 insertions(+), 24 deletions(-) diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs index c5a20e7b0e..1ca35dfcb5 100644 --- a/OpenSim/Framework/Tests/UtilTest.cs +++ b/OpenSim/Framework/Tests/UtilTest.cs @@ -146,9 +146,9 @@ namespace OpenSim.Framework.Tests Assert.IsFalse(Util.isUUID("FOOBAR67-89ab-Cdef-0123-456789AbCdEf"), "UUIDs with non-hex characters are recognized as correct UUIDs."); Assert.IsFalse(Util.isUUID("01234567"), - "Too short UUIDs are regognized as correct UUIDs."); + "Too short UUIDs are recognized as correct UUIDs."); Assert.IsFalse(Util.isUUID("01234567-89ab-Cdef-0123-456789AbCdEf0"), - "Too long UUIDs are regognized as correct UUIDs."); + "Too long UUIDs are recognized as correct UUIDs."); Assert.IsFalse(Util.isUUID("01234567-89ab-Cdef-0123+456789AbCdEf"), "UUIDs with wrong format are recognized as correct UUIDs."); } diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 00ef8caf99..5a7c379f0f 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -46,7 +46,6 @@ using System.Threading; using log4net; using Nini.Config; using Nwc.XmlRpc; -// using BclExtras; using OpenMetaverse; using OpenMetaverse.StructuredData; using Amib.Threading; @@ -91,8 +90,10 @@ namespace OpenSim.Framework private static readonly DateTime unixEpoch = DateTime.ParseExact("1970-01-01 00:00:00 +0", "yyyy-MM-dd hh:mm:ss z", DateTimeFormatInfo.InvariantInfo).ToUniversalTime(); - public static readonly Regex UUIDPattern - = new Regex("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"); + private static readonly string rawUUIDPattern + = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"; + public static readonly Regex PermissiveUUIDPattern = new Regex(rawUUIDPattern); + public static readonly Regex UUIDPattern = new Regex(string.Format("^{0}$", rawUUIDPattern)); public static FireAndForgetMethod DefaultFireAndForgetMethod = FireAndForgetMethod.SmartThreadPool; public static FireAndForgetMethod FireAndForgetMethod = DefaultFireAndForgetMethod; diff --git a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs index 24de56e08a..d9fe87c0bf 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs @@ -85,5 +85,31 @@ namespace OpenSim.Region.Framework.Scenes.Tests // We count the uuid as gathered even if the asset itself is missing. Assert.That(foundAssetUuids.Count, Is.EqualTo(1)); } + + [Test] + public void TestNotecardAsset() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + UUID ownerId = TestHelpers.ParseTail(0x10); + UUID soAssetId = TestHelpers.ParseTail(0x20); + UUID ncAssetId = TestHelpers.ParseTail(0x30); + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, ownerId); + AssetBase soAsset = AssetHelpers.CreateAsset(soAssetId, so); + m_assetService.Store(soAsset); + + AssetBase ncAsset = AssetHelpers.CreateNotecardAsset(ncAssetId, soAssetId.ToString()); + m_assetService.Store(ncAsset); + + IDictionary foundAssetUuids = new Dictionary(); + m_uuidGatherer.GatherAssetUuids(ncAssetId, AssetType.Notecard, foundAssetUuids); + + // We count the uuid as gathered even if the asset itself is corrupt. + Assert.That(foundAssetUuids.Count, Is.EqualTo(2)); + Assert.That(foundAssetUuids.ContainsKey(ncAssetId)); + Assert.That(foundAssetUuids.ContainsKey(soAssetId)); + } } } diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 3acdaf8781..cc3f7a3d96 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -62,12 +62,12 @@ namespace OpenSim.Region.Framework.Scenes /// Used as a temporary store of an asset which represents an object. This can be a null if no appropriate /// asset was found by the asset service. /// - protected AssetBase m_requestedObjectAsset; + private AssetBase m_requestedObjectAsset; /// /// Signal whether we are currently waiting for the asset service to deliver an asset. /// - protected bool m_waitingForObjectAsset; + private bool m_waitingForObjectAsset; public UuidGatherer(IAssetService assetCache) { @@ -103,9 +103,13 @@ namespace OpenSim.Region.Framework.Scenes { GetGestureAssetUuids(assetUuid, assetUuids); } + else if (AssetType.Notecard == assetType) + { + GetTextEmbeddedAssetUuids(assetUuid, assetUuids); + } else if (AssetType.LSLText == assetType) { - GetScriptAssetUuids(assetUuid, assetUuids); + GetTextEmbeddedAssetUuids(assetUuid, assetUuids); } else if (AssetType.Object == assetType) { @@ -194,7 +198,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// The callback made when we request the asset for an object from the asset service. /// - protected void AssetReceived(string id, Object sender, AssetBase asset) + private void AssetReceived(string id, Object sender, AssetBase asset) { lock (this) { @@ -238,23 +242,25 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// Dictionary in which to record the references - protected void GetScriptAssetUuids(UUID scriptUuid, IDictionary assetUuids) + private void GetTextEmbeddedAssetUuids(UUID embeddingAssetId, IDictionary assetUuids) { - AssetBase scriptAsset = GetAsset(scriptUuid); + m_log.DebugFormat("[ASSET GATHERER]: Getting assets for asset {0}", embeddingAssetId); - if (null != scriptAsset) + AssetBase embeddingAsset = GetAsset(embeddingAssetId); + + if (null != embeddingAsset) { - string script = Utils.BytesToString(scriptAsset.Data); - //m_log.DebugFormat("[ARCHIVER]: Script {0}", script); - MatchCollection uuidMatches = Util.UUIDPattern.Matches(script); - //m_log.DebugFormat("[ARCHIVER]: Found {0} matches in script", uuidMatches.Count); + string script = Utils.BytesToString(embeddingAsset.Data); + m_log.DebugFormat("[ARCHIVER]: Script {0}", script); + MatchCollection uuidMatches = Util.PermissiveUUIDPattern.Matches(script); + m_log.DebugFormat("[ARCHIVER]: Found {0} matches in text", uuidMatches.Count); foreach (Match uuidMatch in uuidMatches) { UUID uuid = new UUID(uuidMatch.Value); - //m_log.DebugFormat("[ARCHIVER]: Recording {0} in script", uuid); + m_log.DebugFormat("[ARCHIVER]: Recording {0} in text", uuid); - // Assume AssetIDs embedded in scripts are textures + // Assume AssetIDs embedded are textures. assetUuids[uuid] = AssetType.Texture; } } @@ -265,7 +271,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// Dictionary in which to record the references - protected void GetWearableAssetUuids(UUID wearableAssetUuid, IDictionary assetUuids) + private void GetWearableAssetUuids(UUID wearableAssetUuid, IDictionary assetUuids) { AssetBase assetBase = GetAsset(wearableAssetUuid); @@ -292,7 +298,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - protected void GetSceneObjectAssetUuids(UUID sceneObjectUuid, IDictionary assetUuids) + private void GetSceneObjectAssetUuids(UUID sceneObjectUuid, IDictionary assetUuids) { AssetBase objectAsset = GetAsset(sceneObjectUuid); @@ -321,7 +327,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - protected void GetGestureAssetUuids(UUID gestureUuid, IDictionary assetUuids) + private void GetGestureAssetUuids(UUID gestureUuid, IDictionary assetUuids) { AssetBase assetBase = GetAsset(gestureUuid); if (null == assetBase) diff --git a/OpenSim/Tests/Common/Helpers/AssetHelpers.cs b/OpenSim/Tests/Common/Helpers/AssetHelpers.cs index efeb9738c7..7af8bedf7a 100644 --- a/OpenSim/Tests/Common/Helpers/AssetHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/AssetHelpers.cs @@ -47,13 +47,24 @@ namespace OpenSim.Tests.Common } /// - /// Create a notecard asset with a random uuid and dummy text. + /// Create a notecard asset with dummy text and a random owner. /// /// /param> /// - public static AssetBase CreateNotecardAsset(UUID id) + public static AssetBase CreateNotecardAsset(UUID assetId) { - return CreateAsset(id, AssetType.Notecard, "hello", UUID.Random()); + return CreateNotecardAsset(assetId, "hello"); + } + + /// + /// Create a notecard asset with a random owner. + /// + /// /param> + /// + /// + public static AssetBase CreateNotecardAsset(UUID assetId, string text) + { + return CreateAsset(assetId, AssetType.Notecard, text, UUID.Random()); } // ///