Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add "dump object uuid" console command. This allows any object in the…

… scene to be serialized and dumped to XML for debug purposes.
  • Loading branch information...
commit 73db057fa1dbda7d6dff7de770cef8670b234f84 1 parent 326f150
Justin Clark-Casey justincc authored
206 OpenSim/Framework/Console/ConsoleUtil.cs
View
@@ -32,100 +32,124 @@
using log4net;
using OpenMetaverse;
-public class ConsoleUtil
+namespace OpenSim.Framework.Console
{
-// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
- /// <summary>
- /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section
- /// rather than in each help summary.
- /// </summary>
- public const string CoordHelp
-= @"Each component of the coord is comma separated. There must be no spaces between the commas.
-If you don't care about the z component you can simply omit it.
-If you don't care about the x or y components then you can leave them blank (though a comma is still required)
-If you want to specify the maxmimum value of a component then you can use ~ instead of a number
-If you want to specify the minimum value of a component then you can use -~ instead of a number
-e.g.
-delete object pos 20,20,20 to 40,40,40
-delete object pos 20,20 to 40,40
-delete object pos ,20,20 to ,40,40
-delete object pos ,,30 to ,,~
-delete object pos ,,-~ to ,,30";
-
- public const string MinRawConsoleVectorValue = "-~";
- public const string MaxRawConsoleVectorValue = "~";
-
- public const string VectorSeparator = ",";
- public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray();
-
- /// <summary>
- /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3
- /// </summary>
- /// <param name='rawConsoleVector'>/param>
- /// <param name='vector'></param>
- /// <returns></returns>
- public static bool TryParseConsoleMinVector(string rawConsoleVector, out Vector3 vector)
+ public class ConsoleUtil
{
- return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector);
- }
-
- /// <summary>
- /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3
- /// </summary>
- /// <param name='rawConsoleVector'>/param>
- /// <param name='vector'></param>
- /// <returns></returns>
- public static bool TryParseConsoleMaxVector(string rawConsoleVector, out Vector3 vector)
- {
- return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector);
- }
-
- /// <summary>
- /// Convert a vector input from the console to an OpenMetaverse.Vector3
- /// </summary>
- /// <param name='rawConsoleVector'>
- /// A string in the form <x>,<y>,<z> where there is no space between values.
- /// Any component can be missing (e.g. ,,40). blankComponentFunc is invoked to replace the blank with a suitable value
- /// Also, if the blank component is at the end, then the comma can be missed off entirely (e.g. 40,30 or 40)
- /// The strings "~" and "-~" are valid in components. The first substitutes float.MaxValue whilst the second is float.MinValue
- /// Other than that, component values must be numeric.
- /// </param>
- /// <param name='blankComponentFunc'></param>
- /// <param name='vector'></param>
- /// <returns></returns>
- public static bool TryParseConsoleVector(
- string rawConsoleVector, Func<string, string> blankComponentFunc, out Vector3 vector)
- {
- List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList();
-
- if (components.Count < 1 || components.Count > 3)
+ // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ /// <summary>
+ /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section
+ /// rather than in each help summary.
+ /// </summary>
+ public const string CoordHelp
+ = @"Each component of the coord is comma separated. There must be no spaces between the commas.
+ If you don't care about the z component you can simply omit it.
+ If you don't care about the x or y components then you can leave them blank (though a comma is still required)
+ If you want to specify the maxmimum value of a component then you can use ~ instead of a number
+ If you want to specify the minimum value of a component then you can use -~ instead of a number
+ e.g.
+ delete object pos 20,20,20 to 40,40,40
+ delete object pos 20,20 to 40,40
+ delete object pos ,20,20 to ,40,40
+ delete object pos ,,30 to ,,~
+ delete object pos ,,-~ to ,,30";
+
+ public const string MinRawConsoleVectorValue = "-~";
+ public const string MaxRawConsoleVectorValue = "~";
+
+ public const string VectorSeparator = ",";
+ public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray();
+
+ /// <summary>
+ /// Try to parse a console UUID from the console.
+ /// </summary>
+ /// <remarks>
+ /// Will complain to the console if parsing fails.
+ /// </remarks>
+ /// <returns></returns>
+ /// <param name='console'></param>
+ /// <param name='rawUuid'></param>
+ /// <param name='uuid'></param>
+ public static bool TryParseConsoleUuid(ICommandConsole console, string rawUuid, out UUID uuid)
{
- vector = Vector3.Zero;
- return false;
+ if (!UUID.TryParse(rawUuid, out uuid))
+ {
+ console.OutputFormat("{0} is not a valid uuid", rawUuid);
+ return false;
+ }
+
+ return true;
+ }
+
+ /// <summary>
+ /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3
+ /// </summary>
+ /// <param name='rawConsoleVector'>/param>
+ /// <param name='vector'></param>
+ /// <returns></returns>
+ public static bool TryParseConsoleMinVector(string rawConsoleVector, out Vector3 vector)
+ {
+ return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector);
+ }
+
+ /// <summary>
+ /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3
+ /// </summary>
+ /// <param name='rawConsoleVector'>/param>
+ /// <param name='vector'></param>
+ /// <returns></returns>
+ public static bool TryParseConsoleMaxVector(string rawConsoleVector, out Vector3 vector)
+ {
+ return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector);
+ }
+
+ /// <summary>
+ /// Convert a vector input from the console to an OpenMetaverse.Vector3
+ /// </summary>
+ /// <param name='rawConsoleVector'>
+ /// A string in the form <x>,<y>,<z> where there is no space between values.
+ /// Any component can be missing (e.g. ,,40). blankComponentFunc is invoked to replace the blank with a suitable value
+ /// Also, if the blank component is at the end, then the comma can be missed off entirely (e.g. 40,30 or 40)
+ /// The strings "~" and "-~" are valid in components. The first substitutes float.MaxValue whilst the second is float.MinValue
+ /// Other than that, component values must be numeric.
+ /// </param>
+ /// <param name='blankComponentFunc'></param>
+ /// <param name='vector'></param>
+ /// <returns></returns>
+ public static bool TryParseConsoleVector(
+ string rawConsoleVector, Func<string, string> blankComponentFunc, out Vector3 vector)
+ {
+ List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList();
+
+ if (components.Count < 1 || components.Count > 3)
+ {
+ vector = Vector3.Zero;
+ return false;
+ }
+
+ for (int i = components.Count; i < 3; i++)
+ components.Add("");
+
+ List<string> semiDigestedComponents
+ = components.ConvertAll<string>(
+ c =>
+ {
+ if (c == "")
+ return blankComponentFunc.Invoke(c);
+ else if (c == MaxRawConsoleVectorValue)
+ return float.MaxValue.ToString();
+ else if (c == MinRawConsoleVectorValue)
+ return float.MinValue.ToString();
+ else
+ return c;
+ });
+
+ string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray());
+
+ // m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector);
+
+ return Vector3.TryParse(semiDigestedConsoleVector, out vector);
}
-
- for (int i = components.Count; i < 3; i++)
- components.Add("");
-
- List<string> semiDigestedComponents
- = components.ConvertAll<string>(
- c =>
- {
- if (c == "")
- return blankComponentFunc.Invoke(c);
- else if (c == MaxRawConsoleVectorValue)
- return float.MaxValue.ToString();
- else if (c == MinRawConsoleVectorValue)
- return float.MinValue.ToString();
- else
- return c;
- });
-
- string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray());
-
-// m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector);
-
- return Vector3.TryParse(semiDigestedConsoleVector, out vector);
}
}
53 OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
View
@@ -27,10 +27,12 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
+using System.Xml;
using log4net;
using Mono.Addins;
using NDesk.Options;
@@ -41,6 +43,7 @@
using OpenSim.Framework.Monitoring;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Scenes.Serialization;
namespace OpenSim.Region.CoreModules.World.Objects.Commands
{
@@ -181,6 +184,16 @@ public void AddRegion(Scene scene)
"Show details of scene object parts within the given area.",
ConsoleUtil.CoordHelp,
HandleShowPartByPos);
+
+ m_console.Commands.AddCommand(
+ "Objects",
+ false,
+ "dump object uuid",
+ "dump object uuid <UUID>",
+ "Dump the formatted serialization of the given object to the file <UUID>.xml",
+ "e.g. dump object uuid c1ed6809-cc24-4061-a4c2-93082a2d1f1d will dump serialization to c1ed6809-cc24-4061-a4c2-93082a2d1f1d.xml\n"
+ + "To locate the UUID in the first place, you need to use the other show object commands",
+ HandleDumpObjectByUuid);
}
public void RemoveRegion(Scene scene)
@@ -447,6 +460,46 @@ private void HandleShowPartByName(string module, string[] cmdparams)
OutputSopsToConsole(searchPredicate, true);
}
+ private void HandleDumpObjectByUuid(string module, string[] cmdparams)
+ {
+ if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
+ return;
+
+ if (cmdparams.Length < 4)
+ {
+ m_console.OutputFormat("Usage: dump object uuid <uuid>");
+ return;
+ }
+
+ UUID objectUuid;
+ if (!ConsoleUtil.TryParseConsoleUuid(m_console, cmdparams[3], out objectUuid))
+ return;
+
+ SceneObjectGroup so = m_scene.GetSceneObjectGroup(objectUuid);
+
+ if (so == null)
+ {
+// m_console.OutputFormat("No part found with uuid {0}", objectUuid);
+ return;
+ }
+
+ string fileName = string.Format("{0}.xml", objectUuid);
+
+ if (File.Exists(fileName))
+ {
+ m_console.OutputFormat("File {0} already exists. Please move or remove it.", fileName);
+ return;
+ }
+
+ using (XmlTextWriter xtw = new XmlTextWriter(fileName, Encoding.UTF8))
+ {
+ xtw.Formatting = Formatting.Indented;
+ SceneObjectSerializer.ToOriginalXmlFormat(so, xtw, true);
+ }
+
+ m_console.OutputFormat("Object dumped to file {0}", fileName);
+ }
+
/// <summary>
/// Append a scene object report to an input StringBuilder
/// </summary>
Please sign in to comment.
Something went wrong with that request. Please try again.