* 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 compositionality0.6.0-stable
parent
5b159e957a
commit
ca88e3580b
|
@ -50,6 +50,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
/// <summary>
|
||||
/// Path for the prims file
|
||||
/// </summary>
|
||||
public static readonly string PRIMS_PATH = "objects/prims.xml";
|
||||
public static readonly string OBJECTS_PATH = "objects/";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<string> serialisedSceneObjects = new List<string>();
|
||||
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<IRegionSerialiser>();
|
||||
|
||||
// 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<EntityBase> m_sceneObjects;
|
||||
protected string m_savePath;
|
||||
protected string m_serializedEntities;
|
||||
|
||||
public ArchiveWriteRequestExecution(string serializedEntities, string savePath)
|
||||
public ArchiveWriteRequestExecution(
|
||||
List<EntityBase> sceneObjects, IRegionSerialiser serialiser, string savePath)
|
||||
{
|
||||
m_serializedEntities = serializedEntities;
|
||||
m_sceneObjects = sceneObjects;
|
||||
m_serialiser = serialiser;
|
||||
m_savePath = savePath;
|
||||
}
|
||||
|
||||
|
@ -60,7 +67,22 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
|
||||
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);
|
||||
|
|
|
@ -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<IRegionSerialiser>(), m_savePath);
|
||||
new AssetsRequest(assetUuids.Keys, m_scene.AssetCache, awre.ReceivedAllAssets).Execute();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get an xml representation of the given scene objects.
|
||||
/// </summary>
|
||||
/// <param name="scene"></param>
|
||||
/// <returns></returns>
|
||||
protected static string SerializeObjects(List<EntityBase> entities)
|
||||
{
|
||||
string serialization = "<scene>";
|
||||
|
||||
List<string> serObjects = new List<string>();
|
||||
|
||||
foreach (EntityBase ent in entities)
|
||||
{
|
||||
if (ent is SceneObjectGroup)
|
||||
{
|
||||
serObjects.Add(((SceneObjectGroup) ent).ToXmlString2());
|
||||
}
|
||||
}
|
||||
|
||||
foreach (string serObject in serObjects)
|
||||
serialization += serObject;
|
||||
|
||||
serialization += "</scene>";
|
||||
|
||||
return serialization;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -146,7 +146,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Number of prims in this group
|
||||
/// </summary>
|
||||
public int PrimCount
|
||||
{
|
||||
|
@ -164,14 +164,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
set { m_rootPart.GroupID = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public LLVector3 GroupCentrePoint
|
||||
{
|
||||
get { return new LLVector3(0, 0, 0); }
|
||||
}
|
||||
|
||||
public Dictionary<LLUUID, SceneObjectPart> Children
|
||||
{
|
||||
get { return m_parts; }
|
||||
|
|
Loading…
Reference in New Issue