Exemple #1
0
        public IEnumerable <ContributorCall> GenerateCallGraph(IEnumerable <IPipelineContributor> contributors)
        {
            contributors = contributors.ToList();

            var bootstrapper =
                contributors
                .OfType <KnownStages.IBegin>()
                .SingleOrDefault() ?? throw new InvalidOperationException("No IBegin contributor found.");

            var nodes = new List <TopologicalNode <ContributorNotification> >();

            foreach (var contributor in contributors.Where(x => x != bootstrapper))
            {
                var contributorBuilder = new ContributorInitializer(contributors);
                var builder            = new CompatibilityContributorInitializer(contributorBuilder);

                contributor.Initialize(builder);

                nodes.AddRange(
                    contributorBuilder.ContributorRegistrations
                    .DefaultIfEmpty(new Notification(
                                        Middleware.IdentitySingleTap,
                                        contributorBuilder.Contributors))
                    .Select(reg => new TopologicalNode <ContributorNotification>(
                                new ContributorNotification(contributor, reg))));
            }

            foreach (var notificationNode in nodes)
            {
                foreach (var afterType in notificationNode.Item.Notification.AfterTypes)
                {
                    var parents = GetCompatibleNodes(nodes, notificationNode, afterType);
                    notificationNode.Dependencies.AddRange(parents);
                }

                foreach (var beforeType in notificationNode.Item.Notification.BeforeTypes)
                {
                    var children = GetCompatibleNodes(nodes, notificationNode, beforeType);
                    foreach (var child in children)
                    {
                        child.Dependencies.Add(notificationNode);
                    }
                }
            }

            var rootItem = new ContributorNotification(bootstrapper,
                                                       new Notification(Middleware.IdentitySingleTap, contributors));

            return(new TopologicalTree <ContributorNotification>(rootItem, nodes).Nodes
                   .Select(
                       n => new ContributorCall(n.Item.Contributor, n.Item.Notification.Target, n.Item.Notification.Description)));
        }
      public IEnumerable<ContributorCall> GenerateCallGraph(IEnumerable<IPipelineContributor> contributors)
    {
      contributors = contributors.ToList();

      var bootstrapper = contributors.OfType<KnownStages.IBegin>().Single();
      var nodes = new List<TopologicalNode<ContributorNotification>>();

      foreach (var contributor in contributors.Where(x => x != bootstrapper))
      {
        var builder = new PipelineBuilder(contributors);
        builder.ContributorRegistrations.Clear();

        contributor.Initialize(builder);

        nodes.AddRange(
          builder.ContributorRegistrations
              .DefaultIfEmpty(new Notification(
                  Middleware.IdentitySingleTap,
                  builder.Contributors))
              .Select(reg => new TopologicalNode<ContributorNotification>(
                  new ContributorNotification(contributor, reg))));
      }

      foreach (var notificationNode in nodes)
      {
        foreach (var afterType in notificationNode.Item.Notification.AfterTypes)
        {
          var parents = GetCompatibleNodes(nodes, notificationNode, afterType);
          notificationNode.Dependencies.AddRange(parents);
        }

        foreach (var beforeType in notificationNode.Item.Notification.BeforeTypes)
        {
          var children = GetCompatibleNodes(nodes, notificationNode, beforeType);
          foreach (var child in children)
          {
            child.Dependencies.Add(notificationNode);
          }
        }
      }

      var rootItem = new ContributorNotification(bootstrapper,
          new Notification(Middleware.IdentitySingleTap, contributors));

      return new TopologicalTree<ContributorNotification>(rootItem, nodes).Nodes
        .Select(
          n => new ContributorCall(n.Item.Contributor, n.Item.Notification.Target, n.Item.Notification.Description));
    }
        public IEnumerable<ContributorCall> GenerateCallGraph(PipelineRunner pipelineRunner)
        {
            var bootstrapper = pipelineRunner.Contributors.OfType<KnownStages.IBegin>().Single();
            var nodes = new List<DependencyNodeV2<ContributorNotification>>();

            foreach (var contributor in pipelineRunner.Contributors.Where(x => x != bootstrapper))
            {
                pipelineRunner.NotificationRegistrations.Clear();

                using (pipelineRunner.PipelineLog.Operation(pipelineRunner, "Initializing contributor {0}.".With(contributor.GetType().Name)))
                {
                    contributor.Initialize(pipelineRunner);
                }

                foreach (var reg in pipelineRunner.NotificationRegistrations.DefaultIfEmpty(new Notification(pipelineRunner, null)))
                {
                    nodes.Add(new DependencyNodeV2<ContributorNotification>(new ContributorNotification(contributor, reg)));
                }
            }

            foreach (var notificationNode in nodes)
            {
                foreach (var afterType in notificationNode.Item.Notification.AfterTypes)
                {
                    var parents = GetCompatibleNodes(nodes, notificationNode, afterType);
                    notificationNode.Dependencies.AddRange(parents);
                }

                foreach (var beforeType in notificationNode.Item.Notification.BeforeTypes)
                {
                    var children = GetCompatibleNodes(nodes, notificationNode, beforeType);
                    foreach (var child in children)
                    {
                        child.Dependencies.Add(notificationNode);
                    }
                }
            }

            var rootItem = new ContributorNotification(bootstrapper, new Notification(pipelineRunner, null));

            return new DependencyGraph<ContributorNotification>(rootItem, nodes).Nodes
                .Select(n => new ContributorCall(n.Item.Contributor, n.Item.Notification.Target, n.Item.Notification.Description));
        }
        public IEnumerable <ContributorCall> GenerateCallGraph(PipelineRunner pipelineRunner)
        {
            var bootstrapper = pipelineRunner.Contributors.OfType <KnownStages.IBegin>().Single();
            var nodes        = new List <DependencyNodeV2 <ContributorNotification> >();

            foreach (var contributor in pipelineRunner.Contributors.Where(x => x != bootstrapper))
            {
                pipelineRunner.NotificationRegistrations.Clear();

                using (pipelineRunner.PipelineLog.Operation(pipelineRunner, "Initializing contributor {0}.".With(contributor.GetType().Name)))
                {
                    contributor.Initialize(pipelineRunner);
                }

                foreach (var reg in pipelineRunner.NotificationRegistrations.DefaultIfEmpty(new Notification(pipelineRunner, null)))
                {
                    nodes.Add(new DependencyNodeV2 <ContributorNotification>(new ContributorNotification(contributor, reg)));
                }
            }

            foreach (var notificationNode in nodes)
            {
                foreach (var afterType in notificationNode.Item.Notification.AfterTypes)
                {
                    var parents = GetCompatibleNodes(nodes, notificationNode, afterType);
                    notificationNode.Dependencies.AddRange(parents);
                }

                foreach (var beforeType in notificationNode.Item.Notification.BeforeTypes)
                {
                    var children = GetCompatibleNodes(nodes, notificationNode, beforeType);
                    foreach (var child in children)
                    {
                        child.Dependencies.Add(notificationNode);
                    }
                }
            }

            var rootItem = new ContributorNotification(bootstrapper, new Notification(pipelineRunner, null));

            return(new DependencyGraph <ContributorNotification>(rootItem, nodes).Nodes
                   .Select(n => new ContributorCall(n.Item.Contributor, n.Item.Notification.Target, n.Item.Notification.Description)));
        }