From 7ff53777d05d16ac1e24f8ae55059776ad5e8bc0 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 9 Sep 2021 16:10:25 +0200 Subject: [PATCH] [MNG-7235] Speed improvements when calculating the sorted project graph --- .../graph/DefaultProjectDependencyGraph.java | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java b/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java index e0067f1fe4ae..71cac01b62fb 100644 --- a/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java +++ b/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java @@ -22,8 +22,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; @@ -42,9 +45,13 @@ public class DefaultProjectDependencyGraph implements ProjectDependencyGraph { - private ProjectSorter sorter; + private final ProjectSorter sorter; - private List allProjects; + private final List allProjects; + + private final Map order; + + private final Map projects; /** * Creates a new project dependency graph based on the specified projects. @@ -59,6 +66,16 @@ public DefaultProjectDependencyGraph( Collection projects ) super(); this.allProjects = Collections.unmodifiableList( new ArrayList<>( projects ) ); this.sorter = new ProjectSorter( projects ); + this.order = new HashMap<>(); + this.projects = new HashMap<>(); + List sorted = this.sorter.getSortedProjects(); + for ( int index = 0; index < sorted.size(); index++ ) + { + MavenProject project = sorted.get( index ); + String id = ProjectSorter.getId( project ); + this.projects.put( id, project ); + this.order.put( project, index ); + } } /** @@ -78,6 +95,16 @@ public DefaultProjectDependencyGraph( final List allProjects, super(); this.allProjects = Collections.unmodifiableList( new ArrayList<>( allProjects ) ); this.sorter = new ProjectSorter( projects ); + this.order = new HashMap<>(); + this.projects = new HashMap<>(); + List sorted = this.sorter.getSortedProjects(); + for ( int index = 0; index < sorted.size(); index++ ) + { + MavenProject project = sorted.get( index ); + String id = ProjectSorter.getId( project ); + this.projects.put( id, project ); + this.order.put( project, index ); + } } /** @@ -140,15 +167,13 @@ private void getUpstreamProjects( String projectId, Collection projectId private List getSortedProjects( Set projectIds ) { List result = new ArrayList<>( projectIds.size() ); - - for ( MavenProject mavenProject : sorter.getSortedProjects() ) + for ( String projectId : projectIds ) { - if ( projectIds.contains( ProjectSorter.getId( mavenProject ) ) ) - { - result.add( mavenProject ); - } + result.add( projects.get( projectId ) ); } + Collections.sort( result, new MavenProjectComparator() ); + return result; } @@ -158,4 +183,12 @@ public String toString() return sorter.getSortedProjects().toString(); } + private class MavenProjectComparator implements Comparator + { + @Override + public int compare( MavenProject o1, MavenProject o2 ) + { + return order.get( o1 ) - order.get( o2 ); + } + } }