public IEnumerable<ContributorCall> GenerateCallGraph(PipelineRunner pipelineRunner) { var bootstrapper = pipelineRunner.Contributors.OfType<KnownStages.IBegin>().Single(); var tree = new DependencyTree<ContributorNotification>( new ContributorNotification(bootstrapper, new Notification(pipelineRunner, null))); foreach (var contrib in pipelineRunner.Contributors.Where(x => x != bootstrapper)) { pipelineRunner.NotificationRegistrations.Clear(); using (pipelineRunner.PipelineLog.Operation(pipelineRunner, "Initializing contributor {0}.".With(contrib.GetType().Name))) contrib.Initialize(pipelineRunner); foreach (var reg in pipelineRunner.NotificationRegistrations.DefaultIfEmpty(new Notification(pipelineRunner, null))) { tree.CreateNode(new ContributorNotification(contrib, reg)); } } foreach (var notificationNode in tree.Nodes) { foreach (var parentNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.AfterTypes)) parentNode.ChildNodes.Add(notificationNode); foreach (var childNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.BeforeTypes)) childNode.ParentNodes.Add(notificationNode); } return tree.GetCallGraph().Select(x => new ContributorCall(x.Value.Contributor, x.Value.Notification.Target, x.Value.Notification.Description)); }
public IEnumerable <ContributorCall> GenerateCallGraph(IEnumerable <IPipelineContributor> contributors) { var contribList = contributors.ToList(); var bootstrapper = contribList.OfType <KnownStages.IBegin>().SingleOrDefault(); bool isSyntheticBootstrap = false; if (bootstrapper == null) { bootstrapper = new BootstrapperContributor(); contribList.Add(bootstrapper); isSyntheticBootstrap = true; } contributors = contribList; var tree = new DependencyTree <ContributorInvocation>(); foreach (var node in new ContributorBuilder().Build(contributors)) { tree.CreateNode(node); } var rootNode = tree.Nodes.First(n => n.Value.Owner is KnownStages.IBegin); foreach (var notificationNode in tree.Nodes) { foreach (var parentNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.AfterTypes)) { parentNode.ChildNodes.Add(notificationNode); } foreach (var childNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.BeforeTypes)) { childNode.ParentNodes.Add(notificationNode); } } return(tree .GetCallGraph(rootNode) .Where(n => !isSyntheticBootstrap || n.Value.Owner != bootstrapper) .Select(x => new ContributorCall( x.Value.Owner, x.Value.Target, x.Value.Description))); }
public IEnumerable <ContributorCall> GenerateCallGraph(IEnumerable <IPipelineContributor> contributors) { contributors = contributors.ToList(); var bootstrapper = contributors.OfType <KnownStages.IBegin>().Single(); var tree = new DependencyTree <ContributorNotification>( new ContributorNotification(bootstrapper, new Notification(Middleware.IdentitySingleTap, contributors))); foreach (var contrib in contributors.Where(x => x != bootstrapper)) { var builder = new PipelineBuilder(contributors); builder.ContributorRegistrations.Clear(); contrib.Initialize(builder); var contributorRegistrations = builder.ContributorRegistrations.DefaultIfEmpty(new Notification(Middleware.IdentitySingleTap, contributors)).ToList(); foreach (var registration in contributorRegistrations) { tree.CreateNode(new ContributorNotification(contrib, registration)); } } foreach (var notificationNode in tree.Nodes) { foreach (var parentNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.AfterTypes)) { parentNode.ChildNodes.Add(notificationNode); } foreach (var childNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.BeforeTypes)) { childNode.ParentNodes.Add(notificationNode); } } return (tree.GetCallGraph() .Select( x => new ContributorCall(x.Value.Contributor, x.Value.Notification.Target, x.Value.Notification.Description))); }
public IEnumerable<ContributorCall> GenerateCallGraph(IEnumerable<IPipelineContributor> contributors) { contributors = contributors.ToList(); var bootstrapper = contributors.OfType<KnownStages.IBegin>().Single(); var tree = new DependencyTree<ContributorNotification>( new ContributorNotification(bootstrapper, new Notification(Middleware.IdentitySingleTap, contributors))); foreach (var contrib in contributors.Where(x => x != bootstrapper)) { var builder = new PipelineBuilder(contributors); builder.ContributorRegistrations.Clear(); contrib.Initialize(builder); var contributorRegistrations = builder.ContributorRegistrations.DefaultIfEmpty(new Notification(Middleware.IdentitySingleTap, contributors)).ToList(); foreach (var registration in contributorRegistrations) { tree.CreateNode(new ContributorNotification(contrib, registration)); } } foreach (var notificationNode in tree.Nodes) { foreach (var parentNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.AfterTypes)) parentNode.ChildNodes.Add(notificationNode); foreach (var childNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.BeforeTypes)) childNode.ParentNodes.Add(notificationNode); } return tree.GetCallGraph() .Select( x => new ContributorCall(x.Value.Contributor, x.Value.Notification.Target, x.Value.Notification.Description)); }
IEnumerable <ContributorCall> GenerateCallGraph() { var bootstrapper = _contributors.OfType <KnownStages.IBegin>().Single(); var tree = new DependencyTree <ContributorNotification>( new ContributorNotification(bootstrapper, new Notification(this, null))); foreach (var contrib in _contributors.Where(x => x != bootstrapper)) { _notificationRegistrations.Clear(); using (PipelineLog.Operation(this, "Initializing contributor {0}.".With(contrib.GetType().Name))) contrib.Initialize(this); foreach (var reg in _notificationRegistrations.DefaultIfEmpty(new Notification(this, null))) { tree.CreateNode(new ContributorNotification(contrib, reg)); } } foreach (var notificationNode in tree.Nodes) { foreach (var parentNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.AfterTypes)) { parentNode.ChildNodes.Add(notificationNode); } foreach (var childNode in GetCompatibleTypes(tree, notificationNode, notificationNode.Value.Notification.BeforeTypes)) { childNode.ParentNodes.Add(notificationNode); } } var graph = tree.GetCallGraph().Select(x => new ContributorCall(x.Value.Contributor, x.Value.Notification.Target, x.Value.Notification.Description)); LogContributorCallChainCreated(graph); return(graph); }