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