private void ReadPlugin( XmlReader r ) { r.Read(); PluginInfo p = new PluginInfo( null, AssemblyInfoHelper.ExecutingAssemblyInfo ); loadedPlugins.Add( p ); Point pos = new Point(); pos.X = Double.NaN; pos.Y = Double.NaN; while( r.Read() ) { if( r.IsStartElement() && !r.IsEmptyElement ) { switch( r.Name ) { case "FullName": if( r.Read() ) { string fullName = r.Value; p.PluginFullName = fullName; } break; case "Service": if( r.Read() ) { string serviceFullName = r.Value; if( !String.IsNullOrEmpty( serviceFullName ) ) { if( loadedServices.Contains( serviceFullName ) ) { var service = loadedServices.GetByKey( serviceFullName ); p.Service = service; service.InternalImplementations.Add( p ); } else { pendingPluginServices.Add( new PendingPluginService( p, serviceFullName ) ); } } } break; case "ServiceReferences": var s = r.ReadSubtree(); while( s.Read() ) { if( s.IsStartElement() && s.Name == "ServiceReference" ) { string serviceFullName2 = s.GetAttribute( "Service" ); if( !String.IsNullOrEmpty( serviceFullName2 ) ) { DependencyRequirement requirement = (DependencyRequirement)Enum.Parse( typeof( DependencyRequirement ), s.GetAttribute( "Requirement" ) ); if( loadedServices.Contains( serviceFullName2 ) ) { MockServiceReferenceInfo i = new MockServiceReferenceInfo( p, loadedServices.GetByKey( serviceFullName2 ), requirement ); p.InternalServiceReferences.Add( i ); } else { pendingServiceReferences.Add( new PendingServiceReference( p, serviceFullName2, requirement ) ); } } } } break; case "X": if( r.Read() ) { double posX; if( Double.TryParse( r.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out posX) ) pos.X = posX; } break; case "Y": if( r.Read() ) { double posY; if( Double.TryParse( r.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out posY ) ) pos.Y = posY; } break; } } } p.PositionInGraph = pos; }
private void ReadService( XmlReader r ) { r.Read(); string serviceFullName = r.GetAttribute( "FullName" ); Debug.Assert( serviceFullName != null, "FullName attribute was found in Service XML element." ); ServiceInfo s = new ServiceInfo( serviceFullName, AssemblyInfoHelper.ExecutingAssemblyInfo ); loadedServices.Add( s ); ServiceInfo generalization = null; Point pos = new Point(); pos.X = Double.NaN; pos.Y = Double.NaN; while( r.Read() ) { if( r.IsStartElement() && !r.IsEmptyElement ) { switch( r.Name ) { case "Generalization": if( r.Read() ) { string generalizationName = r.Value; if( !String.IsNullOrEmpty( generalizationName ) ) { if( loadedServices.Contains( generalizationName ) ) { generalization = loadedServices.GetByKey( generalizationName ); s.Generalization = generalization; } else { pendingGeneralizations.Add( new PendingGeneralization( s, generalizationName ) ); } } } break; case "X": if( r.Read() ) { double posX; if( Double.TryParse( r.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out posX ) ) pos.X = posX; } break; case "Y": if( r.Read() ) { double posY; if( Double.TryParse( r.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out posY ) ) pos.Y = posY; } break; } } } s.PositionInGraph = pos; // Fix pending references of this service foreach( var pg in pendingGeneralizations.Where( x => x.PendingServiceFullName == serviceFullName ).ToList() ) { pg.Service.Generalization = s; pendingGeneralizations.Remove( pg ); } foreach( var pps in pendingPluginServices.Where( x => x.PendingServiceFullName == serviceFullName ).ToList() ) { pps.Plugin.Service = s; s.InternalImplementations.Add( pps.Plugin ); pendingPluginServices.Remove( pps ); } foreach( var psr in pendingServiceReferences.Where( x => x.PendingServiceFullName == serviceFullName ).ToList() ) { var reference = new MockServiceReferenceInfo( psr.Plugin, s, psr.Requirement ); psr.Plugin.InternalServiceReferences.Add( reference ); pendingServiceReferences.Remove( psr ); } }
/// <summary> /// Set an existing plugin's dependency to an existing service. /// </summary> /// <param name="plugin">Plugin</param> /// <param name="service">Service the plugin depends on</param> /// <param name="runningRequirement">How the plugin depends on the service</param> internal void SetPluginDependency( PluginInfo plugin, ServiceInfo service, DependencyRequirement runningRequirement ) { Debug.Assert( plugin != null ); Debug.Assert( service != null ); Debug.Assert( ServiceInfos.Contains( service ) ); Debug.Assert( PluginInfos.Contains( plugin ) ); MockServiceReferenceInfo reference = new MockServiceReferenceInfo( plugin, service, runningRequirement ); plugin.InternalServiceReferences.Add( reference ); }