public void TestCall( ) { Guid id = new Guid( GuidString ); string content = @"<?xml version=""1.0"" encoding=""utf-8""?>" + @"<rb>" + @" <object type=""Rb.ComponentXmlLoader.Tests.TestLoader+Root"" id=""" + GuidString + @""">" + @" <method objectId=""" + GuidString + @""" call=""Call""/>" + @" <method objectId=""" + GuidString + @""" call=""Call"">" + @" <parameters>" + @" <string value=""hello""/>" + @" </parameters>" + @" </method>" + @" </object>" + @"</rb>" + ""; Loader loader = new Loader( ); byte[] contentBytes = System.Text.Encoding.ASCII.GetBytes( content ); Definition = 0; ComponentLoadParameters parameters = new ComponentLoadParameters( ); loader.Load( MemorySource( contentBytes ), parameters ); Assert.IsTrue( parameters.Objects.ContainsKey( id ) ); object obj = parameters.Objects[ id ]; Assert.IsTrue( obj is Root ); }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder</param> public TypeBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { // Retrieve type name and optional assembly name from the element string typeName = reader.GetAttribute( "value" ); string assemblyName = reader.GetAttribute( "assembly" ); if ( typeName == null ) { throw new ApplicationException( string.Format( "Element \"{0}\" requires a \"type\" attribute", reader.Name ) ); } Type objectType = null; if ( assemblyName == null ) { // Get the object type from the currently loaded set of assemblies objectType = AppDomainUtils.FindType( typeName ); if ( objectType == null ) { throw new ApplicationException( string.Format( "Failed to find type \"{0}\" in app domain" , typeName ) ); } } else { // Get the object type from the specified assembly Assembly assembly = AppDomain.CurrentDomain.Load( assemblyName ); objectType = assembly.GetType( typeName ); if ( objectType == null ) { throw new ApplicationException( string.Format( "Failed to find type \"{0}\" in assembly \"{1}\"", typeName, assemblyName ) ); } } BuildObject = objectType; }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder</param> public ListBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { // NOTE: AP: This Just Works, because the base builder implementation checks if BuildObject is an // IList, and adds child build objects to it if so... this is all we need to do (in fact, <list> // is just a shorthand for <object type="System.Collections.ArrayList">) BuildObject = m_BuildObjects; }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this object</param> /// <param name="parentBuilder">Parent builder</param> public ObjectBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { // Retrieve type name and optional assembly name from the element string typeName = reader.GetAttribute( "type" ); string assemblyName = reader.GetAttribute( "assembly" ); Construct( reader.Name, typeName, assemblyName ); }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error log</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> public RootBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader ) : base(parameters, errors, reader, null) { if ( reader.Name != "rb" ) { errors.Add( reader, "Expected root node of component XML document to be named <rb>, not <{0}>", reader.Name ); } BuildObject = parameters.Target ?? m_ChildObjects; }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder</param> public BaseBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) { IXmlLineInfo lineInfo = reader as IXmlLineInfo; if ( lineInfo != null ) { m_Line = lineInfo.LineNumber; m_Column = lineInfo.LinePosition; } m_ParentBuilder = parentBuilder; m_Errors = errors; m_Parameters = parameters; m_Property = reader.GetAttribute( "property" ); m_DynProperty = reader.GetAttribute( "dynProperty" ); m_Name = reader.GetAttribute( "name" ); m_Id = reader.GetAttribute( "id" ); }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder</param> public AssetBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { string assetPath = reader.GetAttribute( "path" ); string instance = reader.GetAttribute( "instance" ); m_Instance = string.IsNullOrEmpty( instance ) ? false : bool.Parse( instance ); m_Loader = AssetManager.Instance.CreateLoadState( Locations.NewLocation( assetPath ), null ); string useCurrentParams = reader.GetAttribute( "useCurrentParameters" ); if ( useCurrentParams != null ) { if ( bool.Parse( useCurrentParams ) ) { m_Loader.Parameters = Parameters; } } }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder</param> public InstanceBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this object</param> /// <param name="parentBuilder">Parent builder</param> /// <param name="typeName">Name of the type to create</param> public ObjectBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder, string typeName ) : base(parameters, errors, reader, parentBuilder) { string assemblyName = reader.GetAttribute( "assembly" ); Construct( reader.Name, typeName, assemblyName ); }
/// <summary> /// Called from the form Load handler. Creates the main viewer, loading it from the source specified by ViewerSetupPath /// </summary> /// <returns>Return the main viewer object</returns> protected virtual Viewer CreateMainViewer( ) { Viewer viewer = null; ISource viewerSource = ViewerSetupPath; if ( viewerSource != null ) { try { // Load viewer ComponentLoadParameters loadParams = new ComponentLoadParameters( ); loadParams.Properties[ "User" ] = m_User; viewer = ( Viewer )AssetManager.Instance.Load( viewerSource, loadParams ); } catch ( Exception ex ) { AppLog.Exception( ex, "Failed to load viewer from \"{0}\"", viewerSource ); } } if ( viewer == null ) { AppLog.Info( "Creating default viewer" ); viewer = new Viewer( ); } return viewer; }
/// <summary> /// Loads component XML from a stream /// </summary> public object Load( Stream stream, ISource source, LoadParameters parameters ) { if ( !( parameters is ComponentLoadParameters ) ) { ComponentLoadParameters newParameters = new ComponentLoadParameters( parameters.Target ); foreach ( IDynamicProperty property in parameters.Properties ) { newParameters.Properties.Add( property ); } parameters = newParameters; } parameters.CanCache = false; ErrorCollection errors = new ErrorCollection( string.Copy( source.Path ) ); XmlTextReader reader = new XmlTextReader( stream ); reader.WhitespaceHandling = WhitespaceHandling.Significant; try { if ( reader.MoveToContent( ) == XmlNodeType.None ) { AssetsLog.Warning( "XML component asset \"{0}\" was empty - returning null", source.Name ); return null; } } catch ( XmlException ex ) { AssetsLog.Error( "Moving to XML component asset \"{0}\" content threw an exception", source.Name ); Entry entry = new Entry( AssetsLog.GetSource( Severity.Error ), ex.Message ); Source.HandleEntry( entry.Locate( source.Path, ex.LineNumber, ex.LinePosition, "" ) ); throw new ApplicationException( string.Format( "Failed to load component XML asset \"{0}\" (see log for details)", source.Name ) ); } string cacheable = reader.GetAttribute( "cacheable" ); parameters.CanCache = ( cacheable != null ) && ( ( cacheable == "yes" ) || ( cacheable == "true" ) ); RootBuilder builder = ( RootBuilder )BaseBuilder.CreateBuilderFromReader( null, ( ComponentLoadParameters )parameters, errors, reader ); if ( errors.Count == 0 ) { BaseBuilder.SafePostCreate( builder ); if ( errors.Count == 0 ) { BaseBuilder.SafeResolve( builder, true ); } } if ( ( builder.BuildObject == null ) && ( errors.Count == 0 ) ) { errors.Add( builder, "Empty components file" ); } if ( errors.Count > 0 ) { foreach ( Entry error in errors ) { Source.HandleEntry( error ); } throw new ApplicationException( string.Format( "Failed to load component XML asset \"{0}\" (see log for details)", source.Name ) ); } // TODO: AP: bit dubious... if there's more than one object, return a list if ( builder.Children.Count == 0 ) { throw new ApplicationException( string.Format( "Failed to load component XML asset \"{0}\" - did not contain any components", source.Name ) ); } if ( builder.Children.Count == 1 ) { return builder.Children[ 0 ]; } return builder.Children; }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder</param> public MethodBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { m_MethodName = reader.GetAttribute( "call" ); }
/// <summary> /// Creates a BaseBuilder-derived object from a name /// </summary> /// <param name="parentBuilder">Parent builder</param> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader</param> /// <returns>Returns the new builder, or null if there as an error</returns> public static BaseBuilder CreateBuilderFromReader( BaseBuilder parentBuilder, ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader ) { BaseBuilder result = null; try { switch ( reader.Name ) { case "null" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, null ); break; case "rb" : result = new RootBuilder( parameters, errors, reader ); break; case "object" : result = new ObjectBuilder( parameters, errors, reader, parentBuilder ); break; case "ref" : result = new ReferenceBuilder( parameters, errors, reader, parentBuilder ); break; case "asset" : result = new AssetBuilder( parameters, errors, reader, parentBuilder ); break; case "instance" : result = new InstanceBuilder( parameters, errors, reader, parentBuilder ); break; case "method" : result = new MethodBuilder( parameters, errors, reader, parentBuilder ); break; case "list" : result = new ListBuilder( parameters, errors, reader, parentBuilder ); break; case "table" : result = new DictionaryBuilder( parameters, errors, reader, parentBuilder ); break; case "type" : result = new TypeBuilder( parameters, errors, reader, parentBuilder ); break; case "template" : result = new TemplateBuilder( parameters, errors, reader, parentBuilder ); break; case "location" : string loc = reader.GetAttribute( "value" ); result = new ValueBuilder( parameters, errors,reader, parentBuilder, Locations.NewLocation( loc ) ); break; case "dictionaryEntry" : result = new DictionaryEntryBuilder( parameters, errors, reader, parentBuilder ); break; case "dynProperty" : object dynPropertyValue = parameters.Properties[ reader.GetAttribute( "value" ) ]; result = new ValueBuilder( parameters, errors, reader, parentBuilder, dynPropertyValue ); break; case "colour" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, MakeColour( reader ) ); break; case "string" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, reader.GetAttribute( "value" ) ); break; case "guid" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, new Guid( reader.GetAttribute( "value" ) ) ); break; case "bool" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, bool.Parse( reader.GetAttribute( "value" ) ) ); break; case "char" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, char.Parse( reader.GetAttribute( "value" ) ) ); break; case "byte" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, byte.Parse( reader.GetAttribute( "value" ) ) ); break; case "sbyte" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, sbyte.Parse( reader.GetAttribute( "value" ) ) ); break; case "short" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, short.Parse( reader.GetAttribute( "value" ) ) ); break; case "ushort" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, ushort.Parse( reader.GetAttribute( "value" ) ) ); break; case "int" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, int.Parse( reader.GetAttribute( "value" ) ) ); break; case "uint" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, uint.Parse( reader.GetAttribute( "value" ) ) ); break; case "long" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, long.Parse( reader.GetAttribute( "value" ) ) ); break; case "ulong" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, ulong.Parse( reader.GetAttribute( "value" ) ) ); break; case "float" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, float.Parse( reader.GetAttribute( "value" ) ) ); break; case "double" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, double.Parse( reader.GetAttribute( "value" ) ) ); break; case "timeSpan" : result = new ValueBuilder( parameters, errors, reader, parentBuilder, MakeTimeSpan( reader ) ); break; case "point3" : { float x = float.Parse( reader.GetAttribute( "x" ) ); float y = float.Parse( reader.GetAttribute( "y" ) ); float z = float.Parse( reader.GetAttribute( "z" ) ); result = new ValueBuilder( parameters, errors, reader, parentBuilder, new Point3( x, y, z ) ); break; } case "bigPoint3" : { long x = long.Parse( reader.GetAttribute( "x" ) ); long y = long.Parse( reader.GetAttribute( "y" ) ); long z = long.Parse( reader.GetAttribute( "z" ) ); result = new ValueBuilder( parameters, errors, reader, parentBuilder, new BigPoint3( x, y, z ) ); break; } case "vector2" : { float x = float.Parse( reader.GetAttribute( "x" ) ); float y = float.Parse( reader.GetAttribute( "y" ) ); result = new ValueBuilder( parameters, errors, reader, parentBuilder, new Vector2( x, y ) ); break; } case "vector3" : { float x = float.Parse( reader.GetAttribute( "x" ) ); float y = float.Parse( reader.GetAttribute( "y" ) ); float z = float.Parse( reader.GetAttribute( "z" ) ); result = new ValueBuilder( parameters, errors, reader, parentBuilder, new Vector3( x, y, z ) ); break; } case "point2" : case "quat" : { errors.Add( reader, "Element is not yet supported", reader.Name ); reader.Skip( ); break; } default : { // Interpret name as object type string typeName = reader.Name; result = new ObjectBuilder( parameters, errors, reader, parentBuilder, typeName ); break; } } } catch ( Exception ex ) { errors.Add( reader, ex, "Builder created from element \"{0}\" threw an exception", reader.Name ); reader.Skip( ); } if ( result != null ) { string name = reader.Name; try { result.ReadChildBuilders( reader ); } catch ( Exception ex ) { errors.Add( reader, ex, "Exception thrown while reading children from builder \"{0}\"", name ); } } return result; }
/// <summary> /// Setup constructor /// </summary> /// <param name="parameters">Load parameters</param> /// <param name="errors">Error collection</param> /// <param name="reader">XML reader positioned at the element that created this builder</param> /// <param name="parentBuilder">Parent builder object</param> public ReferenceBuilder( ComponentLoadParameters parameters, ErrorCollection errors, XmlReader reader, BaseBuilder parentBuilder ) : base(parameters, errors, reader, parentBuilder) { m_ObjectId = reader.GetAttribute( "objectId" ); m_Properties = reader.GetAttribute( "access" ); }
/// <summary> /// Copies members from this LoadParameters to parameters /// </summary> protected void DeepCopy( ComponentLoadParameters parameters ) { parameters.m_Builder = m_Builder; parameters.m_Objects = m_Objects; base.DeepCopy( parameters ); }
/// <summary> /// Clones this object /// </summary> /// <returns>Deep copy clone</returns> public override object Clone( ) { ComponentLoadParameters clone = new ComponentLoadParameters( ); DeepCopy( clone ); return clone; }