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