Package hudson.model

Class DependencyGraph

  • All Implemented Interfaces:

    public class DependencyGraph
    extends Object
    implements Comparator<AbstractProject>
    Maintains the build dependencies between AbstractProjects for efficient dependency computation.

    The "master" data of dependencies are owned/persisted/maintained by individual AbstractProjects, but because of that, it's relatively slow to compute backward edges.

    This class builds the complete bi-directional dependency graph by collecting information from all AbstractProjects.

    Once built, DependencyGraph is immutable, and every time there's a change (which is relatively rare), a new instance will be created. This eliminates the need of synchronization.

    Kohsuke Kawaguchi
    See Also:
    • Constructor Detail

      • DependencyGraph

        public DependencyGraph()
        Builds the dependency graph.
    • Method Detail

      • build

        public void build()
      • putComputationalData

        public <T> void putComputationalData​(Class<T> key,
                                             T value)
        Adds data which is useful for the time when the dependency graph is built up. All this data will be cleaned once the dependency graph creation has finished.
      • getComputationalData

        public <T> T getComputationalData​(Class<T> key)
        Gets temporary data which is needed for building up the dependency graph.
      • getDownstream

        public List<AbstractProject> getDownstream​(AbstractProject p)
        Gets all the immediate downstream projects (IOW forward edges) of the given project.
        can be empty but never null.
      • getUpstream

        public List<AbstractProject> getUpstream​(AbstractProject p)
        Gets all the immediate upstream projects (IOW backward edges) of the given project.
        can be empty but never null.
      • addDependency

        public void addDependency​(DependencyGraph.Dependency dep)
        Called during the dependency graph build phase to add a dependency edge.
      • addDependencyDeclarers

        public void addDependencyDeclarers​(AbstractProject upstream,
                                           Collection<?> possibleDependecyDeclarers)
        Lists up DependencyDeclarer from the collection and let them builds dependencies.
      • hasIndirectDependencies

        public boolean hasIndirectDependencies​(AbstractProject src,
                                               AbstractProject dst)
        Returns true if a project has a non-direct dependency to another project.

        A non-direct dependency is a path of dependency "edge"s from the source to the destination, where the length is greater than 1.

      • getTransitiveUpstream

        public Set<AbstractProject> getTransitiveUpstream​(AbstractProject src)
        Gets all the direct and indirect upstream dependencies of the given project.
      • getTransitiveDownstream

        public Set<AbstractProject> getTransitiveDownstream​(AbstractProject src)
        Gets all the direct and indirect downstream dependencies of the given project.
      • getTopologicallySorted

        public List<AbstractProject<?,​?>> getTopologicallySorted()
        Returns all the projects in the topological order of the dependency. Intuitively speaking, the first one in the list is the source of the dependency graph, and the last one is the sink.