From ca88e3580b8ef94cd882d1b6723c37815601e54e Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Sat, 21 Jun 2008 23:45:22 +0000
Subject: * archive each object as a separate xml file rather than put them all
in one single large file * this is being done for reasons of compositionality
---
.../Modules/World/Archiver/ArchiveConstants.cs | 2 +-
.../Modules/World/Archiver/ArchiveReadRequest.cs | 35 +++++-----------------
.../World/Archiver/ArchiveWriteRequestExecution.cs | 34 +++++++++++++++++----
.../Archiver/ArchiveWriteRequestPreparation.cs | 35 +++-------------------
4 files changed, 41 insertions(+), 65 deletions(-)
(limited to 'OpenSim/Region/Environment/Modules/World')
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveConstants.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveConstants.cs
index a96325f..388c541 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveConstants.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveConstants.cs
@@ -50,6 +50,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
///
/// Path for the prims file
///
- public static readonly string PRIMS_PATH = "objects/prims.xml";
+ public static readonly string OBJECTS_PATH = "objects/";
}
}
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs
index 26fc1a6..8d882ea 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs
@@ -29,6 +29,7 @@ using OpenSim.Framework;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Modules.World.Serialiser;
using System;
+using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Xml;
@@ -62,9 +63,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
TarArchiveReader archive = new TarArchiveReader(m_loadPath);
AssetsDearchiver dearchiver = new AssetsDearchiver(m_scene.AssetCache);
- string serializedPrims = string.Empty;
-
- // Just test for now by reading first file
+ List serialisedSceneObjects = new List();
string filePath = "ERROR";
byte[] data;
@@ -73,9 +72,9 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
m_log.DebugFormat(
"[ARCHIVER]: Successfully read {0} ({1} bytes) from archive {2}", filePath, data.Length, m_loadPath);
- if (filePath.Equals(ArchiveConstants.PRIMS_PATH))
+ if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH))
{
- serializedPrims = m_asciiEncoding.GetString(data);
+ serialisedSceneObjects.Add(m_asciiEncoding.GetString(data));
}
else if (filePath.Equals(ArchiveConstants.ASSETS_METADATA_PATH))
{
@@ -92,35 +91,17 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
archive.Close();
- if (serializedPrims.Equals(string.Empty))
- {
- m_log.ErrorFormat("[ARCHIVER]: Archive did not contain a {0} file", ArchiveConstants.PRIMS_PATH);
- return;
- }
-
// Reload serialized prims
- m_log.InfoFormat("[ARCHIVER]: Loading scene objects");
+ m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects", serialisedSceneObjects.Count);
IRegionSerialiser serialiser = m_scene.RequestModuleInterface();
-
- // Temporary code to read each sog in the file separately, pending actually having these in separate files
- XmlTextReader xtr = new XmlTextReader(new StringReader(serializedPrims));
- XmlDocument doc = new XmlDocument();
- xtr.WhitespaceHandling = WhitespaceHandling.None;
- doc.Load(xtr);
- xtr.Close();
- XmlNode sceneNode = doc.FirstChild;
- int count = 0;
- foreach (XmlNode objectNode in sceneNode.ChildNodes)
+ foreach (string serialisedSceneObject in serialisedSceneObjects)
{
- serialiser.LoadGroupFromXml2(m_scene, objectNode.OuterXml.ToString());
- count++;
+ serialiser.LoadGroupFromXml2(m_scene, serialisedSceneObject);
}
- //serialiser.LoadPrimsFromXml2(m_scene, new StringReader(serializedPrims));
-
- m_log.DebugFormat("[ARCHIVER]: Loaded {0} scene objects", count);
+ m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive");
}
}
}
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs
index 199539b..3799c57 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs
@@ -25,11 +25,15 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+using System;
using System.Collections.Generic;
using System.Reflection;
using libsecondlife;
using log4net;
using OpenSim.Framework;
+using OpenSim.Region.Environment.Interfaces;
+using OpenSim.Region.Environment.Modules.World.Serialiser;
+using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules.World.Archiver
{
@@ -45,12 +49,15 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ protected IRegionSerialiser m_serialiser;
+ protected List m_sceneObjects;
protected string m_savePath;
- protected string m_serializedEntities;
- public ArchiveWriteRequestExecution(string serializedEntities, string savePath)
+ public ArchiveWriteRequestExecution(
+ List sceneObjects, IRegionSerialiser serialiser, string savePath)
{
- m_serializedEntities = serializedEntities;
+ m_sceneObjects = sceneObjects;
+ m_serialiser = serialiser;
m_savePath = savePath;
}
@@ -59,8 +66,23 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
m_log.DebugFormat("[ARCHIVER]: Received all {0} assets required", assets.Count);
TarArchiveWriter archive = new TarArchiveWriter();
-
- archive.AddFile(ArchiveConstants.PRIMS_PATH, m_serializedEntities);
+
+ foreach (EntityBase entity in m_sceneObjects)
+ {
+ // FIXME: I'm fairly sure that all entities are in fact SceneObjectGroups... must fix this
+ SceneObjectGroup sceneObject = (SceneObjectGroup)entity;
+ LLVector3 position = sceneObject.AbsolutePosition;
+
+ string serializedObject = m_serialiser.SaveGroupToXml2(sceneObject);
+ string filename
+ = string.Format(
+ "{0}{1}_{2:000}-{3:000}-{4:000}__{5}.xml",
+ ArchiveConstants.OBJECTS_PATH, sceneObject.Name,
+ Math.Round(position.X), Math.Round(position.Y), Math.Round(position.Z),
+ sceneObject.UUID);
+
+ archive.AddFile(filename, serializedObject);
+ }
AssetsArchiver assetsArchiver = new AssetsArchiver(assets);
assetsArchiver.Archive(archive);
@@ -68,6 +90,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
archive.WriteTar(m_savePath);
m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive {0}", m_savePath);
- }
+ }
}
}
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
index a0c6dbf..5d63ce4 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
@@ -172,44 +172,17 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
}
}
- string serializedEntities = SerializeObjects(entities);
-
- if (serializedEntities != null && serializedEntities.Length > 0)
+ if (entities.Count > 0)
{
m_log.DebugFormat("[ARCHIVER]: Successfully got serialization for {0} entities", entities.Count);
m_log.DebugFormat("[ARCHIVER]: Requiring save of {0} assets", assetUuids.Count);
// Asynchronously request all the assets required to perform this archive operation
- ArchiveWriteRequestExecution awre = new ArchiveWriteRequestExecution(serializedEntities, m_savePath);
+ ArchiveWriteRequestExecution awre
+ = new ArchiveWriteRequestExecution(
+ entities, m_scene.RequestModuleInterface(), m_savePath);
new AssetsRequest(assetUuids.Keys, m_scene.AssetCache, awre.ReceivedAllAssets).Execute();
}
}
-
- ///
- /// Get an xml representation of the given scene objects.
- ///
- ///
- ///
- protected static string SerializeObjects(List entities)
- {
- string serialization = "";
-
- List serObjects = new List();
-
- foreach (EntityBase ent in entities)
- {
- if (ent is SceneObjectGroup)
- {
- serObjects.Add(((SceneObjectGroup) ent).ToXmlString2());
- }
- }
-
- foreach (string serObject in serObjects)
- serialization += serObject;
-
- serialization += "";
-
- return serialization;
- }
}
}
--
cgit v1.1