protected void UpdateItem(IYodiiItemData d, DelayedPropertyNotification notifier) { Debug.Assert(d.DynamicStatus != null); bool wasRunning = _runningStatus >= RunningStatus.Running; var prevFinalSolvedConfig = FinalConfigSolvedStatus; _capability.UpdateFrom(d.FinalConfigSolvedStatus, d.FinalStartableStatus, notifier); notifier.Update(this, ref _disabledReason, d.DisabledReason, () => DisabledReason); notifier.Update(this, ref _runningStatus, d.DynamicStatus.Value, () => RunningStatus); notifier.Update(this, ref _configOriginalStatus, d.ConfigOriginalStatus, () => ConfigOriginalStatus); notifier.Update(this, ref _configSolvedStatus, d.ConfigSolvedStatus, () => WantedConfigSolvedStatus); notifier.Update(this, ref _configOriginalImpact, d.ConfigOriginalImpact, () => ConfigOriginalImpact); notifier.Update(this, ref _configSolvedImpact, d.RawConfigSolvedImpact, () => ConfigSolvedImpact); if (wasRunning != (_runningStatus >= RunningStatus.Running)) { notifier.Notify(this, () => IsRunning); } if (prevFinalSolvedConfig != FinalConfigSolvedStatus) { notifier.Notify(this, () => FinalConfigSolvedStatus); } }
internal void Bind(PluginData p, Func <string, LiveServiceInfo> serviceFinder, DelayedPropertyNotification notifier) { Debug.Assert(_pluginInfo == p.PluginInfo); var newService = p.Service != null?serviceFinder(p.Service.ServiceInfo.ServiceFullName) : null; notifier.Update(this, ref _service, newService, () => Service); }
internal void UpdateFrom(PluginData p, DelayedPropertyNotification notifier) { Debug.Assert(FullName == p.PluginInfo.PluginFullName); UpdateItem(p, notifier); notifier.Update(this, ref _pluginInfo, p.PluginInfo, () => PluginInfo); }
internal void UpdateFrom(SolvedConfigurationStatus finalConfigStatus, FinalConfigStartableStatus s, DelayedPropertyNotification notifier) { AllFlags newOne = new AllFlags(finalConfigStatus, s); notifier.Update(this, ref _flags.CanStop, newOne.CanStop, () => CanStop); notifier.Update(this, ref _flags.CanStart, newOne.CanStart, () => CanStart); notifier.Update(this, ref _flags.CanStartWithFullStart, newOne.CanStartWithFullStart, () => CanStartWithFullStart); notifier.Update(this, ref _flags.CanStartWithStartRecommended, newOne.CanStartWithStartRecommended, () => CanStartWithStartRecommended); notifier.Update(this, ref _flags.CanStartWithStopOptionalAndRunnable, newOne.CanStartWithStopOptionalAndRunnable, () => CanStartWithStopOptionalAndRunnable); notifier.Update(this, ref _flags.CanStartWithFullStop, newOne.CanStartWithFullStop, () => CanStartWithFullStop); }
internal void UpdateFrom(IConfigurationSolver solver) { // 1 - Removes existing items from live info that do not exist anymore in the new running context. // This raises Collection "item removed" events. // _services.RemoveWhereAndReturnsRemoved(s => solver.FindService(s.ServiceInfo.ServiceFullName) == null).Count(); _plugins.RemoveWhereAndReturnsRemoved(p => solver.FindPlugin(p.PluginInfo.PluginFullName) == null).Count(); DelayedPropertyNotification notifier = new DelayedPropertyNotification(); // 2 - Builds two lists of new Services and new Plugins and for already existing ones, // updates them with the new information. // This update does not trigger any ProprtyChanged events and consider only // direct properties of the object. // Changes to linked items (such as a Generalization reference for instance will be // done later thanks to their Bind method. // List <LiveServiceInfo> servicesToAdd = new List <LiveServiceInfo>(); foreach (var s in solver.AllServices) { LiveServiceInfo ls = _services.GetByKey(s.ServiceInfo.ServiceFullName); if (ls == null) { servicesToAdd.Add(new LiveServiceInfo(s, _engine)); } else { ls.UpdateFrom(s, notifier); } } List <LivePluginInfo> pluginsToAdd = new List <LivePluginInfo>(); foreach (var p in solver.AllPlugins) { LivePluginInfo lp = _plugins.GetByKey(p.PluginInfo.PluginFullName); if (lp == null) { pluginsToAdd.Add(new LivePluginInfo(p, _engine)); } else { lp.UpdateFrom(p, notifier); } } // 3 - Intrinsic properties have been updated. We now consider the properties that reference other items. // Func <string, LiveServiceInfo> serviceFinder = name => _services.GetByKey(name) ?? servicesToAdd.First(ls => ls.ServiceInfo.ServiceFullName == name); Func <string, LivePluginInfo> pluginFinder = id => _plugins.GetByKey(id) ?? pluginsToAdd.First(lp => lp.PluginInfo.PluginFullName == id); using (notifier.SilentMode()) { foreach (var ls in servicesToAdd) { ls.Bind(solver.FindExistingService(ls.ServiceInfo.ServiceFullName), serviceFinder, pluginFinder, notifier); } } foreach (var ls in _services) { ls.Bind(solver.FindExistingService(ls.ServiceInfo.ServiceFullName), serviceFinder, pluginFinder, notifier); } using (notifier.SilentMode()) { foreach (var lp in pluginsToAdd) { lp.Bind(solver.FindExistingPlugin(lp.PluginInfo.PluginFullName), serviceFinder, notifier); } } foreach (var lp in _plugins) { lp.Bind(solver.FindExistingPlugin(lp.PluginInfo.PluginFullName), serviceFinder, notifier); } // 4 - It is time to add the new comers: this raises Collection changed "item added" events. foreach (var ls in servicesToAdd) { _services.Add(ls); } foreach (var lp in pluginsToAdd) { _plugins.Add(lp); } // 5 - Raises all PropertyChanged events for all objects. notifier.RaiseEvents(); }
internal void Bind(ServiceData s, Func <string, LiveServiceInfo> serviceFinder, Func <string, LivePluginInfo> pluginFinder, DelayedPropertyNotification notifier) { var newGeneralization = s.Generalization != null?serviceFinder(s.Generalization.ServiceInfo.ServiceFullName) : null; notifier.Update(this, ref _generalization, newGeneralization, () => Generalization); var familyRunning = s.Family.DynRunningPlugin; Debug.Assert(IsRunning == (familyRunning != null && s.IsGeneralizationOf(familyRunning.Service))); ILivePluginInfo newRunningPlugin = null; if (IsRunning) { newRunningPlugin = pluginFinder(familyRunning.PluginInfo.PluginFullName); } if (_runningPlugin != null) { notifier.Update(this, ref _lastRunningPlugin, _runningPlugin, () => LastRunningPlugin); } notifier.Update(this, ref _runningPlugin, newRunningPlugin, () => RunningPlugin); }
internal void UpdateFrom(ServiceData s, DelayedPropertyNotification notifier) { UpdateItem(s, notifier); notifier.Update(this, ref _serviceInfo, s.ServiceInfo, () => ServiceInfo); }