From 1abbad71b4603245e5481c11e3ce55f57b64935f Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 5 May 2015 20:59:09 -0700
Subject: Refactored some code that is used in two different dlls related to
SOP rewriting. Also added some unit tests that relate to mantis #7514
---
.../External/ExternalRepresentationUtils.cs | 184 +++++++++++++++++-
.../Framework/InventoryAccess/HGAssetMapper.cs | 209 +--------------------
.../CoreModules/World/Archiver/AssetsRequest.cs | 2 +-
.../Scenes/Tests/SceneObjectSerializationTests.cs | 136 ++++++++++++++
.../Services/HypergridService/HGAssetService.cs | 2 +-
5 files changed, 323 insertions(+), 210 deletions(-)
create mode 100644 OpenSim/Region/Framework/Scenes/Tests/SceneObjectSerializationTests.cs
diff --git a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs
index 6debf65..64de18b 100644
--- a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs
+++ b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs
@@ -125,7 +125,8 @@ namespace OpenSim.Framework.Serialization.External
/// The service for retrieving user account information
/// The scope of the user account information (Grid ID)
/// The SceneObjectPart represented in XML2
- public static string RewriteSOP(string xml, string homeURL, IUserAccountService userService, UUID scopeID)
+ [Obsolete("This method is deprecated. Use RewriteSOP instead.")]
+ public static string RewriteSOP_Old(string xml, string homeURL, IUserAccountService userService, UUID scopeID)
{
if (xml == string.Empty || homeURL == string.Empty || userService == null)
return xml;
@@ -173,6 +174,187 @@ namespace OpenSim.Framework.Serialization.External
}
}
+ ///
+ /// Takes a XML representation of a SceneObjectPart and returns another XML representation
+ /// with creator data added to it.
+ ///
+ /// The SceneObjectPart represented in XML2
+ /// An identifier for the component that's calling this function
+ /// The URL of the user agents service (home) for the creator
+ /// The service for retrieving user account information
+ /// The scope of the user account information (Grid ID)
+ /// The SceneObjectPart represented in XML2
+ public static string RewriteSOP(string xmlData, string sceneName, string homeURL, IUserAccountService userService, UUID scopeID)
+ {
+ // Console.WriteLine("Input XML [{0}]", xmlData);
+ if (xmlData == string.Empty || homeURL == string.Empty || userService == null)
+ return xmlData;
+
+ using (StringWriter sw = new StringWriter())
+ using (XmlTextWriter writer = new XmlTextWriter(sw))
+ using (XmlTextReader wrappedReader = new XmlTextReader(xmlData, XmlNodeType.Element, null))
+ using (XmlReader reader = XmlReader.Create(wrappedReader, new XmlReaderSettings() { IgnoreWhitespace = true, ConformanceLevel = ConformanceLevel.Fragment }))
+ {
+ TransformXml(reader, writer, sceneName, homeURL, userService, scopeID);
+
+ // Console.WriteLine("Output: [{0}]", sw.ToString());
+
+ return sw.ToString();
+ }
+ }
+
+ protected static void TransformXml(XmlReader reader, XmlWriter writer, string sceneName, string homeURI, IUserAccountService userAccountService, UUID scopeID)
+ {
+ // m_log.DebugFormat("[HG ASSET MAPPER]: Transforming XML");
+
+ int sopDepth = -1;
+ UserAccount creator = null;
+ bool hasCreatorData = false;
+
+ while (reader.Read())
+ {
+ // Console.WriteLine("Depth: {0}, name {1}", reader.Depth, reader.Name);
+
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Attribute:
+ // Console.WriteLine("FOUND ATTRIBUTE {0}", reader.Name);
+ writer.WriteAttributeString(reader.Name, reader.Value);
+ break;
+
+ case XmlNodeType.CDATA:
+ writer.WriteCData(reader.Value);
+ break;
+
+ case XmlNodeType.Comment:
+ writer.WriteComment(reader.Value);
+ break;
+
+ case XmlNodeType.DocumentType:
+ writer.WriteDocType(reader.Name, reader.Value, null, null);
+ break;
+
+ case XmlNodeType.Element:
+ // m_log.DebugFormat("Depth {0} at element {1}", reader.Depth, reader.Name);
+
+ writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
+
+ if (reader.HasAttributes)
+ {
+ while (reader.MoveToNextAttribute())
+ writer.WriteAttributeString(reader.Name, reader.Value);
+
+ reader.MoveToElement();
+ }
+
+ if (reader.LocalName == "SceneObjectPart")
+ {
+ if (sopDepth < 0)
+ {
+ sopDepth = reader.Depth;
+ // m_log.DebugFormat("[HG ASSET MAPPER]: Set sopDepth to {0}", sopDepth);
+ }
+ }
+ else
+ {
+ if (sopDepth >= 0 && reader.Depth == sopDepth + 1)
+ {
+ if (reader.Name == "CreatorID")
+ {
+ reader.Read();
+ if (reader.NodeType == XmlNodeType.Element && reader.Name == "Guid" || reader.Name == "UUID")
+ {
+ reader.Read();
+
+ if (reader.NodeType == XmlNodeType.Text)
+ {
+ UUID uuid = UUID.Zero;
+ UUID.TryParse(reader.Value, out uuid);
+ creator = userAccountService.GetUserAccount(scopeID, uuid);
+ writer.WriteElementString("UUID", reader.Value);
+ reader.Read();
+ }
+ else
+ {
+ // If we unexpected run across mixed content in this node, still carry on
+ // transforming the subtree (this replicates earlier behaviour).
+ TransformXml(reader, writer, sceneName, homeURI, userAccountService, scopeID);
+ }
+ }
+ else
+ {
+ // If we unexpected run across mixed content in this node, still carry on
+ // transforming the subtree (this replicates earlier behaviour).
+ TransformXml(reader, writer, sceneName, homeURI, userAccountService, scopeID);
+ }
+ }
+ else if (reader.Name == "CreatorData")
+ {
+ reader.Read();
+ if (reader.NodeType == XmlNodeType.Text)
+ {
+ hasCreatorData = true;
+ writer.WriteString(reader.Value);
+ }
+ else
+ {
+ // If we unexpected run across mixed content in this node, still carry on
+ // transforming the subtree (this replicates earlier behaviour).
+ TransformXml(reader, writer, sceneName, homeURI, userAccountService, scopeID);
+ }
+ }
+ }
+ }
+
+ if (reader.IsEmptyElement)
+ {
+ // m_log.DebugFormat("[HG ASSET MAPPER]: Writing end for empty element {0}", reader.Name);
+ writer.WriteEndElement();
+ }
+
+ break;
+
+ case XmlNodeType.EndElement:
+ // m_log.DebugFormat("Depth {0} at EndElement", reader.Depth);
+ if (sopDepth == reader.Depth)
+ {
+ if (!hasCreatorData && creator != null)
+ writer.WriteElementString(reader.Prefix, "CreatorData", reader.NamespaceURI, string.Format("{0};{1} {2}", homeURI, creator.FirstName, creator.LastName));
+
+ // m_log.DebugFormat("[HG ASSET MAPPER]: Reset sopDepth");
+ sopDepth = -1;
+ creator = null;
+ hasCreatorData = false;
+ }
+ writer.WriteEndElement();
+ break;
+
+ case XmlNodeType.EntityReference:
+ writer.WriteEntityRef(reader.Name);
+ break;
+
+ case XmlNodeType.ProcessingInstruction:
+ writer.WriteProcessingInstruction(reader.Name, reader.Value);
+ break;
+
+ case XmlNodeType.Text:
+ writer.WriteString(reader.Value);
+ break;
+
+ case XmlNodeType.XmlDeclaration:
+ // For various reasons, not all serializations have xml declarations (or consistent ones)
+ // and as it's embedded inside a byte stream we don't need it anyway, so ignore.
+ break;
+
+ default:
+ m_log.WarnFormat(
+ "[HG ASSET MAPPER]: Unrecognized node {0} in asset XML transform in {1}",
+ reader.NodeType, sceneName);
+ break;
+ }
+ }
+ }
+
public static string CalcCreatorData(string homeURL, string name)
{
return homeURL + ";" + name;
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs
index c2010b1..f54298c 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs
@@ -35,6 +35,7 @@ using System.Xml;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
+using OpenSim.Framework.Serialization.External;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.Framework.Scenes.Serialization;
@@ -189,217 +190,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
return Utils.StringToBytes(RewriteSOP(xml));
}
- protected void TransformXml(XmlReader reader, XmlWriter writer)
- {
-// m_log.DebugFormat("[HG ASSET MAPPER]: Transforming XML");
-
- int sopDepth = -1;
- UserAccount creator = null;
- bool hasCreatorData = false;
-
- while (reader.Read())
- {
-// Console.WriteLine("Depth: {0}, name {1}", reader.Depth, reader.Name);
-
- switch (reader.NodeType)
- {
- case XmlNodeType.Attribute:
-// Console.WriteLine("FOUND ATTRIBUTE {0}", reader.Name);
- writer.WriteAttributeString(reader.Name, reader.Value);
- break;
-
- case XmlNodeType.CDATA:
- writer.WriteCData(reader.Value);
- break;
-
- case XmlNodeType.Comment:
- writer.WriteComment(reader.Value);
- break;
-
- case XmlNodeType.DocumentType:
- writer.WriteDocType(reader.Name, reader.Value, null, null);
- break;
-
- case XmlNodeType.Element:
-// m_log.DebugFormat("Depth {0} at element {1}", reader.Depth, reader.Name);
-
- writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
-
- if (reader.HasAttributes)
- {
- while (reader.MoveToNextAttribute())
- writer.WriteAttributeString(reader.Name, reader.Value);
-
- reader.MoveToElement();
- }
-
- if (reader.LocalName == "SceneObjectPart")
- {
- if (sopDepth < 0)
- {
- sopDepth = reader.Depth;
-// m_log.DebugFormat("[HG ASSET MAPPER]: Set sopDepth to {0}", sopDepth);
- }
- }
- else
- {
- if (sopDepth >= 0 && reader.Depth == sopDepth + 1)
- {
- if (reader.Name == "CreatorID")
- {
- reader.Read();
- if (reader.NodeType == XmlNodeType.Element && reader.Name == "Guid" || reader.Name == "UUID")
- {
- reader.Read();
-
- if (reader.NodeType == XmlNodeType.Text)
- {
- UUID uuid = UUID.Zero;
- UUID.TryParse(reader.Value, out uuid);
- creator = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, uuid);
- writer.WriteElementString("UUID", reader.Value);
- reader.Read();
- }
- else
- {
- // If we unexpected run across mixed content in this node, still carry on
- // transforming the subtree (this replicates earlier behaviour).
- TransformXml(reader, writer);
- }
- }
- else
- {
- // If we unexpected run across mixed content in this node, still carry on
- // transforming the subtree (this replicates earlier behaviour).
- TransformXml(reader, writer);
- }
- }
- else if (reader.Name == "CreatorData")
- {
- reader.Read();
- if (reader.NodeType == XmlNodeType.Text)
- {
- hasCreatorData = true;
- writer.WriteString(reader.Value);
- }
- else
- {
- // If we unexpected run across mixed content in this node, still carry on
- // transforming the subtree (this replicates earlier behaviour).
- TransformXml(reader, writer);
- }
- }
- }
- }
-
- if (reader.IsEmptyElement)
- {
-// m_log.DebugFormat("[HG ASSET MAPPER]: Writing end for empty element {0}", reader.Name);
- writer.WriteEndElement();
- }
-
- break;
-
- case XmlNodeType.EndElement:
-// m_log.DebugFormat("Depth {0} at EndElement", reader.Depth);
- if (sopDepth == reader.Depth)
- {
- if (!hasCreatorData && creator != null)
- writer.WriteElementString(reader.Prefix, "CreatorData", reader.NamespaceURI, string.Format("{0};{1} {2}", m_HomeURI, creator.FirstName, creator.LastName));
-
-// m_log.DebugFormat("[HG ASSET MAPPER]: Reset sopDepth");
- sopDepth = -1;
- creator = null;
- hasCreatorData = false;
- }
- writer.WriteEndElement();
- break;
-
- case XmlNodeType.EntityReference:
- writer.WriteEntityRef(reader.Name);
- break;
-
- case XmlNodeType.ProcessingInstruction:
- writer.WriteProcessingInstruction(reader.Name, reader.Value);
- break;
-
- case XmlNodeType.Text:
- writer.WriteString(reader.Value);
- break;
-
- case XmlNodeType.XmlDeclaration:
- // For various reasons, not all serializations have xml declarations (or consistent ones)
- // and as it's embedded inside a byte stream we don't need it anyway, so ignore.
- break;
-
- default:
- m_log.WarnFormat(
- "[HG ASSET MAPPER]: Unrecognized node {0} in asset XML transform in {1}",
- reader.NodeType, m_scene.Name);
- break;
- }
- }
- }
-
protected string RewriteSOP(string xmlData)
{
// Console.WriteLine("Input XML [{0}]", xmlData);
+ return ExternalRepresentationUtils.RewriteSOP(xmlData, m_scene.Name, m_HomeURI, m_scene.UserAccountService, m_scene.RegionInfo.ScopeID);
- using (StringWriter sw = new StringWriter())
- using (XmlTextWriter writer = new XmlTextWriter(sw))
- using (XmlTextReader wrappedReader = new XmlTextReader(xmlData, XmlNodeType.Element, null))
- using (XmlReader reader = XmlReader.Create(wrappedReader, new XmlReaderSettings() { IgnoreWhitespace = true, ConformanceLevel = ConformanceLevel.Fragment }))
- {
- TransformXml(reader, writer);
-
-// Console.WriteLine("Output: [{0}]", sw.ToString());
-
- return sw.ToString();
- }
-
- // We are now taking the more complex streaming approach above because some assets can be very large
- // and can trigger higher CPU use or possibly memory problems.
-// XmlDocument doc = new XmlDocument();
-// doc.LoadXml(xml);
-// XmlNodeList sops = doc.GetElementsByTagName("SceneObjectPart");
-//
-// foreach (XmlNode sop in sops)
-// {
-// UserAccount creator = null;
-// bool hasCreatorData = false;
-// XmlNodeList nodes = sop.ChildNodes;
-// foreach (XmlNode node in nodes)
-// {
-// if (node.Name == "CreatorID")
-// {
-// UUID uuid = UUID.Zero;
-// UUID.TryParse(node.InnerText, out uuid);
-// creator = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, uuid);
-// }
-// if (node.Name == "CreatorData" && node.InnerText != null && node.InnerText != string.Empty)
-// hasCreatorData = true;
-//
-// //if (node.Name == "OwnerID")
-// //{
-// // UserAccount owner = GetUser(node.InnerText);
-// // if (owner != null)
-// // node.InnerText = m_ProfileServiceURL + "/" + node.InnerText + "/" + owner.FirstName + " " + owner.LastName;
-// //}
-// }
-//
-// if (!hasCreatorData && creator != null)
-// {
-// XmlElement creatorData = doc.CreateElement("CreatorData");
-// creatorData.InnerText = m_HomeURI + ";" + creator.FirstName + " " + creator.LastName;
-// sop.AppendChild(creatorData);
-// }
-// }
-//
-// using (StringWriter wr = new StringWriter())
-// {
-// doc.Save(wr);
-// return wr.ToString();
-// }
}
// TODO: unused
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
index 4d99a6e..db66c83 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
@@ -335,7 +335,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
if (asset.Type == (sbyte)AssetType.Object && asset.Data != null && m_options.ContainsKey("home"))
{
//m_log.DebugFormat("[ARCHIVER]: Rewriting object data for {0}", asset.ID);
- string xml = ExternalRepresentationUtils.RewriteSOP(Utils.BytesToString(asset.Data), m_options["home"].ToString(), m_userAccountService, m_scopeID);
+ string xml = ExternalRepresentationUtils.RewriteSOP(Utils.BytesToString(asset.Data), string.Empty, m_options["home"].ToString(), m_userAccountService, m_scopeID);
asset.Data = Utils.StringToBytes(xml);
}
return asset;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSerializationTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSerializationTests.cs
new file mode 100644
index 0000000..927d8e8
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSerializationTests.cs
@@ -0,0 +1,136 @@
+/*
+ * 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 OpenSimulator 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 System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Threading;
+using System.Xml;
+using System.Linq;
+using Nini.Config;
+using NUnit.Framework;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Framework.Serialization.External;
+using OpenSim.Framework.Communications;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Scenes.Serialization;
+using OpenSim.Services.Interfaces;
+using OpenSim.Tests.Common;
+
+namespace OpenSim.Region.Framework.Scenes.Tests
+{
+ ///
+ /// Basic scene object serialization tests.
+ ///
+ [TestFixture]
+ public class SceneObjectSerializationTests : OpenSimTestCase
+ {
+
+ ///
+ /// Serialize and deserialize.
+ ///
+ [Test]
+ public void TestSerialDeserial()
+ {
+ TestHelpers.InMethod();
+
+ Scene scene = new SceneHelpers().SetupScene();
+ int partsToTestCount = 3;
+
+ SceneObjectGroup so
+ = SceneHelpers.CreateSceneObject(partsToTestCount, TestHelpers.ParseTail(0x1), "obj1", 0x10);
+ SceneObjectPart[] parts = so.Parts;
+ so.Name = "obj1";
+ so.Description = "xpto";
+
+ string xml = SceneObjectSerializer.ToXml2Format(so);
+ Assert.That(!string.IsNullOrEmpty(xml), "SOG serialization resulted in empty or null string");
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(xml);
+ XmlNodeList nodes = doc.GetElementsByTagName("SceneObjectPart");
+ Assert.That(nodes.Count, Is.EqualTo(3), "SOG serialization resulted in wrong number of SOPs");
+
+ SceneObjectGroup so2 = SceneObjectSerializer.FromXml2Format(xml);
+ Assert.IsNotNull(so2, "SOG deserialization resulted in null object");
+ Assert.That(so2.Name == so.Name, "Name of deserialized object does not match original name");
+ Assert.That(so2.Description == so.Description, "Description of deserialized object does not match original name");
+ }
+
+ ///
+ /// This checks for a bug reported in mantis #7514
+ ///
+ [Test]
+ public void TestNamespaceAttribute()
+ {
+ TestHelpers.InMethod();
+
+ Scene scene = new SceneHelpers().SetupScene();
+ UserAccount account = new UserAccount(UUID.Zero, UUID.Random(), "Test", "User", string.Empty);
+ scene.UserAccountService.StoreUserAccount(account);
+ int partsToTestCount = 1;
+
+ SceneObjectGroup so
+ = SceneHelpers.CreateSceneObject(partsToTestCount, TestHelpers.ParseTail(0x1), "obj1", 0x10);
+ SceneObjectPart[] parts = so.Parts;
+ so.Name = "obj1";
+ so.Description = "xpto";
+ so.OwnerID = account.PrincipalID;
+ so.RootPart.CreatorID = so.OwnerID;
+
+ string xml = SceneObjectSerializer.ToXml2Format(so);
+ Assert.That(!string.IsNullOrEmpty(xml), "SOG serialization resulted in empty or null string");
+
+ xml = ExternalRepresentationUtils.RewriteSOP(xml, "Test Scene", "http://localhost", scene.UserAccountService, UUID.Zero);
+ //Console.WriteLine(xml);
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(xml);
+
+ XmlNodeList nodes = doc.GetElementsByTagName("SceneObjectPart");
+ Assert.That(nodes.Count, Is.GreaterThan(0), "SOG serialization resulted in no SOPs");
+ foreach (XmlAttribute a in nodes[0].Attributes)
+ {
+ int count = a.Name.Count(c => c == ':');
+ Assert.That(count, Is.EqualTo(1), "Cannot have multiple ':' in attribute name in SOP");
+ }
+ nodes = doc.GetElementsByTagName("CreatorData");
+ Assert.That(nodes.Count, Is.GreaterThan(0), "SOG serialization resulted in no CreatorData");
+ foreach (XmlAttribute a in nodes[0].Attributes)
+ {
+ int count = a.Name.Count(c => c == ':');
+ Assert.That(count, Is.EqualTo(1), "Cannot have multiple ':' in attribute name in CreatorData");
+ }
+
+ SceneObjectGroup so2 = SceneObjectSerializer.FromXml2Format(xml);
+ Assert.IsNotNull(so2, "SOG deserialization resulted in null object");
+ Assert.AreNotEqual(so.RootPart.CreatorIdentification, so2.RootPart.CreatorIdentification, "RewriteSOP failed to transform CreatorData.");
+ Assert.That(so2.RootPart.CreatorIdentification.Contains("http://"), "RewriteSOP failed to add the homeURL to CreatorData");
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Services/HypergridService/HGAssetService.cs b/OpenSim/Services/HypergridService/HGAssetService.cs
index b57f8d8..a829932 100644
--- a/OpenSim/Services/HypergridService/HGAssetService.cs
+++ b/OpenSim/Services/HypergridService/HGAssetService.cs
@@ -163,7 +163,7 @@ namespace OpenSim.Services.HypergridService
protected byte[] AdjustIdentifiers(byte[] data)
{
string xml = Utils.BytesToString(data);
- return Utils.StringToBytes(ExternalRepresentationUtils.RewriteSOP(xml, m_HomeURL, m_Cache, UUID.Zero));
+ return Utils.StringToBytes(ExternalRepresentationUtils.RewriteSOP(xml, "HGAssetService", m_HomeURL, m_Cache, UUID.Zero));
}
}
--
cgit v1.1