1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.lifecycle.internal.builder.multithreaded;
20
21 import java.util.ArrayList;
22 import java.util.HashSet;
23 import java.util.LinkedHashSet;
24 import java.util.List;
25 import java.util.Set;
26 import org.apache.maven.execution.ProjectDependencyGraph;
27 import org.apache.maven.lifecycle.internal.ProjectBuildList;
28 import org.apache.maven.lifecycle.internal.ProjectSegment;
29 import org.apache.maven.project.MavenProject;
30
31
32
33
34
35
36
37
38
39
40 public class ConcurrencyDependencyGraph {
41
42 private final ProjectBuildList projectBuilds;
43
44 private final ProjectDependencyGraph projectDependencyGraph;
45
46 private final Set<MavenProject> finishedProjects = new HashSet<>();
47
48 public ConcurrencyDependencyGraph(ProjectBuildList projectBuilds, ProjectDependencyGraph projectDependencyGraph) {
49 this.projectDependencyGraph = projectDependencyGraph;
50 this.projectBuilds = projectBuilds;
51 }
52
53 public int getNumberOfBuilds() {
54 return projectBuilds.size();
55 }
56
57
58
59
60
61
62 public List<MavenProject> getRootSchedulableBuilds() {
63 Set<MavenProject> result = new LinkedHashSet<>();
64 for (ProjectSegment projectBuild : projectBuilds) {
65 if (projectDependencyGraph
66 .getUpstreamProjects(projectBuild.getProject(), false)
67 .isEmpty()) {
68 result.add(projectBuild.getProject());
69 }
70 }
71 return new ArrayList<>(result);
72 }
73
74
75
76
77
78
79
80 public List<MavenProject> markAsFinished(MavenProject mavenProject) {
81 finishedProjects.add(mavenProject);
82 return getSchedulableNewProcesses(mavenProject);
83 }
84
85 private List<MavenProject> getSchedulableNewProcesses(MavenProject finishedProject) {
86 List<MavenProject> result = new ArrayList<>();
87
88 for (MavenProject dependentProject : projectDependencyGraph.getDownstreamProjects(finishedProject, false)) {
89 final List<MavenProject> upstreamProjects =
90 projectDependencyGraph.getUpstreamProjects(dependentProject, false);
91 if (finishedProjects.containsAll(upstreamProjects)) {
92 result.add(dependentProject);
93 }
94 }
95 return result;
96 }
97
98
99
100
101 public Set<MavenProject> getUnfinishedProjects() {
102 Set<MavenProject> unfinished = new HashSet<>(projectBuilds.getProjects());
103 unfinished.removeAll(finishedProjects);
104 return unfinished;
105 }
106
107
108
109
110 protected Set<MavenProject> getFinishedProjects() {
111 return finishedProjects;
112 }
113
114 protected ProjectBuildList getProjectBuilds() {
115 return projectBuilds;
116 }
117
118
119
120
121
122
123
124 protected List<MavenProject> getDependencies(MavenProject p) {
125 return projectDependencyGraph.getUpstreamProjects(p, false);
126 }
127
128
129
130
131
132
133
134 public List<MavenProject> getActiveDependencies(MavenProject p) {
135 List<MavenProject> activeDependencies = projectDependencyGraph.getUpstreamProjects(p, false);
136 activeDependencies.removeAll(finishedProjects);
137 return activeDependencies;
138 }
139 }