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