Skip to content

Commit 0a6bbb8

Browse files
gnodetmichael-o
authored andcommitted
[MNG-7235] Speed improvements when calculating the sorted project graph
This closes #530
1 parent 8882a9c commit 0a6bbb8

File tree

1 file changed

+41
-8
lines changed

1 file changed

+41
-8
lines changed

maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
import java.util.ArrayList;
2323
import java.util.Collection;
2424
import java.util.Collections;
25+
import java.util.Comparator;
26+
import java.util.HashMap;
2527
import java.util.HashSet;
2628
import java.util.List;
29+
import java.util.Map;
2730
import java.util.Objects;
2831
import java.util.Set;
2932

@@ -42,9 +45,13 @@ public class DefaultProjectDependencyGraph
4245
implements ProjectDependencyGraph
4346
{
4447

45-
private ProjectSorter sorter;
48+
private final ProjectSorter sorter;
4649

47-
private List<MavenProject> allProjects;
50+
private final List<MavenProject> allProjects;
51+
52+
private final Map<MavenProject, Integer> order;
53+
54+
private final Map<String, MavenProject> projects;
4855

4956
/**
5057
* Creates a new project dependency graph based on the specified projects.
@@ -59,6 +66,16 @@ public DefaultProjectDependencyGraph( Collection<MavenProject> projects )
5966
super();
6067
this.allProjects = Collections.unmodifiableList( new ArrayList<>( projects ) );
6168
this.sorter = new ProjectSorter( projects );
69+
List<MavenProject> sorted = this.sorter.getSortedProjects();
70+
this.order = new HashMap<>( sorted.size() );
71+
this.projects = new HashMap<>( sorted.size() );
72+
int index = 0;
73+
for ( MavenProject project : sorted )
74+
{
75+
String id = ProjectSorter.getId( project );
76+
this.projects.put( id, project );
77+
this.order.put( project, index++ );
78+
}
6279
}
6380

6481
/**
@@ -78,6 +95,16 @@ public DefaultProjectDependencyGraph( final List<MavenProject> allProjects,
7895
super();
7996
this.allProjects = Collections.unmodifiableList( new ArrayList<>( allProjects ) );
8097
this.sorter = new ProjectSorter( projects );
98+
List<MavenProject> sorted = this.sorter.getSortedProjects();
99+
this.order = new HashMap<>( sorted.size() );
100+
this.projects = new HashMap<>( sorted.size() );
101+
int index = 0;
102+
for ( MavenProject project : sorted )
103+
{
104+
String id = ProjectSorter.getId( project );
105+
this.projects.put( id, project );
106+
this.order.put( project, index++ );
107+
}
81108
}
82109

83110
/**
@@ -140,15 +167,13 @@ private void getUpstreamProjects( String projectId, Collection<String> projectId
140167
private List<MavenProject> getSortedProjects( Set<String> projectIds )
141168
{
142169
List<MavenProject> result = new ArrayList<>( projectIds.size() );
143-
144-
for ( MavenProject mavenProject : sorter.getSortedProjects() )
170+
for ( String projectId : projectIds )
145171
{
146-
if ( projectIds.contains( ProjectSorter.getId( mavenProject ) ) )
147-
{
148-
result.add( mavenProject );
149-
}
172+
result.add( projects.get( projectId ) );
150173
}
151174

175+
Collections.sort( result, new MavenProjectComparator() );
176+
152177
return result;
153178
}
154179

@@ -158,4 +183,12 @@ public String toString()
158183
return sorter.getSortedProjects().toString();
159184
}
160185

186+
private class MavenProjectComparator implements Comparator<MavenProject>
187+
{
188+
@Override
189+
public int compare( MavenProject o1, MavenProject o2 )
190+
{
191+
return order.get( o1 ) - order.get( o2 );
192+
}
193+
}
161194
}

0 commit comments

Comments
 (0)