From 2b842958cc172fbf9ee79b495a268f012fb47cdc Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 16 Feb 2012 02:58:00 +0000
Subject: If shape properties fail SOP parsing (e.g. due to commas instead of
decimal points) print out one short message listing the failing node names
rather than lots of exceptions.
Adds skeleton bad float values deserialization test
---
.../World/Serialiser/Tests/SerialiserTests.cs | 133 +++++++++++++++++++++
.../Scenes/Serialization/SceneObjectSerializer.cs | 34 ++++--
2 files changed, 155 insertions(+), 12 deletions(-)
diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
index d5b585a..9c8c4d5 100644
--- a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
+++ b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
@@ -148,6 +148,113 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
";
+ private string badFloatsXml = @"
+
+
+
+ false
+ a6dacf01-4636-4bb9-8a97-30609438af9d
+ e6a5a05e-e8cc-4816-8701-04165e335790
+ 1
+
+ 0
+ e6a5a05e-e8cc-4816-8701-04165e335790
+ 2698615125
+ NaughtyPrim
+ 0
+ false
+ 1099511628032000
+ 0
+ 147.2392.69822.78084
+ 000
+ -4.371139E-08-1-4.371139E-080
+ 000
+ 000
+ 000
+ 000
+
+
+
+
+
+ 0
+ 0
+
+ 1
+ AAAAAAAAERGZmQAAAAAABQCVlZUAAAAAQEAAAABAQAAAAAAAAAAAAAAAAAAAAA==
+ AA==
+ 0
+ 16
+ 0
+ 0
+ 0
+ 100
+ 100
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 9
+ 0
+ 0
+ 0
+ 10100.5
+ 0
+ Square
+ Same
+ 00000000-0000-0000-0000-000000000000
+ 0
+ 0
+ 0,5
+ yo mamma
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 0
+ 0
+ 1
+ false
+ false
+ false
+
+ 10100.5
+ 0
+ 0001
+ 000
+ 000
+ 0001
+ 0
+ 1211330445
+ 0
+ 0
+ 0
+ 0
+ 00000000-0000-0000-0000-000000000000
+ a6dacf01-4636-4bb9-8a97-30609438af9d
+ a6dacf01-4636-4bb9-8a97-30609438af9d
+ 2147483647
+ 2147483647
+ 0
+ 0
+ 2147483647
+ None
+ 00000000-0000-0000-0000-000000000000
+ 0
+
+
+
+ ";
+
private string xml2 = @"
@@ -257,6 +364,32 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
}
[Test]
+ public void TestDeserializeBadFloatsXml()
+ {
+ TestHelpers.InMethod();
+ log4net.Config.XmlConfigurator.Configure();
+
+ SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(badFloatsXml);
+ SceneObjectPart rootPart = so.RootPart;
+
+ Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790")));
+ Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d")));
+ Assert.That(rootPart.Name, Is.EqualTo("NaughtyPrim"));
+
+ // This terminates the deserialization earlier if couldn't be parsed.
+ // TODO: Need to address this
+ Assert.That(rootPart.GroupPosition.X, Is.EqualTo(147.23f));
+
+ Assert.That(rootPart.Shape.PathCurve, Is.EqualTo(16));
+
+ // Defaults for bad parses
+ Assert.That(rootPart.Shape.FlexiTension, Is.EqualTo(0));
+ Assert.That(rootPart.Shape.FlexiDrag, Is.EqualTo(0));
+
+ // TODO: Check other properties
+ }
+
+ [Test]
public void TestSerializeXml()
{
TestHelpers.InMethod();
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 0a32214..e6b88a3 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
+using System.Linq;
using System.Reflection;
using System.Xml;
using log4net;
@@ -570,13 +571,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader)
{
- bool errors = false;
- obj.Shape = ReadShape(reader, "Shape", out errors);
+ List errorNodeNames;
+ obj.Shape = ReadShape(reader, "Shape", out errorNodeNames);
- if (errors)
+ if (errorNodeNames != null)
+ {
m_log.DebugFormat(
- "[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors. Please see earlier log entries.",
- obj.Name, obj.UUID);
+ "[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors in properties {2}.",
+ obj.Name, obj.UUID, string.Join(", ", errorNodeNames.ToArray()));
+ }
}
private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader)
@@ -1519,37 +1522,44 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
///
///
/// The name of the xml element containing the shape
- /// true if any errors were encountered during parsing, false otherwise
+ /// a list containing the failing node names. If no failures then null.
/// The shape parsed
- public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors)
+ public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out List errorNodeNames)
{
- errors = false;
+ List internalErrorNodeNames = null;
PrimitiveBaseShape shape = new PrimitiveBaseShape();
if (reader.IsEmptyElement)
{
reader.Read();
+ errorNodeNames = null;
return shape;
}
reader.ReadStartElement(name, String.Empty); // Shape
- errors = ExternalRepresentationUtils.ExecuteReadProcessors(
+ ExternalRepresentationUtils.ExecuteReadProcessors(
shape,
m_ShapeXmlProcessors,
reader,
(o, nodeName, e)
=>
{
- m_log.DebugFormat(
- "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}",
- nodeName, e.Message, e.StackTrace);
+// m_log.DebugFormat(
+// "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}",
+// nodeName, e.Message, e.StackTrace);
+ if (internalErrorNodeNames == null)
+ internalErrorNodeNames = new List();
+
+ internalErrorNodeNames.Add(nodeName);
}
);
reader.ReadEndElement(); // Shape
+ errorNodeNames = internalErrorNodeNames;
+
return shape;
}
--
cgit v1.1