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));
    }
示例#5
0
        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);
        }